3v4l.org

run code in 300+ PHP versions simultaneously
<?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'; // 何の警告も発生しない
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/nmQkc
function name:  (null)
number of ops:  29
compiled vars:  !0 = $user
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    8     0  E >   NEW                                              $1      'User'
          1        DO_FCALL                                      0          
          2        ASSIGN                                                   !0, $1
    9     3        ASSIGN_OBJ                                               !0, 'last_name'
          4        OP_DATA                                                  'Doe'
   12     5        NEW                                              $5      'stdClass'
          6        DO_FCALL                                      0          
          7        ASSIGN                                                   !0, $5
   13     8        ASSIGN_OBJ                                               !0, 'last_name'
          9        OP_DATA                                                  'Doe'
   16    10        INIT_FCALL                                               'json_decode'
         11        SEND_VAL                                                 '%7B%7D'
         12        SEND_VAL                                                 <false>
         13        SEND_VAL                                                 4194304
         14        DO_ICALL                                         $9      
         15        ASSIGN                                                   !0, $9
   17    16        ASSIGN_OBJ                                               !0, 'last_name'
         17        OP_DATA                                                  'Doe'
   27    18        NEW                                              $12     'UserWithAllowDynamicProperties'
         19        DO_FCALL                                      0          
         20        ASSIGN                                                   !0, $12
   28    21        ASSIGN_OBJ                                               !0, 'last_name'
         22        OP_DATA                                                  'Doe'
   43    23        NEW                                              $16     'UserWithSetter'
         24        DO_FCALL                                      0          
         25        ASSIGN                                                   !0, $16
   44    26        ASSIGN_OBJ                                               !0, 'last_name'
         27        OP_DATA                                                  'Doe'
         28      > RETURN                                                   1

Class User: [no user functions]
Class UserWithAllowDynamicProperties: [no user functions]
Class UserWithSetter:
Function __set:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/nmQkc
function name:  __set
number of ops:  6
compiled vars:  !0 = $name, !1 = $value
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   37     0  E >   RECV                                             !0      
          1        RECV                                             !1      
   39     2        FETCH_OBJ_W                                      $2      'attr'
          3        ASSIGN_DIM                                               $2, !0
          4        OP_DATA                                                  !1
   40     5      > RETURN                                                   null

End of function __set

End of class UserWithSetter.

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
137.68 ms | 989 KiB | 14 Q