У меня есть приложение 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?
Благодаря!
Насколько я понимаю, в PHP4 мой код был глючит, но не в PHP7, правильно?
Не совсем. Конструкторы в стиле PHP4 по-прежнему работают на PHP7 , они просто устарели, и они вызовут устаревшее предупреждение.
Что вы можете сделать, так это определить метод __construct
, даже пустой, так что метод php4-constructor не будет вызван в только что созданный экземпляр класса.
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();
Он работал со старыми версиями PHP просто потому, что конструкторы не получают возвращаемого значения. Каждый раз, когда вы создавали экземпляр участника, вы неявно вызываете метод participant
, вот и все.
Конструкторы стиля 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(); } [...] }