在PHP中是否有一些"朋友"或"内部"?如果没有,是否有任何模式可以实现这种行为?
编辑: 对不起,但标准的Php不是我想要的.我正在寻找一些类似于指挥官所做的事情.
我的课程在后端进行C风格的系统调用,杂耍开始变得很麻烦.我在对象A中有函数,它将对象B作为参数接受,并且必须调用对象B中的方法作为参数传递.最终用户可以在B中调用该方法,系统将崩溃.
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)
也可以使用php> = 5.3.3中的握手和闭包来提升特权,即选择性地泄漏数据.
基本上,交互是:类A有一个公共方法,它接受一个B类对象,并调用B-> grantAccess(或你的接口定义的任何东西),并传递一个闭包.封闭use($that,$anythingelseyouneed)
,其中$ that = $ this,以及确定允许访问哪些属性所需的任何其他内容.闭包有一个参数 - 要返回的属性; 如果它是$上的属性并且一切都很酷,则闭包返回属性.否则,它返回'',或抛出异常,或者可能是默认值.
B类> grantAccess接受一个可调用的并存储它,在其他方法中使用它来抽取闭包允许泄漏的私有属性.使B类的默认构造函数成为私有.使用带有A类参数的静态工厂方法构造B,以确保发生握手.
请点击这里:https://gist.github.com/mcamiano/00592fb400e5043d8acd