PHP 相当于朋友或内部

2022-08-30 13:11:04

php中是否有一些等同于“朋友”或“内部”的东西?如果没有,是否有任何模式可以遵循来实现此行为?

编辑:抱歉,标准Php不是我想要的。我正在寻找一些类似于Ringmaster所做的事情。

我有一些课程在后端进行C风格的系统调用,杂耍已经开始变得繁琐。我在对象A中有一些函数,它们将对象B作为参数,并且必须调用对象B中的方法,该方法本身作为参数传递。最终用户可以在 B 中调用该方法,系统将分崩离析。


答案 1

PHP不支持任何类似朋友的声明。可以使用 PHP5 __get和__set方法并仅检查允许的友元类的回溯,尽管执行此操作的代码有点笨拙,但可以模拟此操作。

PHP网站上有一些关于这个主题的示例代码和讨论:

class HasFriends
{
    private $__friends = array('MyFriend', 'OtherFriend');

    public function __get($key)
    {
        $trace = debug_backtrace();
        if(isset($trace[1]['class']) && in_array($trace[1]['class'], $this->__friends)) {
            return $this->$key;
        }

        // normal __get() code here

        trigger_error('Cannot access private property ' . __CLASS__ . '::$' . $key, E_USER_ERROR);
    }

    public function __set($key, $value)
    {
        $trace = debug_backtrace();
        if(isset($trace[1]['class']) && in_array($trace[1]['class'], $this->__friends)) {
            return $this->$key = $value;
        }

        // normal __set() code here

        trigger_error('Cannot access private property ' . __CLASS__ . '::$' . $key, E_USER_ERROR);
    }
}

(代码由tsteiner在nerdclub dot net上证明 bugs.php.net)


答案 2

也可以使用php中的握手和闭包来提升特权,即有选择地泄漏数据 >=5.3.3。

基本上,交互是这样的:类A有一个公共方法,它接受一个B类对象,并调用B->grantAccess(或你的接口定义的任何东西),给它一个闭包。$that=$this的闭包,以及确定允许访问哪些属性所需的任何其他内容。闭包有一个参数 - 要返回的属性;如果它是$that上的一个物业,并且一切都很酷,则关闭返回该属性。否则,它将返回 '',或引发异常,或者可能是默认值。use($that,$anythingelseyouneed)

B->GrantAccesss接受可调用并存储它,在其他方法中使用它来提取关闭允许泄漏的私有财产。将类 B 的默认构造函数设为私有。使用采用 A 类参数的静态工厂方法构造 B,以确保握手发生。

要点:https://gist.github.com/mcamiano/00592fb400e5043d8acd


推荐