2016-07-12 6 views
0

Мне не удается вызвать статическую функцию (с константой) из расширенного класса. Вот мой код:php - вызов статической функции из расширенного класса

(1st file) 
class A 
{       
    function isXSet() 
    { 
     return X; 
    }   
    public static function setX() 
    { 
     define('X', 1); 
    } 
} 

(second file) 

include('/*first file*/'); 
class B extends A 
{   
    A::setX();   
} 

Как я могу это сделать?

+1

Возможный дубликат [вызов родительского статического метода в php] (http://stackoverflow.com/questions/18636171/call-parent-static-method-in-php) – FirstOne

+1

Он должен работать, если вы его вызываете откуда-то. Если вы посмотрите, что 'A :: setX();' просто «летает» (это не внутри метода) ... – FirstOne

+0

@FirstOne - почему этот «летающий арун»? Как я могу это назвать? – Piter

ответ

1

Ваш код здесь

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.

+0

Я думаю, что я shoul дал вам знать, что я хочу сделать - я хочу установить константу из класса B, а не проверять класс A, если установлена ​​постоянная X (тогда do sth) - как я могу сделай это ? – Piter

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