我試圖使用this trick從子類訪問基類的私有變量,但我沒有完全理解閉包,所以我遇到了問題。下面的例子幾乎可以工作,除了我綁定到父類的新實例而不是子類的實例。在子類中使用Closure :: bind
class Kitchen
{
private $yummy = 'cake';
public function change_treat()
{
$yummy = 'pie';
}
}
class pantry extends Kitchen
{
public function FindFood()
{
$yum = function()
{
return $this->yummy;
};
$kit = new Kitchen();
$yumers = Closure::bind($yum, $kit, $kit);
echo "Look, a " . $yumers(). "!\n";
}
}
$p = new pantry();
$p->FindFood();
$p->change_treat();
$p->FindFood();
輸出:
Look, a cake!
Look, a cake!
所需的輸出:
Look, a cake!
Look, a pie!
我明白了爲什麼我的代碼輸出cake
兩次。這是因爲我在綁定閉包時創建了一個完全獨立的Kitchen對象。我遇到的麻煩是想知道要通過closure::bind
來說「綁定到我的父母」還是我所做的甚至是可能的。有什麼想法嗎?
謝謝。
編輯:對於那些分享了您對這項技術的關注的人,我知道這破壞了封裝並且不被推薦。目前,這是一個概念證明。情況是我有一個Wordpress插件,它具有我想要擴展的功能。這部分插件沒有掛鉤,所以我試圖找到其他方法來擴展它。其中一個變量是私有的,我需要檢查它以確定是調用父方法還是使用我的自定義邏輯。我知道這聽起來很可疑,我會將其視爲「口香糖和膠帶」的努力。我正計劃向插件開發人員報告我嘗試過的內容,以及可以使插件更易於使用的內容。
糾正這個錯誤[仍然不起作用](http://3v4l.org/MP3Ub)。但是,使用反射[確定](http://3v4l.org/U0R2X)(雖然主要觀點仍然存在:請不要這樣做) – DaveRandom
這適用於如果您使用Closure :: bind($ yum,$ this- >廚房,$ this-> kitchen);.我編輯了這篇文章以反映這一點。我會看看,如果這在我的情況下工作,並接受它,如果它。 – VanillaBean
@VanillaBean對,這就是我的意思,實際上是:) –