Лучший ответ, который я могу найти: http://www.magentocommerce.com/boards/viewthread/76027/#t282659
По сути, класс корневого уровня (от которого наследуются все другие классы) реализует __construct
, который PHP вызывает автоматически при создании класса. Прямо сейчас этот класс корневого уровня просто вызывает _construct
, который содержит реальный код.
Скажем, у вас есть эта настройка:
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
doSomethingReallyImportant();
}
}
class SubClass extends BaseClass {
function __construct() {
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
//"In BaseClass constructor"
//something really important happens
$obj = new SubClass();
//"In SubClass constructor"
//important thing DOESN'T happen
PHP автоматически не вызывает конструкторы родительских классов, поэтому doSomethingReallyImportant
никогда не вызывается. Вы могли бы потребовать, чтобы конструкторы подкласса вызывали parent::__construct()
, но это легко забыть. Таким образом, Magento имеет переопределение подклассов _construct
:
class BaseClass {
function __construct() {
doSomethingReallyImportant();
_construct();
}
function _construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function _construct() {
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
//something really important happens
//"In BaseClass constructor"
$obj = new SubClass();
//something really important happens
//"In SubClass constructor"
PHP не обнаруживает конструктор в SubClass
, поэтому он вызывает конструктор BaseClass
. Это позволяет BaseClass
до doSomethingReallyImportant
перед вызовом переопределенного подкласса _construct
.