Я только начинаю с PHP, и я задаюсь вопросом, существует ли способ добавить анонимную функцию к экземпляру класса.
Например, позволяет, говорят...
class A{
public B;
}
$c = new A();
//This is where I am getting a little confused...
//The following wont work
$c->B = function(){echo('HelloWorld');};
$c->B();
То, что я надеюсь сделать, является повторным использованием та же слюна кода в большом количестве различных приложений, и сделайте его так, чтобы я мог просто 'выгрузка' и заменять функции в определенных экземплярах.
Я использую php5.3 (таким образом, анонимные функции должны работать, просто не в способе, которым я использую их).
Спасибо так очень в течение Вашего времени!!
- GK
Вы можете использовать магическую функцию __ call для этого задания. Не красиво, но работает ..
вот так:
class A {
public $B;
public function __call($closure, $args)
{
call_user_func_array($this->$closure, $args);
}
}
$c = new A();
$c->B = function () { echo('HelloWorld'); };
$c->B();
# real ugly, but PoC...
class a {
function __call($f, $x) {
call_user_func_array($this->$f, $x);
}
}
$a = new a;
$a->b = function() { echo "Hello world"; };
$a->b();
Вы можете сделать что-то в этом роде (что также будет работать с обратными вызовами, не являющимися замыканиями):
<?php
class A {
private $fun;
function setFun($fun) {
if (!is_callable($fun))
throw new InvalidArgumentException();
$this->fun = $fun;
}
public function fun() {
call_user_func_array($this->fun, func_get_args());
}
}
$c = new A();
$c->setFun(function($a) { echo('HelloWorld ' . $a);});
$c->fun("here");
, что дает HelloWorld здесь
.
Тем не менее, вам также следует учитывать наследование или шаблон декоратора .
FWIW:
Обработка анонимных функций в PHP 5.3 занимательна. Это не сработает:
$c->B = function() { echo func_get_arg(0); };
$c->B("This fails :(");
Это БУДЕТ работать:
$c->B = function() { echo func_get_arg(0); };
$hilarious = $c->B;
$hilarious("This works!");
Чтобы обойти это, вам нужно использовать хак __ call
, подобный тому , предоставленному Oden .
Это поведение может измениться в будущем. Разыменование массива RFC было недавно передано в магистраль PHP , и патч вызвал обсуждение цепочки вызовов функций , синтаксис которой может позволить то, что вы пытаемся обойтись без хака __call. К сожалению, в прошлом оказалось трудным заставить работать цепочку вызовов функций.
Похоже, вы описываете шаблон стратегии или шаблон декоратора - есть другие способы для достижения этого таким образом, чтобы легче было общаться с другими разработчиками, читающими ваш код.