Подтвердить что ты не робот

Имя класса конструктора PHP7

У меня есть приложение Laravel 4.2, которое работает с PHP5 без каких-либо проблем. Поскольку я установил новый ящик для бродяг, в котором работает PHP7, появляется ошибка, как только я запускаю модель, где имя функции совпадает с именем класса (функцией отношения) следующим образом:

<?php

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

    use SoftDeletingTrait;

    [...]

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

    [...]    

}

Появляется следующее сообщение об ошибке:

Методы с тем же именем, что и их класс, не будут конструкторами в будущей версии PHP; У участника есть устаревший конструктор (Вид:...)

Так что я не знал до сегодняшнего дня, что в PHP4 методы с тем же именем были contructor класса. Хм. Я действительно плохо программист... Но в этом случае, исходя из моего понимания того, что происходит в PHP7, они исправляют мой отказ, поскольку я никогда не хотел использовать эту функцию в качестве конструктора, поскольку он определяет только отношения "Чувствительность".

Но как я могу избавиться от этого сообщения? Насколько я понимаю, в PHP4 мой код был глючит, но не в PHP7, правильно? Если это не необходимо, я не хочу реорганизовывать эту функцию, поскольку она используется в нескольких местах.

Может кто-нибудь объяснить, что я делаю неправильно, и почему он работал со старыми версиями PHP?

Спасибо!

4b9b3361

Ответ 1

Как я понимаю, в PHP4 мой код был глючит, но не в PHP7, правильно?

Не совсем. Конструкторы в стиле PHP4 по-прежнему работают на PHP7, они просто устарели, и они вызовут устаревшее предупреждение.

Что вы можете сделать, так это определить метод __construct, даже пустой, чтобы метод php4-constructor не вызывался в только что созданный экземпляр класса.

class foo
{
    public function __construct()
    {
        // Constructor 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();

Он работал со старыми версиями PHP просто потому, что конструкторы не получают возвращаемого значения. Каждый раз, когда вы создавали экземпляр участника, вы неявно называете метод participant, что все.

Ответ 2

Конструкторы стиля PHP 4 (методы, которые имеют то же имя, что и класс, в котором они определены) устарели и будут удалены в будущем. PHP 7 будет генерировать E_DEPRECATED, если конструктор PHP 4 является единственным конструктором, определенным внутри класса. Классы, реализующие метод __construct(), не подвержены влиянию.

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

Вы можете сохранить свой старый конструктор, но вам нужно добавить новую конструкцию:

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

    use SoftDeletingTrait;

    [...]

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

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

    [...]    

}