2010-08-12 3 views
11

Я недавно запустил php и задавался вопросом о различиях между __construct() и имел метод с тем же именем, что и класс?__construct() против метода с тем же именем, что и класс

Есть ли причина для его использования? Все, что я могу сделать, это переопределить метод с именем Foo или это то, на что вы предпочитаете?

E.g.

class Foo { 

    function Foo() 
    { 
     echo 'Foo stated<br>'; 
    } 

    function __construct() { 
     echo 'Construct started<br>'; 
    } 
} 

Благодаря

+0

Возможный дубликат [\ _ \ _ construct() vs SameAsClassName() для конструктора в PHP] (http://stackoverflow.com/questions/217618/construct-vs-sameasclassname-for-constructor-in-php) – nawfal

ответ

3

Foo() является php4 способом (устаревшее), __construct() является php5 способом. php сначала будет искать __construct, тогда, если он не будет найден, он будет использовать Foo

+0

Большое вам спасибо. – Joe

7

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

Источник:http://www.php.net/manual/en/language.oop5.decon.php

8

Использование __construct() более новая PHP5 более OOP внимание метод для вызова конструктора. Использование метода с тем же именем, что и класс, является старым устаревшим способом его выполнения, и он не будет функционировать как конструктор PHP 5.3.3 для классов с именами.

От the constructors and destructors page:

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

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

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

0

Имея метод с тем же именем, что и класс, который автоматически вызывается в качестве конструктора является возврат к PHP4, и следует считать устаревшим ... в последней ветви развития PHP, он будет рассматриваться как метод нормального класса. __construct является официально принятым конструктором в PHP5, хотя в текущих версиях он будет возвращаться к методу PHP4, если __construct не существует.

3

Есть ли причина для его использования? Все I может работать, это переопределяет метод с именем Foo или он до , который вы предпочитаете?

Преимущества __construct() становятся понятнее при использовании переименования и наследования. Если вы переименуете класс, вам придется переименовать его конструктор.Ничего особенного, но если класс B наследует от класса А вы могли бы в конечном итоге с:

class B extends A { 
    function B() { 
     parent::A(); 
    } 
} 

Это намного проще и легче поддерживать сделать:

function __construct() { 
    parent::__construct(); 
} 

Теперь, когда вы переименовать класс А, вы не Не забудьте также изменить родительские вызовы во всех его дочерних элементах. Конечно, в вашем коде все еще переименовывается, но, по крайней мере, это не один из них.

Смежные вопросы