8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-20

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

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?