PHP限制调用公共方法

时间:2013-02-23 17:17:28

标签: php methods class-visibility

我正在开发一个有很多类的库,这些类都由一个中心类汇集在一起​​。此中心类必须在其他类上调用某些方法以进行设置/配置。这些方法必须是公共的,以便中央类可以调用它们,但我不希望用户调用这些方法(因为它可能会导致不良行为)。

我的一位朋友提出的一个建议是使用带参数的构造函数,可以在构造时完成设置。出于此库的目的,这是不容易的。有问题的类旨在扩展,如果用户想要拥有自己的构造函数,我不想对构造函数参数强加任何奇怪的要求。更复杂的是用户无法使用用于配置的某些信息。我必须让用户可以使用它并相信它们会在构造期间将它路由回适当的类。

目前,我的解决方案是为这些方法添加一些内容,并注意用户不要使用所述前缀调用方法。这是“灵活的”足以让我添加更多受限制的方法,但它仍然假设用户将遵循我的指示。它也不是最优雅的解决方案。

我想知道是否有某种方法可以轻松限制这些方法。我想在它们中添加一行来检查它是否是调用它们的中心类,但这似乎也不是最好的解决方案。

编辑:我应该解释一下这个架构的目的。每个类在一堆操作中执行特定任务。中心类的工作是命令一个类执行它的任务,收集结果,并将结果分散到需要它们的其他类。然后班级移动到下一个班级并做同样的事情。如何执行任务取决于扩展类。我想要限制的方法是有助于分散结果的方法。我希望这能使我的意图更清晰。

1 个答案:

答案 0 :(得分:0)

这一切都取决于你的中心阶级的作用。根据您的描述,它似乎是各种假脱机程序或调度程序。如果假脱机对象实际上是由该中心类创建的,则可以通过将这些对象设为私有来隐藏客户端中的对象,然后在中心对象中创建存根,允许客户端调用您允许的函数。

E.g。 (概念代码,可能实际上没有编译)

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,除非它是一个单身。