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

Source: https://habr.com/ru/post/J98998/


All Articles