define('anActionType', 1);
$actionTypes = array(anActionType => 'anActionType');
class core {
public $callbacks = array();
public $plugins = array();
public function __construct() {
$this->plugins[] = new admin();
$this->plugins[] = new client();
}
}
abstract class plugin {
public function registerCallback($callbackMethod, $onAction) {
if (!isset($this->callbacks[$onAction]))
$this->callbacks[$onAction] = array();
global $actionTypes;
echo "Calling $callbackMethod in $callbacksClass because we got {$actionTypes[$onAction]}" . PHP_EOL;
// How do I get $callbacksClass?
$this->callbacks[$onAction][] = $callbackMethod;
}
}
class admin extends plugin {
public function __construct() {
$this->registerCallback('onTiny', anActionType);
}
public function onTiny() { echo 'tinyAdmin'; }
}
class client extends plugin {
public function __construct() {
$this->registerCallback('onTiny', anActionType);
}
public function onTiny() { echo 'tinyClient'; }
}
$o = new core();
$callbacksClass
应为管理员或客户端。或者我完全理解不了这一点,应该用另一种方式来解决这个问题?应该注意的是,我只接受不需要将类名作为参数发送到registerCallback方法的答案。
发布于 2010-09-02 02:16:38
$this->callbacks[$onAction][] = $callbackMethod;
$className = get_class($this);
// Call callback method
$className->$callbackMethod();
发布于 2010-09-02 02:37:29
你真的应该这样做:
$this->registerCallback(array($this, 'onTiny'), anActionType);
这就是PHP如何处理对象方法的句柄。
发布于 2021-12-03 15:43:34
在PHP 8+中,你可以使用static::class
而不是get_class($this)
。
这个问题也可以通过PHP Code Sniffer和规则SlevomatCodingStandard.Classes.ModernClassNameReference 自动修复
https://stackoverflow.com/questions/3620923
复制相似问题