アンパサンドでPHP関数を開始するとはどういう意味ですか?


129

このコードを含むFacebookライブラリを使用しています。

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

関数定義の最初の&は何を意味し、このようなライブラリを使用するにはどうすればよいですか(簡単な例)

回答:


157

関数名の前のアンパサンドは、関数が値ではなく変数への参照を返すことを意味します。

参照による戻りは、参照をバインドする必要のある変数を関数を使用して検索する場合に役立ちます。パフォーマンスを向上させるために参照による戻りを使用しないでください。エンジンはこれを自動的に最適化します。リファレンスを返すのは、そうするための正当な技術的理由がある場合のみにしてください。

Returning Referencesを参照してください。


1
したがって、あまり詳細に説明せずに、(インスタンス化されたクラスを使用して)$ results = $ facebook-> users_hasAppPermission($ param1、$ param2);のように呼び出します。?ここでのニュアンスはわかりませんが、助けてくれてありがとう。
Alex Mcp 2009年

2
うん-私はそれをそのように呼ぶだけです。
ドミニクロジャー

16

すでに述べたように、それは参照を返しています。PHP 4では、オブジェクトは他の値と同様に値によって割り当てられていました。これは非常に直感的でなく、他のほとんどの言語が機能する方法に反しています。

この問題を回避するために、オブジェクトを指す変数に参照が使用されました。PHP 5では、参照はほとんど使用されません。これはレガシーコードか、PHP 4との下位互換性を維持しようとするコードだと思います。


これは公式のFacebook PHPライブラリ、FWIWです。
Alex Mcp 2009年

4
@Alex:その場合、おそらくphp4を使用するカジュアルなハッカーを自分自身から保護するためにそうしているでしょう。独自のコードでこれを行うべきではありません-非推奨です。
troelskn 2009年

3
「これは非常に直感的ではなく、他のほとんどの言語が機能する方法とは対照的です」私はこれ以上同意することができませんでした。
オービットでの軽さのレース

5
@WildlyInaccurate:.NETとJavaで発生するデフォルトの参照によるオブジェクトの割り当ては、非常に直感的ではありません。他のほとんどの言語では、「オブジェクト」またはプリミティブなど何でも、割り当てはコピーによって行われます。これは、黎明期からそうであったため、これは世界が固執すべきことでした。
オービット

4
何かが直感的であるかどうかは、おそらくかなり主観的です。しかし、それ以外の点ではPHPに似ている言語の場合、標準ではオブジェクトを参照渡しすることになります。OOPに関しては、私はそれが最も直感的な方法だと思います。OOPは状態のカプセル化に関するものであるため、プログラムは通常、状態を複製するのではなく、その状態を参照します。
troelskn

4

これは多くの場合、PHPではReturning referenceまたはReturning by referenceとして知られています

参照による戻りは、参照をバインドする必要のある変数を関数を使用して検索する場合に役立ちます。パフォーマンスを向上させるために参照による戻りを使用しないでください。エンジンはこれを自動的に最適化します。リファレンスを返すのは、そうするための正当な技術的理由がある場合のみにしてください。

リファレンス返す PHPドキュメント

PHPでの参照は、単に変数のコンテンツに割り当てられる別の名前です。PHP参照はCプログラミングのポインタとは異なります実際のメモリアドレスではないため、ポインタ演算に使用できません。

参照を返すという概念は、特に初心者には非常に混乱する可能性があるため、例が役立ちます。

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

getPopulationCount()&に定義された関数は、の内容または値への参照を返します$populationCount。つまり、インクリメントし$countryPopulation、さらにインクリメントします$populationCount

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.