混乱したタイトルのため申し訳ありません、私はより良いものを見つけることができませんでした。私はPHP/5.6.14によ は、私はこのコードを持っている:最後getFoo()
を実行奇妙なPHPの動作、ベースクラスと派生クラスの同じフィールド名、クローンインスタンス
class Base
{
private $foo; <--- NOTE
public function __construct()
{
$this->foo = "base foo";
}
public final function getFoo()
{
return $this->foo;
}
}
class Derived extends Base
{
public $foo; <--- NOTE
public function __construct($type)
{
parent::__construct();
$this->foo = "derived foo";
$this->somethingUndefined = "dynamically declared"; <--- NOTE
}
}
$base = new Base();
var_dump($base->getFoo());
$derived = new Derived(0);
var_dump($derived->getFoo());
$clonedDerived = clone $derived; <--- NOTE
var_dump($clonedDerived->getFoo());
は私に与える:
PHPのお知らせ:未定義のプロパティ:派生:: Cで$ fooは: .. \ test.php on line * getFoo()がベースクラスで実装されている行*。
- 同じプライベート/パブリックフィールド名
- に取り組んで派生クラス
- 内の1つまたは複数の動的に宣言したフィールドを持つ:私は一緒にこの三つの条件を置く場合
は、私は予告を取得します派生クラスのインスタンスのクローン
これらのうちの1つ以上を削除すると、通知が消えます。
ここでは何が起こっていますか? $foo
は静的ではありません、それは未定義ではありません... 私は例外にすべてのE_ALLをオンにするカスタムばerror_handlerを使用していますし、本当にこれを無視することはできません...
EDIT: これがちょうどです私は問題を再現するために書いた例、実際のコードは大きく異なります。私はプライベート$ fooか何かを公開しようとしていません。フィールドと同じ名前を選んだ別の開発者によってBaseとDerivedが実装され、これを(他の2つの条件と一緒に)実行すると、通知が発生したばかりです。私はAFAIK以来、それが完璧でなければならない理由を理解しようとしています。
'Base :: $ foo'は派生クラスからアクセスできないため、同じ名前の新しいプロパティを安全に宣言することができるので、警告/通知/エラーは発生しません。 – slax0r
私はそれをテストしなければならなかった、私は抽象クラスとインターフェイスのラインをもっと考えていた。 – ArtisticPhoenix
'Base :: $ foo'は見えませんが、このクラスはgetFoo()が基本クラスに実装されている行を持っています* .'本当に混乱します。 – ArtisticPhoenix