phpでの引用は&を使用して行われます。ここで、php引用における使用例と引用の問題と事項をいくつか紹介します。参考のために入力してください。
引用とは
PHP でのクォートとは、同じ変数の内容に異なる名前でアクセスすることを意味します。これは C ポインターとは異なり、参照はシンボル テーブルのエイリアスです。 PHP では変数名と変数の内容が異なるため、同じ内容でも異なる名前が付けられることに注意してください。最も近い類似点は、Unix のファイル名とファイル自体です。変数名はディレクトリ エントリであり、変数の内容はファイル自体です。参照は、Unix ファイル システムのハードリンクと考えることができます。
引用符をどうするか
PHP の参照では、2 つの変数が同じコンテンツを指すことができます。
$a =& $b; の場合、$a と $b は同じ変数を指します。
ヒント: ここで $a と $b はまったく同じです。これは、$a が $b を指す、またはその逆ではなく、$a と $b が同じ場所を指すということです。
関数がその引数の値を変更できるように、参照によって変数を関数に渡すことができます。構文は次のとおりです:
コードは次のとおりです |
コードをコピー |
関数 foo(&$var)
{
$var++
}
$a=5
ふー($a);
エコー $a;
//出力は: 6
|
PHP 引用文字 &
PHP 参照の役割 (つまり、変数、関数、オブジェクトなどの前にアンパサンドを追加する) について、まず次のプログラムを見てみましょう。
コードは次のとおりです
| コードをコピー
|
$a = 100 //変数aを宣言します ;
$b = &$a; //変数 b を宣言し、独立変数 a を参照します
エコー "$a ";
echo "$b ";
$a++; //変数 a が 1 増加します
echo "$a ";
echo "$b ";//変数 b を確認します。変数 b も 1 増加しており、同じストレージ ユニットが使用されていることを示します
?>
プログラムの実行結果:
100
100
101
101
|
多くの人は、PHP の参照が C のポインターと同じであると誤解しています。実際には、それらは異なり、大きく異なります。配列転送プロセス中に明示的に宣言する必要のない C 言語のポインターを除き、他のポイントは * を使用して定義する必要があります。ただし、PHP のアドレスへのポインター (ポインターと同様) 関数は、はい、PHP の参照は「コピーオンライト」の原則を採用しています。つまり、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされません。 。
php のデフォルトは値渡しです:
コードは次のとおりです
コードをコピー |
|
$a = 20;
$b = $a;
$a = $a + 10;
$a と '.$b をエコーします。
?>
プログラムの実行結果: |
30と20
アドレスとして渡したい場合は、& を追加する必要があります。つまり:
コードは次のとおりです
コードをコピー
|
|
$a = 20;
$b = &$a;
$a = $a + 10;
$a と '.$b をエコーします。
?>
プログラムの実行結果:
つまり、& は $a のアドレスを $b に渡します。この場合、2 つの変数はメモリ記憶領域を共有することになります。これは、それらの値が同じであることを意味します。
同じ構文は、参照を返す関数と new 演算子で使用できます。
コードは次のとおりです |
コードをコピー |
ソースプリントを表示しますか?
1
2 $bar =& 新しい fooclass();
3 $foo =& find_var($bar);
4 ?>
|
参照が行う 2 番目のことは、参照によって変数を渡すことです。これは、呼び出しスコープ内の同じコンテンツを参照する関数内にローカル変数を作成することによって実現されます。簡単に言うと、関数のパラメータはローカル変数への参照です。別の例を次に示します:
コードは次のとおりです
コードをコピー |
|
関数 foo(&$val1, $val2) {
$val1 += 1;
$val2 += 1;
}
$a=5;
$b=10;
foo($a,$b);
エコー $a;
エコー $b;
?>
このコードを実行するには、2 つのパラメーターを関数に渡します。1 つは $a の内容への参照で、もう 1 つは $b の値です。この関数を実行すると、$a の内容が次のようになっていることがわかります。変更されましたが、 $b の内容は変更されていません。
PHP の参照と誤解
PHP における参照は、変数のエイリアスとして理解できます。 PHP 変数名はシンボル テーブルに格納され、変数の内容はヒープに格納されるため、参照ではシンボル テーブル内の異なるシンボル名を使用して同じストレージ コンテンツにアクセスします。これは、Unix ファイル システムのハードリンクと同じです。同じコンセプト、例えば:
コードは次のとおりです
コードをコピー |
|
$a = 1;
$b = &$a; //$a と $b は同じコンテンツを指します
$b = 2;
エコー $b //2
エコー $a //2
パスリファレンス
参照による受け渡しは非常に簡単で、次のような「&」記号だけです:
関数 foo(&$a) {
$a = 2;
}
$b = 1;
foo($b);
エコー $b //2
リファレンスに戻る
ほとんどの場合、パフォーマンスを向上させるために参照を返す必要はありません。zend エンジンは自動的に最適化しますが、参照を返す必要がある場合は、次の方法で参照を返すことができます。
コードは次のとおりです
コードをコピー
|
|
クラス foo {
パブリック $value = 42;
パブリック関数 &getValue() { // 「&」が必要です
return $this->value;
}
}
$obj = 新しい foo;
$myValue = &$obj->getValue(); // もう 1 つ「&」が必要です。$myValue はクラス foo の $value への参照です。
$obj->value = 2; // オブジェクトの $value 属性を変更します
echo $myValue; // 出力 2、$myValue はクラス foo の $value と同じです。
とポインター の違い
参照はポインターに非常に似ていますが、ポインターではありません。次のコードを参照してください。
コードは次のとおりです
| コードをコピー
|
$a = 0;
$b = &a;
エコー $a //0
unset($b);
エコー $a //0
$b は $a のエイリアスにすぎないため、$b が解放されても $a には何の効果もありませんが、ポインタの場合はそうではありません。次のコードを参照してください。
コードは次のとおりです
コードをコピー |
|
#include
int main(int argc, char const *argv[]) {
int a = 0;
int* b = &a;
printf("%in", a);
無料(b);
Printf("%in", a); //*** オブジェクト 0x7fff6350da08 のエラー: 解放されるポインターが割り当てられていませんでした
}
b は a へのポインタであるため、b のメモリを解放した後、再度 a にアクセスするとエラーが発生します。これは、PHP 参照と C ポインタの違いを明確に示しています。
オブジェクトと参照
PHP でオブジェクトを使用するとき、「オブジェクトは参照によって渡される」とよく言われますが、実はこれは誤解です。 PHP のオブジェクト変数には、オブジェクトを渡すときに、実際に渡されるのは識別子です。次のコードを参照してください。
コードは次のとおりです
| コードをコピー
|
$a = 新しい A;
$b = $a;
$b->testA = 2;
/*
※この時の$aと$bの関係は
*
* $a --> オブジェクト (クラス A) |
*
*
*
* $b --> オブジェクト ID |
*
*
*
*/
$c = 新しい B;
$a = $c;
$a->testB = "変更されたクラス B";
/*
※この時の$a、$b、$cの関係:
*
* $b --> オブジェクト (クラス A) |
*
*
*
* $a --> オブジェクト ID2 |
***
*v
*
* $c --> オブジェクト ID2 |
*
*/
echo "オブジェクト a: "; //["testB"]=> string(15) "変更されたクラス B"
echo "オブジェクト b: "; //["testA"] =>
echo "オブジェクト c: "; //["testB"]=> string(15) "変更されたクラス B"
オブジェクトが参照渡しの場合、$a、$b、$c の出力内容は同じになるはずですが、実際には結果はこのようになりません。 オブジェクトを参照によって渡す次の例を見てください:
コードは次のとおりです |
コードをコピー |
$aa = 新しい A;
$bb = &$aa // 引用 ;
$bb->testA = 2;
/*
※この時の$aaと$bbの関係は
*
*
* $bb --> オブジェクト (クラス A) |
*
*
*
* $aa --------+
*
*
*/
$cc = 新しい B;
$aa = $cc;
$aa->testB = "クラス B を変更しました";
/*
※この時の$aa、$bb、$ccの関係は
*
*
* | オブジェクト ID |
*
*
* $bb ---->-----+
*
* $aa ---->-----+
*
* v
***
* | オブジェクト ID2 ---------------+
***
*v
*
* $cc --> オブジェクト ID2 |
*
*/
echo "object aa: "; var_dump($aa); //["testB"]=>string(15) "変更されたクラス B"
echo "object bb: "; //["testB"]=>string(15) "変更されたクラス B"
echo "object cc: "; //["testB"]=>string(15) "変更されたクラス B"
この時点では、$aa、$bb、$cc の内容は全く同じなので、オブジェクトが参照渡しされていないことがわかります。この誤解はできるだけ早く解く必要があります。
http://www.bkjia.com/PHPjc/628637.html
www.bkjia.com
| 本当
http://www.bkjia.com/PHPjc/628637.html技術記事 | PHP での参照は、変数名がディレクトリ エントリ、変数の内容がファイル自体を使用して行われます。参照は、Unix ファイル システムのハードリンクと考えることができます。 引用符は PHP の引用符と同じことを行います...
|
声明:この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。 | |