Я пытаюсь использовать 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
дважды. Это потому, что я создаю полностью отдельный объект Кубы, когда я связываю закрытие. У меня возникли проблемы с выяснением, что нужно передать в closure::bind
, чтобы сказать «привязаться к моему родителю», или если то, что я делаю, возможно. Есть предположения?
Спасибо.
Редактировать: Для тех из вас, кто поделился вашей озабоченностью по поводу этой техники, я понимаю, что это нарушает инкапсуляцию и не рекомендуется. Пока это доказательство концепции. Ситуация в том, что у меня есть плагин Wordpress, который имеет функциональность, которую я хотел бы расширить. Эта часть плагина не имеет крючков, поэтому я пытаюсь найти другие способы ее расширения. Одна из переменных является частной, и мне нужно проверить ее, чтобы определить, следует ли вызывать родительский метод или использовать мою собственную логику. Я знаю, что это звучит сомнительно, и я буду рассматривать это как попытку «резинки и клейкой ленты». Я планирую сообщить разработчику плагина, что я пробовал, и что может облегчить работу с плагином.
Исправление этой ошибки [все еще не работает] (http://3v4l.org/MP3Ub). Однако, используя рефлексию [делает] (http://3v4l.org/U0R2X) (хотя основное внимание по-прежнему стоит: пожалуйста, не делайте этого) – DaveRandom
Это работает, если вы используете Closure :: bind ($ yum, $ this- > кухня, $ this-> кухня) ;. Я отредактировал сообщение, чтобы это отразить. Я посмотрю, будет ли это работать в моем сценарии и принять его, если это произойдет. – VanillaBean
@ VanillaBean Правильно, вот что я намеревался написать на самом деле :) –