__construct() против метода с тем же именем, что и класс
Я недавно запустил php и задавался вопросом о различиях между __construct() и имел метод с тем же именем, что и класс?
Есть ли причина для его использования? Все, что я могу сделать, это переопределить метод с именем Foo или это то, что вам нравится?
например.
class Foo {
function Foo()
{
echo 'Foo stated<br>';
}
function __construct() {
echo 'Construct started<br>';
}
}
Спасибо
Ответы
Ответ 1
Использование __construct()
- это более новый PHP5 метод с большим количеством ООП для вызова конструктора. Использование метода с тем же именем, что и класс, является старым устаревшим способом его выполнения, и он не будет функционировать как конструктор PHP 5.3.3 для классов с именами.
От страница конструкторов и деструкторов:
Для обратной совместимости, если PHP 5 не может найти функцию __construct() для данного класса, он будет искать функцию конструктора старого стиля по имени класса. Фактически это означает, что единственный случай, который имел бы проблемы с совместимостью, заключается в том, что у класса был метод с именем __construct(), который использовался для различной семантики.
В отличие от других методов PHP не генерирует сообщение об ошибке уровня E_STRICT, когда __construct() переопределяется с разными параметрами, чем у родительского метода __construct().
Начиная с PHP 5.3.3, методы с тем же именем, что и последний элемент имени пространства имен, больше не будут рассматриваться как конструктор. Это изменение не влияет на классы, не содержащие имен.
Ответ 2
", если PHP 5 не может найти функцию __construct() для данного класса, он будет искать функцию конструктора старого стиля по имени класса. Фактически это означает, что единственный случай, который имел бы проблемы с совместимостью если класс имеет метод с именем __construct(), который использовался для различной семантики."
Источник: http://www.php.net/manual/en/language.oop5.decon.php
Ответ 3
Foo() является способом php4 (устаревшим), __construct() является способом php5. php сначала ищет __construct, тогда, если он не будет найден, он будет использовать Foo
Ответ 4
Есть ли причина для его использования? Все я может работать, это переопределяет метод с именем Foo или он до который вы предпочитаете?
Преимущества __construct() становятся яснее, когда вы включаете переименование и наследование. Если вы переименуете класс, вам придется переименовать его конструктор. Неважно, но если класс B наследует от класса A, вы можете в итоге:
class B extends A {
function B() {
parent::A();
}
}
Это намного проще и удобнее обслуживать:
function __construct() {
parent::__construct();
}
Теперь, когда вы переименовываете класс A, вам не нужно забывать также изменять родительские вызовы во всех его дочерних элементах. Конечно, в вашем коде все еще переименовывается, но по крайней мере это не один из них.
Ответ 5
Наличие метода с тем же именем, что и класс, который автоматически вызывается как конструктор, является возвратом к PHP4 и считается устаревшим... в последней ветке разработки PHP, он будет рассматриваться как обычный класс способ. __construct является официально принятым конструктором в PHP5, хотя в текущих версиях он будет возвращаться к методу PHP4, если __construct не существует.