PHP限制公共方法的调用

PHP限制公共方法的调用,php,methods,class-visibility,Php,Methods,Class Visibility,我正在开发一个库,它有相当多的类,所有这些类都由一个中心类集合在一起。为了进行设置/配置,这个中心类必须调用其他类上的某些方法。这些方法必须是公共的,以便中心类可以调用它们,但我不希望用户调用这些方法(因为它可能导致不希望的行为) 我的一个朋友提出的一个建议是,使用一个具有参数的构造函数可以在施工时完成设置。就本库而言,这是不容易做到的。所讨论的类是为了扩展的,如果用户想要拥有自己的构造函数,我不想对构造函数参数施加任何奇怪的要求。更复杂的是,一些用于配置的信息对用户不可用。我必须让用户可以使用

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

我的一个朋友提出的一个建议是,使用一个具有参数的构造函数可以在施工时完成设置。就本库而言,这是不容易做到的。所讨论的类是为了扩展的,如果用户想要拥有自己的构造函数,我不想对构造函数参数施加任何奇怪的要求。更复杂的是,一些用于配置的信息对用户不可用。我必须让用户可以使用它,并相信他们会在构建过程中将它路由回正确的类

目前,我的解决方案是在这些方法前面加上前缀,并提醒用户不要使用该前缀调用方法。这是“灵活的”,足以让我添加更多受限制的方法,但它仍然假设用户将遵循我的指示。这也不是最优雅的解决方案

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


编辑:我应该解释此体系结构的用途。每个类在一个操作堆栈中执行一个特定的任务。中心类的工作是命令一个类执行其任务,收集结果,并将结果分发给其他需要它们的类。然后,该类移动到下一个类并执行相同的操作。任务的执行方式取决于扩展类。我想要限制的方法是那些有助于分散结果的方法。我希望这能让我的意图更加清晰。

这一切都取决于你们中心班的角色。从您的描述来看,它似乎是某种后台处理程序或调度程序。如果假脱机对象实际上是由该中心类创建的,则可以通过将这些对象设为私有对象来对客户机隐藏这些对象,然后在中心对象中创建存根,以允许客户机调用您确实允许的函数

例如(概念代码,可能无法实际编译)

客户端只有CentralClass对象,因此只能调用子类MyFunc,而不能调用MyFunc。这样做的缺点是,这也会对客户机隐藏库的面向对象结构,这可能是可取的,也可能不是可取的

但是,如果对象是由客户机创建的,然后交给您的中心类,那么您几乎无法阻止对象的所有者(客户机)随心所欲地处理它。客户机可以调用中心类可以调用的任何东西。然后,您可能必须将要保护的代码从所述类中移出,或者移到“helper类”中,或者移到中心类本身中

编辑:如果你想“破解”它,这将是一种方法(尽管我不推荐,因为它很臭):

在你的中心课堂上有一个“私人秘密”

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,除非它是单例对象。

这取决于您的中心类的角色。从您的描述来看,它似乎是某种后台处理程序或调度程序。如果假脱机对象实际上是由该中心类创建的,则可以通过将这些对象设为私有对象来对客户机隐藏这些对象,然后在中心对象中创建存根,以允许客户机调用您确实允许的函数

例如(概念代码,可能无法实际编译)

客户端只有CentralClass对象,因此只能调用子类MyFunc,而不能调用MyFunc。这样做的缺点是,这也会对客户机隐藏库的面向对象结构,这可能是可取的,也可能不是可取的

但是,如果对象是由客户机创建的,然后交给您的中心类,那么您几乎无法阻止对象的所有者(客户机)随心所欲地处理它。客户机可以调用中心类可以调用的任何东西。然后,您可能必须将要保护的代码从所述类中移出,或者移到“helper类”中,或者移到中心类本身中

编辑:如果你想“破解”它,这将是一种方法(尽管我不推荐,因为它很臭):

在你的中心课堂上有一个“私人秘密”

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,除非它是si