$obj =& new Class();
PEARのHTTP_Requestモジュールを使おうとPEARマニュアルを見ていたら…
<?php require_once "HTTP/Request.php"; $req =& new HTTP_Request("http://www.yahoo.com/"); if (!PEAR::isError($req->sendRequest())) { echo $req->getResponseBody(); } ?>例 48-1 yahoo.com の内容を取得し、 それを表示する
この'= &'ってなんですか??
で、調べてみたところ、
リファレンスを返す関数や new 演算子でも 同じ構文が使用可能です(PHP 4.0.4 以降)。
<?php $bar =& new fooclass(); $foo =& find_var($bar); ?>PHP 5 以降、new は自動的にリファレンスを返すようになりました。そのため、この場面で =& を使用することは非推奨となり、 E_STRICT レベルのメッセージが表示されるようになりました。
PHP: リファレンスが行うことは何ですか? - Manual注意: & 演算子を使用しない場合は、オブジェクトのコピーが 作成されます。クラスの内部で $this を使用した場合、 それはクラスの現在のインスタンスに対する操作を表します。 & のない代入はインスタンス(オブジェクト)のコピーを 行い、$this はそのコピーに対する操作を表します。 これはお望みの動作と異なるかもしれません。パフォーマンスやメモリ使用量の 観点から、常に単一のインスタンスに対して操作を行いたくなることもあるでしょう。
コンストラクタ内で @new のようにして @ 演算子を使用すると、あらゆるエラーの表示を 見えなくすることが可能ですが、 &new を使用する場合にはこの機能は動作しません。 Zend Engine の仕様により、これはパースエラーとなります。
とのこと。
よって以下のテストスクリプトを組んでみたYO!
<?php $hoge1 = new Hoge(); var_dump($hoge1); $hoge2 =& new Hoge(); var_dump($hoge2); class Hoge { protected $name; public function __construct() { $this->name = 'hoge'; } } ?>
実行結果はこう。ちなみにPHPのバージョンは5.2.6です。
object(Hoge)#1 (1) { ["name:protected"]=> string(4) "hoge" } object(Hoge)#2 (1) { ["name:protected"]=> string(4) "hoge" }
これは'&'をつけてもつけなくても同じ振るまいってことでいいんでしょうか??