2015-06-14 31 views
2

我有一個WordPress插件,帶有2個擴展類Area和Loc,每個擴展類都有一個輔助函數Get。每個類都有table_name的靜態變量。如果我直接調用Loc :: Get($ id),它按預期工作。但是,如果我從Area調用Loc :: Get($ id),它將使用Area中的table_name而不是Location。WordPress PHP擴展類請參考'錯誤'靜態變量

任何人都可以解釋如何解決這個問題嗎?問候,

class _Base { 
    function Get($id) { 
     $instance = new self(); 
     $sql = "SELECT * FROM " . static::$table_name . " WHERE id=$id"; 
     return $sql; 
    } 
} 

class Area extends _Base { 
    static $table_name = "Area"; 
    function getLoc($id) { 
     $sql = Loc::Get($id); 
     return $sql; 
    } 
} 

class Loc extends _Base { 
    static $table_name = "Loc"; 
} 

$sql = Area::Get(1); // -> "SELECT * FROM **Area** WHERE id=1" 

$sql = Loc::Get(1); // -> "SELECT * FROM **Loc** WHERE id=1" 

$sql = $area->GetLoc(1); // -> "SELECT * FROM **Area** WHERE id=1" 
+0

靜態你想閱讀一些關於「後期狀態綁定「(有時也稱爲」後期綁定「)。對於手頭的問題:行爲確實有道理:兩個派生類都定義了相同的靜態變量。在「Area」的範圍內,顯然這個值是「Area」。你調用的方法也在'Area'類的範圍內執行,所以表名將被選中,因爲函數訪問當前範圍中定義的靜態變量。 – arkascha

+0

你到底想要什麼?另外你的預期結果是什麼,請告訴兩者。謝謝 –

+0

@anantkumarsingh我會說你的問題在上面的OP問題中都有明確的答案......他期望使用表名「Loc」,但情況並非如此。 – arkascha

回答

1

我覺得你的問題是你運行非靜態方法Get爲靜態的。當我改變它然後所有開始工作正常。試試我的代碼如下:

<?php 
class _Base { 
    static function Get($id) { 
     $instance = new self(); 
     $sql = "SELECT * FROM " . static::$table_name . " WHERE id=$id"; 
     return $sql; 
    } 
} 

class Area extends _Base { 
    static $table_name = "Area"; 
    function getLoc($id) { 
     return Loc::Get($id); 
    } 
} 

class Loc extends _Base { 
    static $table_name = "Loc"; 
} 

var_dump(Area::Get(1)); 
var_dump(Loc::Get(1)); 
var_dump((new Area)->getLoc(1)); 
0

首先

函數來獲取不會被定義爲 function Get($id) {

$area沒有定義