gpt4 book ai didi

PHP - 一直调用

转载 作者:可可西里 更新时间:2023-11-01 13:19:41 26 4
gpt4 key购买 nike

假设我们有一个包含多个 protected 和/或公共(public)方法的类。每次调用方法时我都需要执行检查。我可以在每次调用方法时进行检查:

class Object
{
// Methods
}

$o = new Object();

if($mayAccess) $o->someMethod();

if($mayAccess) $this->someMethod();

但我希望开发人员既不必考虑它也不必编写它。我考虑过使用 __call 来做:

class Object
{
public function __call($methodName, $args)
{
if($mayAccess) call_user_func_array($this->$methodName, $args);
}
}

不幸的是,如果我从类内部调用该方法,__call 将不会被调用,因为它仅在调用不可见方法时才有效。

是否有一种干净的方法来隐藏内部和外部调用的检查?同样,目标是确保开发人员在调用方法时不会忘记这样做。

提前致谢:)

EDIT :

我有另一种方法:

class Object
{
public function __call($methodName, $args)
{
if($mayAccess) call_user_func_array($methodName, $args);
}
}

function someMethod() { }

但我将无法再使用 $this,这意味着没有我确实需要的 protected 方法。

最佳答案

不,我不这么认为。你可以做的是写一个 proxy :

class MayAccessProxy {

private $_obj;

public function __construct($obj) {
$this->_obj = $obj;
}

public function __call($methodName, $args) {
if($mayAccess) call_user_func_array(array($this->_obj, $methodName), $args);
}
}

这意味着您必须为每个要检查的对象实例化一个代理:

$obj = new MayAccessProxy(new Object());
$obj->someMethod();

当然,您还希望代理的行为与对象本身完全一样。所以你还必须定义其他魔术方法。

为了让开发人员更轻松一些,您可以这样做:

class Object {

/**
* Not directly instanciable.
*/
private __construct() {}

/**
* @return self
*/
public static function createInstance() {
$obj = new MayAccessProxy(new self());
return $obj;
}
}

$obj = Object::createInstance();

关于PHP - 一直调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com