PHP [закрытие] [переопределение времени выполнения метода] Как улучшить эту оболочку - PullRequest
0 голосов
/ 12 сентября 2018

Я написал этот код для переопределения метода объекта:

class A{
    public function foo(){
        echo "foo";
    }
}

$a = new A();
$a->foo = function(){
    echo "don't work";
}
$a->foo();

, но приведенный выше код не работает, я пытался использовать Closure, но он не работал.

, поэтому янаписал этот служебный класс в моем проекте, класс работает, и он работает, как и ожидалось.

class Wrapper
{
    public $wrapped;

    private $binds;
    private $obj;


    public function __construct($obj)
    {
        $this->wrapped = true;
        $this->obj = $obj;
        $this->binds = [];
    }


    public function bind($name, $function){
        $this->binds[$name] = \Closure::bind($function, $this->obj, get_class($this->obj));
    }

    public function __set($name, $value)
    {
        $this->obj->$name = $value;
    }

    public function __get($name)
    {
        if(property_exists($this, $name)){
            return $this->$name;
        }
        return $this->obj->$name;
    }

    public function __isset($name)
    {
        return isset($this->obj->$name);
    }

    public function __unset($name)
    {
        unset($this->obj->$name);
    }

    public function __call($name, $arguments)
    {

        if (array_key_exists($name, $this->binds) ) {
            return call_user_func_array($this->binds[$name], $arguments);
        }
        return call_user_func_array([$this->obj, $name], $arguments);
    }

    public static function __callStatic($name, $arguments)
    {
        return call_user_func_array([get_class($this->obj, $name), $name], $arguments);
    }
}

, но вышеприведенный класс - грязное исправление, так как я могу использовать класс closure илидругой способ сделать то же самое?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...