この問題は私たちのCMSの腸で発生し、結局のところ、面白い背景があります。
そのため、特定の抽象クラスAbstractControllerが存在していました。 また、プライベートとして宣言されたいくつかのプロパティと、動的プロパティ、特に
__get()
メソッドのサポートの実装がありました。
すべての詳細を省略すると、状況は次のように説明できます。
abstract class AbstractController { private $layout = 'layout'; public function __get($property) { if (property_exists($this, $property)) return $this->$property; else throw new Exception("Missing property: $property"); } } class RealController { protected $action = 'action'; }
この場合の
__get
メソッドは、個々のフィールドへの読み取り専用アクセスを提供します。
むかしむかし、プログラマーは派生クラスのインスタンスの
layout
フィールドを読み取る必要がありました。 プライベートにも関わらず、彼は
$controller->layout
と呼ばれ、うまくいきました! 悪くない、プログラマーは考え、彼はそのようなすばらしい特徴を作った。 バージョン5.2でした
つまり、親クラスに実装された__getは、派生クラスのインスタンスに対して呼び出されることにより、プライベートフィールドにアクセスできました。
私たちは書きます:
$a = new RealController(); print $a->layout; print "\n"; print $a->action; print "\n";
5.2.10で実行:
結果:
layout action
技術の進歩が進み、アプリケーションは5.3に移行しました。 実行して取得(5.3.2で):
action PHP Fatal error: Uncaught exception 'Exception' with message 'Missing property: layout' in /home/max/test.php:9 Stack trace: #0 /home/max/a.php(20): AbstractController->__get('layout') #1 {main} thrown in /home/max/test.php on line 9
それは修復されます。
更新:反対は本当です! 修復されていませんが、むしろ壊れています。つまり、property_exists()関数です。 関連するコメントについてはLighteRに感謝します。 ファック、熱、脳が溶けます。
二つの道徳的ポイントがあります:ある
現在5.3の共有ホスティングサポートがどれくらいあり、このバージョンへの移行が大規模になるのはいつかと思います。