2011-12-22 7 views
1

可変範囲(here定義されるような)リファレンスリターンのPHPの変数スコープ?

変数のスコープは、それが定義された範囲内のコンテキストです。ほとんどの場合、すべてのPHP変数は1つのスコープしか持たない。この1つのスコープは、インクルードされたファイルと必要なファイルにまたがっています。

//b.php 
<?php 
class b { 
include("a.php"); 
$ainstance = new a; 
var_dump($ainstance->func()); 
} 
?> 

__

//a.php 
<?php 
class a { 
function &func() { 
    $avar = array("one", "two", "three"); 
    return $avar; 
} 
?> 

予想通り上記のコードは、(I機能funcに形成された構造WRTを意味する)変数に関する情報をダンプします。

私の疑問は、それは、関数のスコープ内にあるとき


  • は変数が格納されている、ということでしょうか?
  • コールスタック上にある場合は、関数の終了時に変数をクリーニング/破棄しないでください。
  • 変数が破壊されていない(上記のコードのとおり)ので、なぜ破壊されないのですか?あるいはPHPは変数を保存してヒープに参照するためのメカニズムを持っていますか?
  • PHPにコールスタックはまったくありますか?

答えて

4

PHPの変数はすべてzval*です。つまり、Cのポインタです。

値を返すと、PHPはほとんどの場合、自動的にzval*をコピーして返します。参考に返すと、PHPは元のzval*を返します。これらのケースでは返されたzval* refcountは0に達しません。

変数を返すと、それは変数に関する情報を含むC構造体であるzvalへのポインタを返します型、値、refcount、およびis_refフラグ)。

これはポインタなので、実際にはローカルのC変数を返すわけではなく、実際にzvalの位置を指す事前割り当てのzvalポインタを返します。 zval* refcountが0に達しない限り(つまり、戻り値が格納されていない場合)、変数はプログラムの最後まで有効です。

+0

私はそれを理解していませんが。 [zval](http://php.net/manual/en/features.gc.refcounting-basics.php)を通過します。 +1はzvalを指しています。 – ThinkingMonkey

+0

あなたが知る必要があるのは、変数を返すときに、PHPは自動的に変数の* copy *を返します。これは、Cの例のように、あなた自身がコピーを作成する必要がある(Cの文字列を返すときなど)。 – netcoder

+0

ええ、私はそれを理解しました。 zvalを指摘してくれてありがとう。 – ThinkingMonkey