・これはリファレンス代入なので、$cの値が変更されれば、_bプロパティの値も変更される、ということでしょうか?
まずこの代入を行うと,$this->_bが使用している値を$cも使用するようになります.この後は,$cが変更されれば$this->_bは変更されますし,$this->_bが変更されれば$cも変更されます.unsetでリファレンスを解除することをどこかで行わない限り,この2つの変数名は互いにエイリアスのような扱いになります.が,$cの寿命はこのメソッドの内部だけなので,その外部で$cという変数を追う必要はありません.
・もうそうなら、_aメソッドはセッターでも何でもないということでしょうか?
そもそも引数が何もない時点でセッターの定義から外れています.
・privateメソッドの意味はない?
publicかprivateかは無関係です.
備考
「参照型」と「参照渡し」は全く別の概念なので注意してください.PHPにおいてはオブジェクトやリソースが参照型で,それ以外は値型に相当します.参照渡しは型に関わらず&をつけて代入されているかがすべてを決定します.
これを踏まえて,PHPコミッタの人が書いた以下の記事を読んでみると動きがよくわかると思います.「参照型」についてはあまり触れられていませんが,「参照渡し」については完全に網羅されています.
上記内容をもとに今回述べたことを正確に書くと
PHP5
シンボル$this->_bに対応するzval構造体へのポインタを,シンボル$cからも対応付けます.そして,zval構造体の参照カウントを1増加させます.更にzval構造体の参照フラグを有効にし,この後の操作でzval構造体が内包する値に変更があっても,コピーオンライトが走らないようにします.
なお,ポインタ参照は「zval構造体」と「zvalue_value共用体が指す数値以外の値」で2回発生しています.
シンボルテーブル -> zval.value.lval = 整数
シンボルテーブル -> zval.value.str.val -> 文字列
PHP7
シンボル$this->bと既存のzval構造体の間に,zend_reference構造体を内包する新しいzval構造体が入り込む形になります.その上で,シンボル$cも$this->bと同様の新しいzval構造体に対応するようになります.これにより,この後の操作でzval構造体が内包するzend_reference構造体が内包するzval構造体が内包する値に関して変更があっても,コピーオンライトが走らないようにします.
なお,ポインタ参照は「zend_value共用体が指す数値以外の値」でしか発生しません.PHP7が速くなった理由はこれです.しかし今回のようにzend_reference構造体はポインタ参照の対象となってしまうのが難点です.
シンボルテーブル.zval.value.lval = 整数
シンボルテーブル.zval.value.str.val -> 文字列
シンボルテーブル.zval.value.ref -> val.value.lval = 整数
2016/03/23 10:12
2016/03/23 10:19
2016/03/24 08:53