PHP
検証

PHPの多重代入についての検証

PHPの多重代入とは

複数の変数に同じ値を一行で代入すること。
多くの言語では$a = $b = 100;といった形で表現できる。

検証する点

クラスの外や関数の中では多重代入可能だが、プロパティでは不可能なのか

結果

  • グローバル変数の多重代入->可能
  • 関数内でのローカル変数への多重代入->可能
  • 関数内での静的変数への多重代入->エラー
  • クラスプロパティでの多重代入->エラー
  • クラスメソッドでの多重代入->可能

検証

  1. グローバル変数の多重代入

    $a = $b = 100;
    echo 'a is ',$a,PHP_EOL;
    echo 'b is ',$b,PHP_EOL;
    //////////////////////////////////
    a is 100
    b is 100
    

    可能

  2. 関数内でのローカル変数への多重代入

    function test($value)
    {
        $a = $b = $value;
        echo 'a is ',$a,PHP_EOL;
        echo 'b is ',$b,PHP_EOL;
    }
    
    test(3939);
    /////////////////////////////////////
    a is 3939
    b is 3939
    
    

    可能

  3. 関数内での静的変数への多重代入

    function test($value)
    {
        static $a = $b = $value;
        echo 'a is ',$a,PHP_EOL;
        echo 'b is ',$b,PHP_EOL;
    }
    
    test(765);
    /////////////////////////////////////
    Fatal error: Constant expression contains invalid operations
    

    エラー

  4. クラスプロパティでの多重代入

    class testClass
    {
        public $a=$b=100;
    }
    
    $test = new testClass;
    echo 'a is ',$test->a,PHP_EOL;
    echo 'b is ',$test->b,PHP_EOL;
    /////////////////////////////////////
    Fatal error: Constant expression contains invalid operations
    

    エラー

  5. クラスメソッドでの多重代入

    class testClass
    {
        public $a;
        public $b;
        public function assign($value)
        {
            $this->a = $this->b = $value;
        }
    }
    
    $test = new testClass;
    $test->assign(5);
    echo 'a is ',$test->a,PHP_EOL;
    echo 'b is ',$test->b,PHP_EOL;
    //////////////////////////////////
    a is 5
    b is 5
    

    可能

考察

クラスプロパティでの多重代入 については変数を参照できないためと思われる。1
関数内での静的変数への多重代入 についてはなぜエラーになるのかわからなかった。が、マニュアルの記述を見るにクラスプロパティと同じような理由だろう2


  1. プロパティを定義するには public、protected あるいは private のいずれかのキーワードのあとに通常の変数の宣言を続けます。 宣言時に初期値を設定することもできますが、初期値は定数値でなければなりません。 つまり、コンパイル時に評価可能な値でなければならず、 実行時の情報がないと評価できない値であってはいけないということです。PHP: プロパティ - Manual  

  2. PHP 5.6 以降は、これらの変数に式の結果の値を代入できます。 しかし関数は使えません。関数を使おうとするとパースエラーが発生します。PHP: 変数のスコープ - Manual