有没有可能看到一个类在没有首先实例化它的情况下调用方法?

时间:2009-09-26 18:28:03

标签: php reflection

我想知道一个类是否会调用某个方法,但我想在实例化该类之前知道。这可能吗?

示例:类Controller_Index$this->composite('SomeCompositeClass')方法中调用__construct()。类SomeCompositeClass具有helloWorld()方法。我想看看我是否可以拨打Controller_Index->helloWorld()

基本上我想看看我的控制器是否要添加任何复合类(使用$this->composite()),以便我可以检查这些复合类是否包含我正在请求的方法(helloWorld() )。我想这样做而不必首先实例化Controller_Index

谢谢!

修改
我想我想要做的就是使用PHP的Reflection类来查看是否存在类方法。但我不想知道该方法是否存在,我想知道该类是否调用它。

编辑2
接口无济于事,因为我不一定会从每个控制器调用$this->composite()

也许我只需要重新思考问题并采用不同的方法。

3 个答案:

答案 0 :(得分:3)

首先,你不能一般地做到这一点。分析通用代码以查看它是否会在执行中达到某个点是不可判定的,因此即使您在语法上检测到对composite的调用,您也不知道它们是否会在没有实际执行代码的情况下执行。

现在,从实际意义上讲,您可以通过将代码作为文本加载并检查它以调用composite来获得一些杠杆作用,但如果您编写该代码,这将只是任何用途。以一致的方式上课。它不会显示隐藏在函数调用链后面的调用,会错误地标记有条件保护的调用,依此类推。你几乎肯定会更好地使用另一种方法,例如PHP interfaces进行静态分析。

答案 1 :(得分:1)

我不认为你可以编程地预测一个类的构造函数在执行时会调用什么而不实际执行代码,除非你想进入解释实际语言而不执行它的领域。 IMO,这种方法是确保类实现特定方法的一种非常迂回的方式。为什么不使用interfaces?您也可以重构您的composite()方法以使用type hinting来确保composite()方法仅使用您的接口类型(包含您的hellowworld()方法)。

答案 2 :(得分:0)

如果你想要一个被调用的类函数而不启动它的任何对象,你正在寻找“static method”。

基本上静态方法属于类而不是类对象。所以你可以先调用它,而不是像'Class1::doStaticMethodAction()'那样初始化它。