我只是在模拟我正在研究的拦截类。想法是您通过 Intercept 类实例化该类,然后使用该对象,就好像它是您正在拦截的类一样。每次调用该类时都会运行指定的回调。这是代码:
<?php
class Intercept {
protected $class = null;
protected $callback = null;
public function __construct($class, $callback = null) {
$this->class = new $class();
$this->callback = $callback;
}
protected function run_callback() {
$this->callback();
}
public function __get($name) {
$this->run_callback();
return $this->class->$name;
}
public function __set($name, $value) {
$this->run_callback();
return $this->class->$name = $value;
}
public function __isset($name) {
$this->run_callback();
return isset($this->class->$name);
}
public function __unset($name) {
$this->run_callback();
unset($this->class->$name);
}
public function __call($method, $args) {
$this->run_callback();
return call_user_func_array(array($this->class, $method), $args);
}
public function __toString() {
$this->run_callback();
return $this->class;
}
public function __invoke() {
$this->run_callback();
return $this->class();
}
}
class test {
public function hello() {
return 'world';
}
}
$closure = function() {
echo 123;
};
$test=new Intercept('test', $closure);
echo $test->hello();
现在,运行上面的代码应该会显示“world123”。但是由于一些我看不到的奇怪原因,它最终超时了。我在我的本地机器和各种 php 5.4 在线测试站点上进行了尝试。同样的事情也会发生。我已将其缩小到 run_callback() 方法中正在运行的闭包 ($this->callback())。如果我只是删除 $this->callback(),它工作正常。为什么会这样?
编辑,当我写这个问题时,我发现不是:
$this->callback();
这样做将停止超时:
$closure = $this->callback;
$closure();
似乎每次我尝试直接从类属性运行闭包时都会调用 __call 方法。这是预期的行为还是我偶然发现了一个 PHP 错误?