Ваш код здесь
class B extends A
{
A::setX();
}
немного прочь. Вы не использовали свой вызов внутри метода.
class B extends A
{
public static function doSomething() {
A::setX();
}
}
Это на самом деле ничего не делает с помощью отношения родитель/ребенок. Фактически, после того, как вы определите class A
, вызов A::setX()
может произойти где угодно, поскольку он является общедоступным и статическим. Этот код так же, как действует:
class A
{
function isXSet()
{
return X;
}
public static function setX()
{
define('X', 1);
}
}
class B { // No extending!
function isXSet() {
return A::isXSet();
}
}
То, что вы, скорее всего ищете это parent
вместо:
class A
{
public function isXSet()
{
return X;
}
protected static function setX()
{
define('X', 1);
}
}
class B extends A
{
public static function doSomething() {
parent::setX();
var_dump(parent::isXSet()); // int(1)
}
}
Большой плюс в том, что простирающиеся классы могут получить доступ защищенных методов и свойство от класс parent
. Это означает, что вы можете держать всех остальных в состоянии позвонить A::setX()
, если только вызываемый не был экземпляром или ребенком A
.
Возможный дубликат [вызов родительского статического метода в php] (http://stackoverflow.com/questions/18636171/call-parent-static-method-in-php) – FirstOne
Он должен работать, если вы его вызываете откуда-то. Если вы посмотрите, что 'A :: setX();' просто «летает» (это не внутри метода) ... – FirstOne
@FirstOne - почему этот «летающий арун»? Как я могу это назвать? – Piter