Кажется, у меня проблемы с расширением статических классов в 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";
}
}
?>