2012-09-22 35 views
7

當我今天測試了以下代碼我驚奇:PHP如何實現「動態」變量?

$star = "Aquarius"; 
$star = 11; 

調試時,我觀察到$star簡單地改變從string類型integer類型。我對這個功能感到驚訝。以C++爲例,這是不可能的,但在c#中我認爲var變量,但它不一樣。

舉例來說,你不能做的:

var dynamic = "Hello"; 
dynamic = 3; 

我開始懷疑到底發生了什麼在點的時候我基本上說$星級= 11。我的猜測是,$star僅僅是重新初始化,因爲它是直接爲(但這看起來很奇怪,因爲解釋者已經知道變量$star已經被提前聲明)。任何人都可以幫助一些明確或官方源支持解釋?

謝謝。

回答

7

在C/C++的類型在編譯時定義的,因爲該種優化的可能發生的基礎上的。

在C#中,編譯器根據上下文推斷類型,並在編譯器的大腦中將var關鍵字替換爲該類型。這就是爲什麼在編譯器進行初始推斷後你不能改變類型的原因。

在像PHP這樣的腳本語言中,變量是進入哈希映射(關聯數組,符號表)的條目。這定義了命名空間(和範圍)。實際值部分是存儲值和類型的通用對象類型。

+0

哇,太好了。那麼這是否意味着在C#中變量永遠不會真正存儲爲* generic * object類型?是否有可能提供任何資源,我可以學到更多?謝謝 – rtuner

+1

C#是輸出字節碼以在VM上運行的語言。我在PHP例子中提到的'通用對象類型'只不過是一個包含2個成員的'C語言結構體'(我通過這樣說簡化了一些問題)。由於您將三種不同語言(一種用於彙編代碼,一種用於字節碼,一種用於解釋執行)的概念組合起來,所以更多的源代碼很困難。 –

0

PHP是一種動態語言,在精神上與Perl,Ruby,Python或其他類似。另一方面,C++是編譯和靜態類型的,要求每個變量在編譯時定義一個類型。

檢查PHP文檔一些偉大的洞察到PHP的動態類型實現: http://php.net/manual/en/language.types.type-juggling.php

+0

我不認爲這是很什麼,他們正在尋找... –