ホームページ バックエンド開発 PHPチュートリアル PHP で関数を定義するとき、関数名の前に「&」記号を追加することは何を意味しますか?

PHP で関数を定義するとき、関数名の前に「&」記号を追加することは何を意味しますか?

Jun 19, 2017 pm 01:25 PM
function php 関数 意味 シンボル

PHP では、& 記号はコピーではなく変数への参照を渡します。参照とは、同じ変数の内容に異なる名前でアクセスすることを意味します。これは、シンボル テーブルのエイリアスである C のポインターとは異なります。 PHP では、変数名と変数の内容が異なるため、同じ内容が異なる名前を持つ可能性があることに注意してください。最も近い類似点は、Unix のファイル名とファイル自体です。変数名はディレクトリ エントリであり、変数の内容はファイル自体です。参照は、Unix ファイル システムにおける緊密な接続と考えることができます。

PHP 参照を使用すると、2 つの変数を使用して同じコンテンツを指すことができます。つまり、次のようにすると:

<?php 
$a =&$b 
?>
ログイン後にコピー

これは、$a と $b が同じ変数を指すことを意味します。
注: ここで $a と $b はまったく同じです。$a が $b を指しているわけではなく、$a と $b が同じ場所を指しているということです。
同じ構文は、参照を返す関数と新しい 演算子 (PHP 4.0.4 以降) で使用できます:

<?php 
$bar =& new fooclass(); 
$foo =& find_var ($bar); 
?>
ログイン後にコピー

注: & 演算子を使用しないと、作成されるオブジェクトのコピーが作成されます。 。クラスで $this を使用すると、そのクラスの現在のインスタンスに適用されます。 & なしの代入はインスタンス (オブジェクトなど) をコピーし、$this はそのコピーに作用しますが、必ずしも望ましい結果になるとは限りません。パフォーマンスとメモリ消費の問題のため、通常は 1 つのインスタンスのみで作業する必要があります。
@new などの @ 演算子を使用して、コンストラクター内の エラー メッセージをオフにすることができますが、これは &new ステートメントを使用する場合には効果がありません。これは Zend エンジンの制限であり、解析エラーが発生します。
参照が行う 2 番目のことは、参照によって変数を渡すことです。これは、関数内にローカル変数を作成し、その変数が呼び出しスコープ内の同じコンテンツを参照することによって実現されます。例:

<?php 
function foo (&$var) { 
$var++; 
} 
$a=5; 
foo ($a); 
?>
ログイン後にコピー

は $a を 6 に変換します。これは、関数 foo で変数 $var が $a が指すものと同じものを指しているためです。詳細な説明については、「参照による受け渡し」を参照してください。
参照が行う 3 番目のことは、参照を返すことです。
参照ではないもの
前に述べたように、参照はポインタではありません。これは、次の構造では期待した効果が得られないことを意味します:

<?php 
function foo (&$var){ 
$var =& $GLOBALS["baz"]; 
} 
foo($bar); 
?>
ログイン後にコピー

これにより、関数の呼び出し時に foo 関数の $var 変数が $bar にバインドされますが、その後 $GLOBALS [ 「バズ」] 上。関数 foo には変数 $bar が存在しないため ($var として表されますが、$var には変数の内容のみが含まれ、呼び出しはありません)、参照メカニズムを通じて関数呼び出しスコープ内の別の変数に $bar をバインドすることはできません。シンボル テーブルの名前と値のバインディング)。
参照渡し
参照によって変数を関数に渡すことができ、関数がその引数の値を変更できるようになります。構文は次のとおりです。

<?php 
function foo (&$var) { 
$var++; 
} 
$a=5; 
foo ($a); 
// $a is 6 here 
?>
ログイン後にコピー

関数呼び出しには参照記号はなく、関数定義のみにあることに注意してください。パラメーターを参照によって正しく渡すには、関数定義だけで十分です。
以下のものは参照によって渡すことができます:
foo($a) などの変数
foo(new foobar()) などの新しいステートメント
関数から返される参照、たとえば:

<?php 
function &bar() { 
$a = 5; 
return $a; 
} 
foo(bar()); 
?>
ログイン後にコピー

詳細については、を参照してください。参照により返します。
その他の は参照渡しできず、結果は未定義です。たとえば、次の参照渡しの例は無効です:

<?php 
function bar(){ // Note the missing & 
$a = 5; 
return $a; 
} 
foo(bar()); 
foo($a = 5) // 表达式,不是变量 
foo(5) // 常量,不是变量 
?>
ログイン後にコピー

これらの条件は、PHP 4.0.4 以降のバージョンで利用できます。
リファレンスリターン
リファレンスリターンは、関数を使用して参照をバインドする必要がある変数を見つけたい場合に使用されます。参照を返すときは、次の構文を使用します:

<?php 
function &find_var ($param){ 
/* ...code... */ 
return $found_var; 
} 
$foo =& find_var ($bar); 
$foo->x = 2; 
?>
ログイン後にコピー

この例では、find_var 関数によって返されるオブジェクトのプロパティはコピーされずに設定されます (トランスレータ: $foo->x = 2; ステートメントを参照)。 、参照構文を使用しないのと同じです。
注: パラメーターの受け渡しとは異なり、ここではアンパサンドを両方の場所で使用する必要があります。これは、通常のコピーではなく参照が返されることを示すためと、$foo が通常のコピーではなく参照としてバインドされていることを示すためです。 。
参照解除
参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例:

<?php 
$a = 1; 
$b =& $a; 
unset ($a); 
?>
ログイン後にコピー

は $b の設定を解除せず、$a のみを設定解除します。
これと Unix のリンク解除呼び出しを類推すると、理解が容易になるかもしれません。
参照の位置付け
多くの PHP 構文構造は参照メカニズムを通じて実装されるため、参照バインディングに関する上記の内容はすべてこれらの構造にも当てはまります。参照渡しや戻りなどの一部の構造については、すでに上で説明しました。参照を使用するその他の構造は次のとおりです。
グローバル参照
グローバル $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。それはこれを行うのと同じです:

<?php 
$var =& $GLOBALS["var"]; 
?>
ログイン後にコピー

这意味着,例如,unset $var 不会 unset 全局变量。
$this
在一个对象的方法中,$this 永远是调用它的对象的引用。

以上がPHP で関数を定義するとき、関数名の前に「&」記号を追加することは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

See all articles