Intereting Posts
Проблемы с отображением загруженных изображений в Symfony 2 Префикс MySQL таблиц или многих баз данных MySQL? PHP-анализ, обработка и преобразование некоторого объекта в stdClass Regex PHP – заменить цвета в имени – но только если они в цвете, а не в названиях компаний как добавить арабские буквы в url regex Codeigniter: разрешение загруженных изображений – 600 на веб-сервере, изображения не отображаются на веб-сайте Ошибка с array_search PHP-доступ к внешнему $ var изнутри функции класса Сделать изображение (изображение на изображение) определенной шириной, но неограниченной длиной? Использование строковой переменной $ dsn в качестве параметра в базе данных PDO Как управлять идентификатором в базе данных с японскими символами Mousedown все еще представляет форму, когда она не должна CakePHP 1.3: $ this-> render () vs $ this-> element () PHP / Mysql Order by and Rand () Apple Push Notification Service APNS – Уведомления не поступают

Имя класса конструктора 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?

Благодаря!

Насколько я понимаю, в 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(); } [...] }