我似乎在扩展PHP中的静态类上遇到了麻烦。
PHP代码:
<?php
class InstanceModule {
public static $className = 'None';
public static function PrintClassName() {
echo self::$className . ' (' . __CLASS__ . ')<br />';
}
}
class A extends InstanceModule {
public static function Construct() {
self::$className = "A";
}
}
class B extends InstanceModule {
public static function Construct() {
self::$className = "B";
}
}
?>
我的呼叫代码和期望:
<?php
//PHP Version 5.3.14
A::PrintClassName(); //Expected 'None' - actual result: 'None'
B::PrintClassName(); //Expected 'None' - actual result: 'None'
A::Construct();
A::PrintClassName(); //Expected 'A' - actual result: 'A'
B::PrintClassName(); //Expected 'None' - actual result: 'A'
B::Construct();
A::PrintClassName(); //Expected 'A' - actual result: 'B'
B::PrintClassName(); //Expected 'B' - actual result: 'B'
A::Construct();
A::PrintClassName(); //Expected 'A' - actual result: 'A'
B::PrintClassName(); //Expected 'B' - actual result: 'A'
?>
实际的完整输出:
None (InstanceModule)
None (InstanceModule)
A (InstanceModule)
A (InstanceModule)
B (InstanceModule)
B (InstanceModule)
A (InstanceModule)
A (InstanceModule)
从看起来的情况来看,当我在任一扩展类中设置
self::$className
时,它会覆盖另一个类的变量。我猜这是因为我使用静态类,只能有一个InstanceModule
类,而不是将其简单复制到A
和B
,这是我以前对extends
的理解。我尝试使用关键字static::$className
,但似乎没有任何区别。
如果有人能指导我正确的方向,告诉我我在这里做错了什么,以及如何解决这个问题,那就太好了。
编辑: 澄清一下,这段代码做到了我想要的效果,但显然是一个可怕的解决方法,因为它会破坏继承和重用函数的整个思路:
<?php
class A {
public static $className = 'None';
public static function PrintClassName() {
echo self::$className . ' (' . __CLASS__ . ')<br />';
}
public static function Construct() {
self::$className = "A";
}
}
class B {
public static $className = 'None';
public static function PrintClassName() {
echo self::$className . ' (' . __CLASS__ . ')<br />';
}
public static function Construct() {
self::$className = "B";
}
}
?>
static
关键字,并且最后,在两个扩展类中重新定义className
(public static $className ='None'
)实际上导致PrintClassName()
始终输出None
,即使self::$className
仍在被定义。 - h2ooooooo