【问题标题】:PHP: is it possible to call a static class method from another static class?PHP:是否可以从另一个静态类调用静态类方法?
【发布时间】:2016-06-26 10:06:10
【问题描述】:

考虑一个静态类(私有构造函数,只有静态方法和变量)。

现在粗略的类定义如下所示:

class A{
   private function __construct(){}
   public static test(){};
}
class B{
   private function __construct(){}
}

是否有可能调用类似B::A::test() 的东西?

或者也许通过一个变量? B::$A::test() 之类的东西?

我想这可能是通过一些通用呼叫捕捉,但我无法弄清楚......

重要提示:另外,我想从B 调用任何其他静态类,而不仅仅是从A 类...

EDIT2:我想要实现的是通过另一个静态类调用静态类,如果可能的话......非常类似于从对象变量调用方法 - 但静态类(显然)不是要实例化。

EDIT3:也可能的解决方案是将其称为B::CLASSNAME_METHOD_NAME 并通过__callStatic 捕获它,但我宁愿使用B::CLASSNAME::METHOD_NAME ...

另一种可能的解决方案:

如果您不想创建整个单例,这可能是解决方案 - 创建部分单例 - 某种单例-hepler,尽管使用 -> 调用静态方法可能会令人困惑!强>

class AA{
    private function __construct(){}
    private static $instance;
    public function getInstance(){ return empty(self::$instance)?(new self()):self::$instance; }
    public function __call($method_name, $args) {
       return AA::$method_name($args);
    }
    public static function test($a, $b){
        echo "TEST: A:".$a." B:".$b; 
    }   
}

class B{
    private function __construct(){}
    public static function A(){
        return AA::getInstance();
    }
}

B::A()->test("one", "two");

【问题讨论】:

  • B::A::test() 会做什么,A::test() 不会...?!
  • 我仍然不明白应该有什么区别。让我们这样说:您显示的语法不存在,因此没有内在含义。你试图在这里发明一些新的操作,或者用一个错误的解释来驱动一些现有的操作。请更详细地解释这应该导致什么以及为什么只是 A::test() 没有削减它。
  • 为什么要通过另一个静态类调用一个静态类?这不是滥用静态类的目的吗?为了更容易在其他类中实例化它(使其抽象以便于使用)。
  • 那么B::A 是否总是引用class A?或者您的意思是Bconststatic 属性应该引用另一个类,并且您想调用该类的方法,动态解析该类?
  • 顺便说一句,到那时你应该停止使用静态并只实例化你的类...

标签: php static static-methods static-classes


【解决方案1】:

您必须使用以下语法:

class B {
   const A = 'A';
}

$class = B::A;
$class::test()

这本质上只是在变量类名上调用静态方法的语法。没有比这更好的捷径了。

请注意,我认为这样的模式没有多大意义,此时您的类设计过于静态。您应该实例化您的类并调用$b->a->test(),这为您的应用程序设计提供了更大的灵活性。实际上B::A硬编码,它不会是'A' 以外的任何东西,所以你不妨直接写A::test()
如果您使用public static 属性而不是const,该属性可能 在运行时会发生变化,那么您现在将全局状态 引入您的应用程序,这也是不可取的。

【讨论】:

  • A 可以自己调用,但如果它的名字更短,它可能会产生冲突——但在通过B 调用它时不会——这样就很清楚了,A应该叫...
  • 在微观层面上可能是这样,但我想告诉你,也许在宏观层面上你应该重新考虑一些事情......但再次,适合自己...... :)
  • 正如我所说,没有比这更好的捷径了。
  • 检查我可能的解决方案(添加到问题中) - 你给了我一个想法,让我不断地调用另一个类 + 单例方法......
【解决方案2】:

从另一个类的静态函数调用一个类的静态函数

class A{
   private function __construct(){}

   public static function test()
   { 
       echo 'from class A'; 
   }
}

class B{
   private function __construct(){}

    public static function test() 
    {
        return A::test();
    }
}

A::test(); //outputs 'from class A'
B::test(); //outputs 'from class A'

【讨论】:

  • 这可行,但也会添加太多不需要的语法...无论如何谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多