- json_decode: documentation ( source)
<?php
/** 従来の普通のクラス内で定義されていないプロパティをインスタンス化した後に生やすと非推奨の警告が出るようになりました */
class User
{
public $name;
}
// この非推奨の警告は次の様に出ます
$user = new User();
$user->last_name = 'Doe'; // Deprecated: Creation of dynamic property User::$last_name is deprecated in xxx.php on line 9
/** stdClass、いわゆる無名の汎用的な空のクラスでは動的にプロパティを生やしても問題ないです。 */
$user = new stdClass();
$user->last_name = 'Doe'; // 何の警告も発生しない
// stdClass は new stdClass() 以外でも生成されます。よくあるのは json_decode や SQL の結果です。
$user = json_decode('{}', false, JSON_THROW_ON_ERROR);
$user->last_name = 'Doe'; // 何の警告も発生しない
/** PHP8.2 から増えたアトリビュートであるAllowDynamicPropertiesをつけることでも動的にプロパティを生やすことが許されます */
// @see https://www.php.net/manual/ja/class.allow-dynamic-properties.php
#[\AllowDynamicProperties]
class UserWithAllowDynamicProperties
{
public $name;
}
$user = new UserWithAllowDynamicProperties();
$user->last_name = 'Doe'; // 何の警告も発生しない
/** マジックメソッドである __set を使う場合も動的にプロパティを生やす様な書き方が許されます */
// @see https://www.php.net/manual/ja/language.oop5.overloading.php#object.set
// 今回の動的なプロパティの作成の非推奨化は厳密にはクラスで宣言されていないプロパティの扱いを非推奨に寄せるものです。
class UserWithSetter
{
public $name;
protected array $attr = [];
public function __set(string $name, $value): void
{
$this->attr[$name] = $value;
}
}
$user = new UserWithSetter();
$user->last_name = 'Doe'; // 何の警告も発生しない