Имя класса конструктора 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?
Спасибо!
Ответы
Ответ 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();
}
[...]
}