(jp) =
マイナー リリースではよくあることですが、PHP 8.2 ではいくつかの廃止予定が追加されています。 非推奨はフラストレーションの原因になることがよくありますが、実際には非常に役立つことを認識することが重要です。 一般的な非推奨への対処についてはすでに書いたので、すでに不満を感じている場合は、最初にその投稿を見てみるとよいでしょう。 今日は、特に PHP 8.2 で非推奨となった 1 つの機能に焦点を当てたいと思います: 非推奨の動的プロパティです。
まず最初に、動的プロパティとは正確には何ですか? これらは、クラスの定義には存在しないプロパティですが、実行時にそれらのクラスのオブジェクトに動的に設定されます。
たとえば、これ Post クラスには name プロパティですが、実行時に設定します。
class Post
$post = new Post();
$post->name = 'Name';
var_dump($post->name);
PHP 8.2 以降、これらの動的プロパティは非推奨になります。
$post->name = 'Name';
次のメッセージが表示されます。 Deprecated: Creation of dynamic property Post::$name is deprecated.

# 実装中 __get と __set まだ動作します!
動的プロパティは PHP のメタ プログラミングの大きな部分を占めているため、この時点でパニックに陥っている可能性があります。多くのフレームワークが動的プロパティに依存しています。
心配する必要はありません: この新しい非推奨は、実装するクラスには影響しません。 __get と __set. これらの魔法の関数を実装するクラスは、意図したとおりに機能し続けます。
class Post
private array $properties = [];
public function __set(string $name, mixed $value): void
$this->properties[$name] = $value;
$post->name = 'Name';
のオブジェクトについても同様です。 stdClass、以前と同じように動的プロパティをサポートします。
$object = new stdClass();
$object->name = 'Name';
さて、賢明な読者の中には次のように考えるかもしれません。 stdClass 動的プロパティはまだ許可されていますが、そこから拡張するとどうなるでしょうか?
確かに、それは は から延長可能 stdClass 非推奨通知が表示されないようにします。 ただし、このソリューションは理想からはほど遠いと思います。
class Post extends stdClass
$post = new Post();
$post->name = 'Name';
# より良い代替手段
もし、あんたが 本当 実装せずに動的プロパティを使用したい __get と __set、から拡張するよりもはるかに優れた代替手段があります stdClass.
PHP コア チームは、組み込み属性を提供しています。 AllowDynamicProperties.その名前が示すように、大ざっぱな拡張に依存することなく、クラスの動的プロパティを許可します。
class Post
$post = new Post();
$post->name = 'Name';
# 最後に
PHP は以前は非常に動的な言語でしたが、現在ではその考え方から離れつつあります。 個人的には、より厳密なルールを採用し、可能な限り静的分析に頼ることは良いことだと思います。それがより良いコードを書くことにつながるからです。
動的プロパティに依存していた開発者が、この変更にあまり満足していないことは想像に難くありません。 あなたがそのグループに属している場合は、静的分析を詳しく調べると役立つことがあります。 詳細については、Road to PHP: Static Analysis シリーズをご覧ください。
もしも あなたは静的解析を理解するためにいくらかの時間を投資しても構わないと思っていますが、ほとんどの人が動的プログラミング言語である混乱に戻りたくないと確信しています。 PHP では、両方のオプションが利用可能であり、より厳密な型システムに徐々に移行できることは幸運です。
そうです、そうです。この非推奨は少し痛いかもしれませんが、そうするのが言語の最善であると信じています。 また、PHP 9.0 までは致命的なエラーにはならないので、対処する時間は十分にあることを覚えておいてください。
//platform.twitter.com/widgets.js