这一切都取决于您的中心班级的角色。根据您的描述,它似乎是一个假脱机程序或调度程序。如果假脱机对象实际上是由该中心类创建的,则可以通过将这些对象设为私有来对客户端隐藏这些对象,然后在中心对象中创建存根,以允许客户端调用您允许的函数。
例如(概念代码,可能无法实际编译)
class HiddenSubClass {
public function MyFunc() {
echo "hello";
}
}
class CentralClass {
private $obj;
function __construct() {
$obj=new HiddenSubClass();
}
function SubClassMyFunc () {
$obj->MyFunc();
}
}
客户端只有 CentralClass 对象,因此只能调用 SubClassMyFunc,而不能调用 MyFunc。这样做的缺点是,这也会对客户端隐藏库的面向对象结构,这可能是可取的,也可能不是。
但是,如果对象是由客户端创建的,然后移交给您的中心类,那么您几乎无法阻止对象的所有者(客户端)对其进行任何操作。客户端可以调用您的中心类可以调用的任何内容。然后,您可能必须将要保护的代码移出所述类 - 进入“帮助类”或中心类本身。
编辑:如果您确实想“破解”它,这将是一种方法(尽管我不推荐它,因为它很臭):
在你的中心班级有一个“秘密”。
class CentralClass {
private $MySecret=42;
function IsValidSecret($anumber) {
return ($anumber==$this->MySecret);
}
}
现在,当中心类在假脱机对象上调用某些“受保护”函数时,可以将 $MySecret 作为参数传递。如果 CentralClass 是单例,则假脱机对象可以调用该单例来检查传递的密钥是否正确。如果 CentralClass 不是单例,您也必须传递该对象。
class MySpooledObject {
function SuperSecretFunction ($asecret) {
if (!$CentralSingleton->isValidSecret($asecret)) { die(); }
}
function SuperSecretFunction2 ($acentralobject,$asecret) {
if (!$acentralobject->isValidSecret($asecret)) { die(); }
}
}
这有很多变化。中心类可以在调用对象的方法之前设置一个内部标志,并在它返回时重置它。在这种情况下,对象可以询问中心类是否设置了该标志,并且不需要传递任何秘密。但是,您仍然需要 $acentralobject,除非它是单例。