PHP 5.2→5.3:翻訳の難しさ

偶然にも、併置されたホスティングの移動中に一部のプロジェクトを5.3に転送しようとしました。その結果、5.2と5.3の間のバグレベルでおかしい非互換性が見つかりました。



この問題は私たちの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の共有ホスティングサポートがどれくらいあり、このバージョンへの移行が大規模になるのはいつかと思います。



All Articles