Набор php анонимная функция в экземпляре

Я только начинаю с 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

7
задан geekay 13 June 2010 в 21:50
поделиться

5 ответов

Вы можете использовать магическую функцию __ 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();
10
ответ дан 6 December 2019 в 07:50
поделиться
# 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();
4
ответ дан 6 December 2019 в 07:50
поделиться

Вы можете сделать что-то в этом роде (что также будет работать с обратными вызовами, не являющимися замыканиями):

<?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 здесь .

Тем не менее, вам также следует учитывать наследование или шаблон декоратора .

1
ответ дан 6 December 2019 в 07:50
поделиться

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. К сожалению, в прошлом оказалось трудным заставить работать цепочку вызовов функций.

5
ответ дан 6 December 2019 в 07:50
поделиться

Похоже, вы описываете шаблон стратегии или шаблон декоратора - есть другие способы для достижения этого таким образом, чтобы легче было общаться с другими разработчиками, читающими ваш код.

2
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: