2016-07-12 40 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

我想我讓你知道我想做什麼 - 我想從B類設置常量,並且如果在常量X設置的情況下檢查A類(然後執行) - 我怎麼能去做 ? – Piter