広く使用されているプログラミング言語として、PHPの基礎となる運用メカニズムは、常に開発者の注意の焦点でした。この記事では、PHP7の基礎となる開発原則について詳しく説明し、関数呼び出しと可変割り当ての実装に焦点を当てます。
PHP7では、関数呼び出しはコールスタックを介して管理されます。コールスタックは、最後のファーストアウト(LIFO)データ構造であり、関数名やパラメーターなど、各関数呼び出し中に関連情報を保存するために使用されます。関数が実行されると、関連情報がスタックの上部から削除されます。
これが関数呼び出しの例です。
function foo($a, $b) {
return $a + $b;
}
$result = foo(1, 2);
実行中にコールスタックが変更されます:プログラムの開始時にコールスタックは空です。 FOO関数を呼び出すと、関数情報がスタックの上部にプッシュされます。関数が実行された後、情報がスタックの上部からポップアップし、結果を返します。
PHP7関数呼び出しは、複数の実用的な引数配信方法をサポートしています。
参照パスの例:
function foo(&$a) {
$a = 2;
}
$b = 1;
foo($b);
echo $b; // 出力2
関数fooは変数$ bのアドレスを受信するため、正式なパラメーターの変更は実際のパラメーターに直接影響します。
PHP7では、可変割り当ては参照カウントを使用してメモリを管理します。参照カウント記録変数が参照される回数。カウントがゼロに戻ると、関連するメモリがリリースされます。
値を割り当てるとき、変数参照カウントが1の場合、変数値は直接更新されます。 1を超える場合、元の値がコピーされ、新しい値が割り当てられ、古いメモリはGarbageコレクションによって処理されます。
サンプルコード:
$a = 1;
$b = $a;
$c = &$a;
echo $a, $b, $c; // 出力111
$a = 2;
echo $a, $b, $c; // 出力212
$ bに割り当てられた場合、$ aと$ bは同じデータコピーをポイントします。 $ cは$ aへの参照です。 $ aを変更すると、$ cが同期して更新され、$ bは元の値のままです。
参照カウントでは、循環参照を解決できず、メモリリークが発生します。この目的のために、PHP7はタグクリーンガベージコレクションメカニズムを導入します。
可変参照カウントがゼロの場合、ゴミとしてマークされます。ゴミ収集メカニズムは、ルートセット(グローバル変数やローカル変数など)を横断することにより、到達可能なオブジェクトをマークします。マークされていないのはゴミで、その記憶を解放します。
円形の参照の例:
class A {
public $b;
}
class B {
public $a;
}
$a = new A;
$b = new B;
$a->b = $b;
$b->a = $a;
unset($a, $b);
ここでは、$ aと$ bは互いに参照して、参照カウントをゼロにリセットしません。設定されたものが実行された後、ガベージコレクションメカニズムはアクセスに不可能な円形の参照を検出し、タイムリーにメモリをリサイクルします。
PHP7の基礎となる開発原則、特に関数呼び出しと変数の割り当てメカニズムの深い理解は、PHP開発の効率とパフォーマンスの最適化を改善するために非常に重要です。この記事では、コールスタックの管理、実際のパラメーター配信方法、参照カウントおよびガベージコレクションメカニズムに焦点を当て、開発者がPHP7操作の詳細をより包括的に把握できるようにします。