PHP7 nom de classe du constructeur

J'ai une application Laravel 4.2 qui fonctionne avec PHP5 sans aucun problème. Depuis que J'ai installé une nouvelle boite errante qui exécute PHP7, une erreur apparaît dès que j'exécute un model où le nom d'une fonction est le même que le nom de classe (relationship-function) comme ceci:

<?php

use IlluminateDatabaseEloquentSoftDeletingTrait;

class Participant extends Eloquent
{

    use SoftDeletingTrait;

    [...]

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

    [...]    

}

je reçois le message d'erreur suivant:

Les méthodes avec le même nom que leur classe ne seront pas des constructeurs dans une future version de PHP; le Participant a un constructeur déprécié (Vue. :..)

donc ce que je ne savais pas jusqu'à aujourd'hui c'est que dans les méthodes PHP4 avec le même nom étaient le contructeur d'une classe. Hum. Je suis vraiment un mauvais programmeur... Mais dans ce cas, de ma compréhension de ce qui se passe dans PHP7, ils corrigent un de mes échecs car je n'ai jamais voulu utiliser cette fonction comme un constructeur, car elle ne définit qu'une relation éloquente.

Mais comment puis-je me débarrasser de ce message? Comme je comprends ceci, dans PHP4 mon code était buggy, mais pas dans PHP7, pas vrai? Si pas nécessaire, je ne veux pas de revoir cette fonction, car il est utilisé à plusieurs endroits.

quelqu'un peut-il expliquer ce que je fais mal et pourquoi cela a fonctionné avec les anciennes versions de PHP?

Merci!

20
demandé sur Thomas M. 2016-03-31 20:20:21

2 réponses

D'après ce que j'ai compris, dans PHP4 mon code était buggy, mais pas dans PHP7, Non?

Pas tout à fait. PHP4-style constructeurs continuent à travailler sur PHP7, ils sont simplement dépréciés et ils déclencheront un avertissement déprécié.

Ce que vous pouvez faire est de définir un __construct méthode, même une méthode vide, de sorte que la méthode PHP4-constructor ne sera 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 a fonctionné avec des PHP plus anciens versions simplement parce que les constructeurs n'obtiennent pas de valeur de retour. Chaque fois que vous avez créé une instance Participant, vous appelez implicitement participant méthode, c'est tout.

39
répondu Federkun 2016-12-12 15:03:00

les constructeurs de style PHP 4 (les méthodes qui ont le même nom que la classe dans laquelle elles sont définies) sont dépréciés, 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 garder votre ancien constructeur, mais vous avez besoin d'ajouter une nouvelle construction comme ça:

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

    use SoftDeletingTrait;

    [...]

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

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

    [...]    

}
5
répondu DevLoots 2016-03-31 17:42:12