web-dev-qa-db-fra.com

Nom de classe du constructeur PHP7

J'ai une application Laravel 4.2 qui fonctionne avec PHP5 sans aucun problème. Depuis que j'ai installé une nouvelle boîte de dialogue vagant exécutant PHP7, une erreur apparaît dès que je lance un modèle où le nom d'une fonction est le identique au nom de classe (relation-fonction) comme ceci:

<?php

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

    use SoftDeletingTrait;

    [...]

    public function participant()
    {
        return $this->morphTo();
    }

    [...]    

}

Je reçois le message d'erreur suivant:

Les méthodes portant le même nom que leur classe ne seront pas des constructeurs dans une future version de PHP; Le participant a un constructeur obsolète (View: ...)

Donc, ce que je ne savais pas jusqu'à ce jour, c'est que, dans PHP4, les méthodes portant le même nom étaient le constructeur d'une classe. Hmm. Je suis vraiment un mauvais programmeur ... Mais dans ce cas, si je comprends bien ce qui se passe dans PHP7, ils corrigent un échec car je n’ai jamais voulu utiliser cette fonction en tant que constructeur, car elle ne définit qu’une relation éloquente.

Mais comment puis-je me débarrasser de ce message? Si je comprends bien, en PHP4, mon code était bogué, mais pas en PHP7, non? Si ce n'est pas nécessaire, je ne veux pas refactoriser cette fonction, car elle est utilisée à plusieurs endroits.

Quelqu'un peut-il expliquer ce que je fais mal et pourquoi cela fonctionne avec les anciennes PHP versions?)?

Merci!

26
Thomas M.

Si j'ai bien compris, mon code était buggé en PHP4, mais pas en PHP7, n'est-ce pas?

Pas assez. Les constructeurs de style PHP4 fonctionnent toujours sur PHP7, ils sont tout simplement obsolètes et ils déclencheront un avertissement obsolète.

Ce que vous pouvez faire est de définir un __construct, même vide, pour que la méthode php4-constructor ne soit pas appelée sur une instance nouvellement créée de la classe.

class foo
{
    public function __construct()
    {
        // Constructor's functionality here, if you have any.
    }

    public function foo()
    {
        // PHP4-style constructor.
        // This will NOT be invoked, unless a sub-class that extends `foo` calls it.
        // In that case, call the new-style constructor to keep compatibility.
        self::__construct();
    }
}

new foo();

Cela fonctionnait avec les anciennes PHP versions simplement parce que les constructeurs n’obtiennent pas de valeur de retour. Chaque fois que vous créez une instance de Participant, vous appelez implicitement la méthode participant, c’est tout.

46
Federkun

Les constructeurs de style PHP 4 (les méthodes qui portent le même nom que la classe dans laquelle ils sont définis) sont obsolètes et seront supprimés dans le futur. PHP 7 émettra E_DEPRECATED si un constructeur PHP 4 est le seul constructeur défini dans une classe. Les classes qui implémentent une méthode __construct () ne sont pas affectées.

<?php
    class foo {
        function foo() {
            echo 'I am the constructor';
         }
     }
?>

Vous pouvez conserver votre ancien constructeur mais vous devez ajouter une nouvelle construction comme celle-ci:

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

    use SoftDeletingTrait;

    [...]

    public function __construct()
    {
        return $this->morphTo();
    }

    public function participant()
    {
        return $this->morphTo();
    }

    [...]    

}
7
DevLoots