Как запретить PHP рассматривать функции с тем же именем класса как конструктор - PullRequest
1 голос
/ 05 декабря 2011

До PHP 5.3.3 следующие

class Same {
    public function same() { echo 'Not good'; } 
}

$c = new Same();

будут выводить Not good.Начиная с 5.3.3+, он не будет выводить строку.Это связано с тем, что в PHP 5.3.3 функции с одинаковым именем класса не считаются конструкторами.Как заставить это поведение даже с PHP 5.3.2 или раньше?

Ответы [ 3 ]

4 голосов
/ 05 декабря 2011

Самый простой способ - просто создать пустой конструктор:

class Same {
    public function same() { echo 'Not good'; } 

    public function __construct() { }
}

$c = new Same();

Это не будет отображать "Not good", так как метод __construct () переопределяет метод "То же имя, что и у класса".

2 голосов
/ 05 декабря 2011

Для обратной совместимости, , если PHP 5 не может найти функцию __construct () для данного класса, он будет искать функцию конструктора старого стиля по имени класса . По сути, это означает, что единственный случай, когда возникнут проблемы совместимости, - это если в классе есть метод с именем __construct (), который использовался для другой семантики.

В отличие от других методов, PHP не будет генерировать сообщение об ошибке уровня E_STRICT, когда __construct () переопределяется с параметрами, отличными от родительского метода __construct ().

Начиная с PHP 5.3.3, методы с тем же именем, что и последний элемент имени класса в пространстве имен, больше не будут рассматриваться как конструктор. Это изменение не влияет на классы без пространства имен.

документы: - http://php.net/manual/en/language.oop5.decon.php

Таким очевидным решением является объявление метода __constructors (даже пустого)

0 голосов
/ 05 декабря 2011

Метод конструирования называется __construct ().Просто вызовите ваш метод same () внутри __construct (), если вы хотите иметь то же имя.
В соответствии с http://php.net/construct php пытается зарезервировать обратную совместимость.На мой взгляд, «одно и то же» имя означает написание имени метода с учетом регистра (как и имя класса).Это тоже должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...