我似乎无法在 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
and B
,正如我之前的理解extends
。我尝试过使用关键字static::$className
相反,但这似乎没有什么区别。
如果有人能指导我正确的方向,了解我在这里做错了什么,以及如何解决这个问题,那就太好了。
Edit
由于 $className 是静态的并且在父类中,因此当您在 A 或 B 中设置 className 时,它会更改父类中的变量,并且在读取变量时也会执行相同的操作。除非您在扩展类中重写 className,否则您将从最初在 InstanceModule 中定义的同一内存位置存储和检索信息。
如果在A/B中重新定义className,则可以分别从InstanceModule或A/B中使用parent::或self::访问className。根据您想要做什么,抽象类也可能发挥重要作用。
See 静态关键字 http://php.net/manual/en/language.oop5.static.php or 类抽象 http://php.net/manual/en/language.oop5.abstract.php在 PHP5 手册上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)