考虑一个静态类(私有构造函数,只有静态方法和变量)。
现在粗略的类定义如下所示:
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
...
另一种可能的解决方案:
如果你不想创建整个单例,这可能是解决方案 - 创建一个部分单例 - 某种单例 - 肝, altough使用->
来调用静态方法可能是混乱!
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");
答案 0 :(得分:1)
您必须使用以下语法:
class B {
const A = 'A';
}
$class = B::A;
$class::test()
这基本上只是在变量类名上调用静态方法的语法。没有更好的捷径。
请注意,我不认为这样的模式很有意义,此时您的类设计太静态。您应该实例化您的类并调用$b->a->test()
,这为您的应用程序设计提供了更大的灵活性。实际上B::A
是硬编码,除了'A'
之外,它不会是其他任何内容,所以您也可以直接写A::test()
。
如果您使用{em>可能在运行时变化的const
属性而不是public static
,那么现在将全局状态引入您的应用中,也是不受欢迎的。
答案 1 :(得分:0)
从另一个类的静态函数调用类的静态函数
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'