天天看點

php變量指派與引用

 最近在學習php,現在php的版本是5,從此php的作者可以以此稱它是程式設計語言中第四個完全支援面向對象的語言了。一個腳本語言做到如此繁瑣,僅僅是為了支援越來越多的時下流行的新特性,是不是應在安全性,易用性,針對語言本身個性等方面做更深的考量呢?應該你就是php,不是C++,java,你存在就是因為你是php。好啦,廢話不多說。進入正題。

  正如大家所知道的,php是一門伺服器端的腳本語言,不像c,c++等編譯性語言,它是解釋執行的。在它的文法中指派是怎麼實作的呢?我們看看下面一段代碼吧:

class A
{
  public $foo = 1;
}

$a = new A;
$b = $a; 
$c = $b; 
$d = $c; 
$a->foo = 2;
$a = null;

echo $b->foo . "\n";
echo $c->foo . "\n";
echo $d->foo . "\n";

$c->foo = 3;
$c = null;
echo $d->foo . "\n";
echo $b->foo . "\n";
           

  這段代碼很簡單吧,讓我們看看它的執行結果是什麼吧,在指令行中輸入php class.php:

2
2
2
3
3
           

  應該會有點疑問吧:

  既然我修改了對象a的值是,也影響了其他對象,那麼為什麼我删除對象a的時候,不會影響其他對象呢?

  解釋一下吧:在php中,變量指派的模型是這樣的。

  每一個建立的對象都會有一個全局的id,我們在變量指派時,隻是傳遞該對象的id,通過這個id指向真正的對象内容。當我們修改對個指向同一id的變量時,被它所指的真正對象的内容被修改了,所有修改的結果會影響到其他的變量;而将其中一個變量指派為null僅僅會講這個變量指向一個空變量,不影響其他變量。

  好吧,既然說到這裡了,就接着在講講php中的引用吧。還是以一段代碼進行說明。

class simple_class
{
  public $var = 'a default value';

  public function display_var()
  {
    echo $this->var . "\n";
  }
}


$instance = new simple_class();
$instance->display_var();

$assigned = $instance;
$reference =& $instance;

$instance->var = '$assigned will have this value';

$instance = null;
//$assigned = null;

var_dump($instance);
var_dump($assigned);
var_dump($reference);
           

  執行這段代碼,我們可以看到結果:

a default value
NULL
object(simple_class)#1 (1) {
  ["var"]=>
  string(30) "$assigned will have this value"
}
NULL
expecting 'bar':bar
expecting 'foo':foo
           

  這下應該比較容易解釋了,變量指派是傳遞id,而引用不一樣,同C++中的引用的概念類似,php中的引用是指一個最終内容的多個别名,對它們中的任意一個進行修改都會影響到其他變量,而删除其中的一個變量,其他都會被作用到。

  到這裡都說完了,剛開始學習一門新語言時很多概念需要進行轉變,進而達到适配。到目前為止,本章的主要内容應該搞清楚了,并不難吧,哈哈·~