コードを書いているときに、関数と変数の前で@と$の問題が発生したので、この機会にphpが値を渡す方法と参照を渡す方法の2つの方法を学びました。
まず第一に
@演算子は、式に対してのみ有効です。初心者向けの簡単なルールは次のとおりです。どこかから値を取得できる場合は、その前に@演算子を追加できます。たとえば、変数、関数、include()呼び出し、定数などの前に配置できます。関数またはクラスの定義の前に配置することも、ifやforeachなどの条件付き構造体で使用することもできません。 現在の「@」エラー制御演算子プレフィックスは、スクリプトの終了を引き起こした重大なエラーのエラー報告でさえ無効にします。つまり、「@」を使用して、存在しない関数呼び出しや間違ったタイプの関数呼び出しの前にエラーメッセージを抑制した場合、スクリプトは原因を示さずにそこで終了します。
一言で言えば、それはエラー報告を抑制する手段です
$は私たちの重要な問題です
PHPコード:
基本形式:
function&find_var($ param)//ここで、&はオブジェクトの前で使用され、宣言として機能します
{ / * ... code ... * / return $ found_var; } $ foo = &find_var($ bar); //ここで、&は変数をリンクするために使用されます$ foo-> x = 2; //関数に値を割り当てます例:function&test() { static $ b = 0; //宣言静的変数 $ b = $ b + 1; echo $ b; return $ b; } $ a = test(); //このステートメントは、$ bの値を1として出力します、$ a = 5; $ a = test( ); //このステートメントは出力します$ bの値は2です。これは、参照による戻り値がないため、$ a = 5であり、オブジェクトに値を割り当てません$ a =&test(); //このステートメントは出力します3として$ bの値、および成功基準戻り、それが動作する次のコード$ = 5; $ =テスト(); //このステートメントの意志出力6として$ bの値 以下に説明するように: 本でちなみに、$ a = test();は実際には関数の参照リターンではありません。これは、通常の関数呼び出しと同じです。理由として:これはPHPのルールです。
PHPは、関数の参照による戻り値が$ a =&test();のメソッドを介して取得されることを規定しています。
参照リターンとは何ですか(PHPマニュアルには、参照をバインドする変数を見つけるために関数を使用する場合に参照リターンが使用されます)。
このでたらめは私を長い間理解できませんでした。
上記の例を使用して、
関数が$ a = test()によって呼び出され、関数の値を$ aに割り当てるだけで、$ aを変更しても関数の$ bには影響しないことを説明します。$ a =を渡します。関数を呼び出す&test()メソッド。彼の役割は、戻り値$ bの$ b変数のメモリアドレスと$ a変数のメモリアドレスを同じ場所に返すことで、これと同等の効果を生み出します($ a =&b;)したがって、$ aの値を変更すると$ bの値も変更されるため、実行後:$ a =&test();
$ a = 5;
、$ bの値は5になります......
php関数の前のアンペアサンドはどういう意味ですか?一部の関数は、めったに表示されないため、アンパサンドが追加され
ます。そのため、php関数の前にアンパサンドが何を意味するのかわかりません。では、php関数の前にアンパサンドを追加するとどのような影響がありますか?
Javaコード
関数&test()
{
static $ b = 0; //静的変数を宣言します
$ b = $ b + 1;
echo $ b;
return $ b;
}
$ a =&test(); //このステートメントは$ bの値は1です
$ a = 6;
test(); //このステートメントは、$ bの値を7
プラス&の前にphp変数として出力し ます
PHPコードの 例を見てみましょう
$ foo = 321;
$ bar =&$ foo;
$ bar = 123;
print $ foo;では、出力結果はどうなりますか?
PHPコード
123
がこのような理由は何ですか?
新しい変数を変更すると元の変数に影響し、この割り当て操作はより高速になります。
注:アドレスで割り当てることができるのは名前付き変数のみです。つまり、$ barの値を変更すると、$ fooの値も変更されます。
別の例:
$ _ GET [1] = 1;
function&a()
{ $ a = $ _GET [1]; return $ a; } $ x =&a(); $ x = 'MoontoC'; echo $ _GET [1 ]; //最初に割り当てられた値1の代わりに、MoontoCがここに表示されます。意味を理解していますか?関数を使用して値を渡す場合、両方の当事者が意味をなすために参照記号を使用する必要があります。 、およびいずれかの側が少ない参照シンボルを使用すると、間違ったコンテンツを取得することはありませんが、コンテンツは参照ではなく値によって渡されます。プログラムの基盤がない人にとって、最初は価値を渡すことと参照を渡すことの重要性を理解するのは本当に難しいです。彼らはとにかく欲しいものを手に入れることができると感じますが、そうではありません。同じようになりますが、何度も価格はまったく異なります。最大200万ワードの値が値として転送されます。つまり、同時に400万ワードがメモリに配置されます。つまり、メモリが2倍になり、参照によって渡されます。それを転送するための単なるショートカットです。
説明2:
変数、関数、オブジェクトなどの前にアンパサンドを追加するだけです。
PHPでの引用とは、異なる名前が同じ変数コンテンツにアクセスすることを意味
します。C言語のポインターと は異なります。C言語のポインタは、変数の内容を格納します。メモリに格納されたアドレス。変数
の参照
。PHP参照を使用すると、2つの変数を使用して同じ内容を指すことができます。
[php]
<?
$ a = " ABC ";
$ b =&$ a;
echo $ a; //ここに出力:ABC
echo $ b; //ここに出力:ABC
$ b =" EFG ";
echo $ a; //ここに$ aの値はEFG so output EFG
echo $ b; // EFGの出力はここにあり
ますか?>
[/ php] アドレスによる
関数の呼び出し
。これについてはあまり説明しません。コードは
[php]
function test(&$ a)
{
$ a = $ a + 100;
}
$ b = 1;
echo $ b; // output 1
test($ b); //ここで$ bが関数に渡されるのは、実際には変数の内容が格納されているメモリアドレスです。関数内で$ aを変更することにより、$ bの値が見つかります$ bの値を変更できます
echo "<br>";
echo $ b; // output 101
[/ php]
test(1);でエラーが発生することに注意してください。その理由は、
関数参照を
最初にコードを見て 戻ること を考えるためです
[php]
function&test()
{
static $ b = 0; // Declare a静的変数
$ b = $ b + 1;
echo $ b;
return $ b;
}
$ a = test(); //このステートメントは、$ bの値を1として出力します$ a
= 5;
$ a = test() ; // thisこのステートメントは$ bの値を2として出力します$ a
=&test(); //このステートメントは$ bの値を3として出力します$ a
= 5;
$ a = test(); // Thisステートメントは$を出力します。bの値は6です
[/ php]
次のように説明します
。このように$ a = test();取得するのは実際には関数の参照戻りではなく、通常の関数呼び出しと同じです。理由は次のとおりです。これは
PHPの規定です。 $ a =&test();のメソッドによって取得されるものは、関数の参照リターンであると規定されています。参照リターンとは
何ですか(PHPマニュアルによると:参照リターンは、関数を使用して参照をバインドする変数を検索する場合に使用されます。.)このでたらめを長い間理解していませんでした。
上記の例を使用して説明
すると、関数を次のように呼び出すことになります。 $ a = test()の場合、関数の値を$ aに割り当てるだけで、$ aを変更しても関数のTo $ bには影響しません。
そして、$ a =&test()を介して関数を呼び出すことにより、彼の役割は、$ bを返す$ b変数のメモリアドレスを$ a変数のメモリアドレスと同じ場所にポイントすることです。
これにより、次のような効果が得られます。 this($ a =&b;)したがって、$ aの値を変更すると、$ bの値も変更されます。したがって、
$ a =&test();
$ a = 5;を 実行した後
、$ bの値は
ここで5に変更され ます。全員静的変数は、関数の参照戻り値を理解している場合にのみ使用してください。実際、関数の参照戻り値は、主にオブジェクト
参照
[php]
<?
class a {
var $ abc = "ABC";
}
$ bで使用されます。 = new a;
$ c = $ b;
echo $ b-> abc; //ここで出力
ABCecho $ c-> abc; //ここで出力ABC
$ b-> abc = "DEF";
echo $ c-> abc ; // here output DEF
?>
[/ php]
上記のコードは
PHP5で実行さ れています。PHP5でのオブジェクトのコピーは参照によって実現されます。上記の列では、$ b = new a; $ c = $ b;は実際には$ b = new a; $ c =&$ b;と同等
です。PHP5の デフォルトでは、参照によってオブジェクトを呼び出しますが、必要な場合もあります。オブジェクトを作成するには元のオブジェクトを変更してもコピーに影響がないことが望まれます。この目的のために、PHPは__cloneと呼ばれる特別なメソッドを定義しています。
プログラムが比較的大きく、同じオブジェクトを参照する変数が多数あり、オブジェクトの使用後に手動でクリアしたい場合は、個人的に「&」メソッドを使用してから、$ var = nullメソッドを使用してそれ以外の場合は、php5のデフォルトの方法を使用します。さらに、php5で大きな配列を送信するには、「&」メソッドを使用することをお勧めします。これにより、メモリスペースの使用量を節約できます。
逆参照参照の
設定を解除するときは、変数名と変数コンテンツの間のバインドを解除するだけです。これは、可変コンテンツが破棄されることを意味するものではありません。例:
<?php
$ a = 1;
$ b =&$ a;
unset($ a);
?>
は$ bの設定を解除せず、$ aのみを設定解除します。
グローバル参照
変数がグローバル$ varで宣言されると、グローバル変数への参照 が実際に確立されます。つまり、次のようにするのと同じ
です。 <?php
$ var =&$ GLOBALS ["var"];
?>
これは、たとえば、unset $ varがグローバル変数の設定を解除しないことを意味します。
$ this
のオブジェクトメソッドでは、$ thisは常にそのオブジェクトへの呼び出しです。
//別のエピソードに続く
。PHPのアドレス(ポインターと同様)を指す機能は、ユーザーによって実装されませんが、Zendコアによって実装されます。PHPの参照は、「書き込み時にコピー」の原則を使用します。つまり、発生しない限り、書き込み操作の場合、同じアドレスを指す変数またはオブジェクトはコピーされません。
人気トーク
1:
$ a = "ABC";
$ b = $ a;
[/ php]
実際、$ aと$ bが異なるメモリを占有するのではなく、この時点で$ aと$ bの両方が同じメモリアドレスを指している
2:上記のコードに基づいて、次のコードを追加します
[php]
$ a = "EFG";
[/ php]
$ aと$ bが指すメモリ内のデータを再度書き込む必要があるため、Zendコアは自動的に決定します自動的に$ bになること$ aのデータコピーを作成し、ストレージ用のメモリに再適用します