【发布时间】:2012-11-19 11:35:58
【问题描述】:
我遇到了一个问题,我不确定这只是正常行为还是我写错了什么。我的基类中有一个方法,它通过为该特定类的所有新实例创建代理来将全局过滤器应用于给定类。我打算这样做的方式如下:
- 将
static $global_filter(代理)附加到我要过滤的类,它扩展了基类object - 通过我的加载机制,在新实例化时返回代理而不是实际类(这将屏蔽方法调用并相应地应用过滤器)
但是,我陷入了第 1 步,似乎当我尝试将 static $global_filter 分配给我想要过滤的后代类时,我的基类 object 也得到了相同的分配,这会破坏从它延伸出来的所有其他东西。
相关代码见下方:
class object {
public static $global_filter;
public function _filterGlobal($class, $method, $callback) {
if ( !is_object($class::$global_filter) ) {
$class::$global_filter = new filterable(null);
# Replace the object being called with the new proxy.
}
var_dump($class);
var_dump($class::$global_filter); // `filterable`
var_dump(\core\blueprint\object::$global_filter); // Returns same as line above
die();
return $class::$global_filter->_add($method, $callback);
}
}
$class::$global_filter 和 \core\blueprint\object::$global_filter(基类)都返回相同的实例。而我预计 object::$global_filter 为空。
我没有使用后期静态绑定来保持一致性(单对象过滤器和全局过滤器的非静态调用方式非常相似)。
任何帮助将不胜感激:)
编辑,完整示例
这将是一个具体的类,它扩展了 model,它扩展了 object
<?php
use core\blueprint\model;
class modelMock extends model {
protected $schema = array();
public function method($test) {
return $test;
}
}
这将是另一个对象(例如控制器),它也扩展了object。它将过滤器应用于model 的所有新实例
<?php
use core\blueprint\object;
class objectMock extends object {
public function applyFilters() {
$this->_filterGlobal('core\blueprint\model', 'method', function($self, $chain) {
$chain->params[0] = 'new param'; // adjust the paramters
return $chain->next();
});
}
}
【问题讨论】:
-
我不知道是什么问题。我正在使用类似的东西。我们能看到一个具体的类吗?
-
@iRaS 现在正在拼凑一些东西
-
@iRaS 刚刚在问题中添加了一个示例,谢谢!
标签: php static aop class-hierarchy