2011-03-20 61 views
2

我知道他們是,問題的長版本是:函數中的靜態變量是否初始化爲NULL(手動)?

在PHP手冊中,它聲明靜態函數變量初始化爲NULL並認爲是空的?

<?php 
function foo() { 
    static $static; 
} 

例如:在foo中,值爲$ static的第一次調用時是否初始化?

我記得這是寫在PHP Manual,但我沒有收藏位置。過去三天,我試圖再次找到它,但沒有運氣。

我正在尋找具有權威性的文件,因此可以強調聲明。例如,PHP手冊中的一個頁面明確說明哪些值已經初始化爲沒有指定的值,不幸的是,手冊中的Using static variables未提供任何關於此的信息。 基於on the source-code of the PHP language(不是PHP腳本)的證明就足夠了,但我仍然不擅長閱讀PHP源代碼。

回答

3

http://us.php.net/manual/en/language.types.null.php

變量被認爲是零,如果 :

  • 它已經分配了恆定NULL。

  • 它尚未設置爲任何值。

  • 它已被取消設置()。

由於一個靜態變量是變量,則上述(第二點)充分地回答您的問題。現在有人要證明,手冊指出靜態變量的行爲不同。

我想,如果他預計該手冊對每一種類型的變量的一式兩份的方式解釋了每個工作正是關於初始化,鑄造,數學運算以同樣的方式,等

+0

我認爲那是我一直在尋找的網頁。非常感謝,我非常尋找靜態關鍵字,我一定忽略了它。我知道它在那裏!再次感謝! – hakre 2011-03-22 11:02:51

0

假設真有PHP的一個一個的實現是在那裏,你可以採取的證明了概念的任何腳本,並利用其輸出作爲「權威」證明:

[email protected]:~$ cat z.php 
<?php 

function foo() { 
     static $bar; 
     var_dump($bar); 
} 

foo(); 
[email protected]:~$ php z.php 
NULL 

所以,是的,它會似乎聲明但未顯式初始化的靜態變量賦值爲NULL值。

+0

由於一個特殊的部分人會感到失望爲你的答案。正如我的問題所寫,我知道它是NULL。不僅僅是技術問題,這對我來說是一個文檔問題。在我的問題中,我看起來沒有足夠清楚。 – hakre 2011-03-20 18:56:05

1

我正在尋找一份文件,授權

你不需要任何steenking文件。嘗試測試代碼。從PHP的交互的shell:

php > function foo() { static $bar; var_export($bar); } 
php > foo(); 
NULL 

因此,我們知道,至少在PHP 5.3中,靜態變量工作就像正常的變量:他們是null直到給出一個值

你期望什麼?你爲什麼問這個問題?你是否有奇怪的行爲?

+0

感謝您的回答。正如我的問題所寫,我知道它是NULL。不僅僅是技術問題,這對我來說是一個文檔問題。 PHP 5.3不是一個完整的PHP版本標識,您準確地使用了哪個版本進行了該測試? – hakre 2011-03-20 18:54:48

+0

我在5.3.3中測試了這個,並且在5.0.4(ewwwwwwww)和5.2.6(eww)上也驗證了這個行爲。我會再問一次:**你期望什麼?你爲什麼問這個問題?你是否得到了奇怪的行爲?**雖然他們過去經常在4.x天內改變隨機行爲,但他們已經完成了[徹底的工作記錄5.x行爲改變](http://www.php.net/manual /en/appendices.php)。 – Charles 2011-03-20 19:52:33

+0

感謝Charles提供的額外信息。我個人沒有得到不同的行爲。我只需要文檔中的規範,這就是我所要求的。 – hakre 2011-03-21 01:42:11

0

靜態變量被初始化爲空。

class MyClass { 
    static $var; 
} 

var_dump(MyClass::$var); // returns NULL 
+0

他指的是函數內部的靜態變量,而不是類。 – 2011-03-20 17:18:44

+0

沒有區別。它也和''var;'一樣;所有已聲明但沒有賦值的變量都是空的。 – 2011-03-21 02:56:53

2

轉到http://www.php.net/manual/en/language.variables.basics.php和向下滾動到未初始化的變量的 實施例#1的默認值。你會看到它的解釋

未設置和未被引用(沒有使用 上下文)變量;輸出NULL

+1

文檔的這部分不是指靜態變量,而是關於一般變量。您選擇的示例尤其是關於未定義的變量(未設置)。定義了靜態變量,因此它們不同(例如,不給出警告)。 – hakre 2011-03-20 19:18:31