我有一個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"
靜態你想閱讀一些關於「後期狀態綁定「(有時也稱爲」後期綁定「)。對於手頭的問題:行爲確實有道理:兩個派生類都定義了相同的靜態變量。在「Area」的範圍內,顯然這個值是「Area」。你調用的方法也在'Area'類的範圍內執行,所以表名將被選中,因爲函數訪問當前範圍中定義的靜態變量。 – arkascha
你到底想要什麼?另外你的預期結果是什麼,請告訴兩者。謝謝 –
@anantkumarsingh我會說你的問題在上面的OP問題中都有明確的答案......他期望使用表名「Loc」,但情況並非如此。 – arkascha