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
の両方に単純にコピーするのではなく、クラスは1つしか存在できません。代わりにキーワードを使ってみましたが、違いはないようです。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";
}
}
?>