当前位置:  开发笔记 > 编程语言 > 正文

PHP相当于朋友或内部

如何解决《PHP相当于朋友或内部》经验,为你挑选了2个好方法。

在PHP中是否有一些"朋友"或"内部"?如果没有,是否有任何模式可以实现这种行为?

编辑: 对不起,但标准的Php不是我想要的.我正在寻找一些类似于指挥官所做的事情.

我的课程在后端进行C风格的系统调用,杂耍开始变得很麻烦.我在对象A中有函数,它将对象B作为参数接受,并且必须调用对象B中的方法作为参数传递.最终用户可以在B中调用该方法,系统将崩溃.



1> ringmaster..:

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);
    }
}

(代码在nerdclub点净探明通过tsteiner 上bugs.php.net)


这是一个可爱的黑客!我喜欢它,并被它击退.虽然聪明.+1
请记住,必须实现这样的代码可能意味着您在代码/应用程序设计中做出了错误的决定.
@ halfpastfour.am,根本没有.假设我们有一个使用AbstractNode的AVLTree类.我们希望将节点的高度存储在节点本身中,因此我们在节点中公开了一个公共方法'setHeight'.虽然它是公共的,但它不能在AVL树之外使用,因此AVL Tree类应该是AbstractNode的"Friend".

2> jerseyboy..:

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

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

B类> grantAccess接受一个可调用的并存储它,在其他方法中使用它来抽取闭包允许泄漏的私有属性.使B类的默认构造函数成为私有.使用带有A类参数的静态工厂方法构造B,以确保发生握手.

请点击这里:https://gist.github.com/mcamiano/00592fb400e5043d8acd

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有