2010-10-04 48 views
1

我只是想確認一些事情,因爲我的理解被我在另一臺服務器上做過的測試動搖了,我希望某些東西能夠工作,但事實並非如此。請參閱下面的代碼中的問題。包括函數調用

<?php 

function xyz(){ 
} 

include("test.php"); 
/* 
* A function in the above include checks if the function abc function_exists(). 
* Will it return a true? What about for xyz? 
*/ 

function abc(){ 
} 

?> 

感謝所有

回答

3

您可以將包含文件複製並粘貼到include語句所在的位置。
所以真的,你在看:

function xyz(){ 
} 

var_dump(function_exists('xyz')); 
var_dump(function_exists('abc')); 

function abc(){ 
} 

兩者均返回true,如證明here(即:在腳本中定義的函數都可以訪問在任何時候)。

查看nikic的例外答案。

+0

謝謝您的確認,這是我的理解。在另一臺服務器上的代碼必須有其他錯誤,有些配置......無論如何,這個問題和解決問題一樣好。 :) – Abs 2010-10-04 15:20:42

0

的腳本解析從上到下。所以當包含test.php時,xyz將存在,但abc不會。 Whups,我在想別的事情,但是NullUserException是正確的。根據function_exists(),加載頁面上的所有功能都將存在。

+0

你到底在想什麼? – NullUserException 2010-10-04 15:15:48

0

無論我檢查它的存在,abc都存在。這可能是由於PHP引擎可能會解析代碼並在doint之前首先創建所有函數:它可能會用「function foobar()」讀取所有行,然後執行代碼的其餘部分

0

即使在檢查代碼之後聲明瞭函數,它看起來仍然存在。

<?php 

echo function_exists('abc').PHP_EOL; 
echo function_exists('xyz').PHP_EOL; 

function xyz(){ 
} 

function abc(){ 
} 

?> 

我不知道爲什麼會發生這種情況,但可能是因爲PHP代碼在運行之前被編譯爲內部格式。所以所有的功能將在編譯之後和運行之前創建。

問候, 阿林

2

在PHP的功能並不需要聲明它是用來或引用之前。這隻有一個例外:如果函數是有條件地定義的(在if語句中),則該函數僅在執行if語句後纔可用。 (但是,這是合乎邏輯的,因爲PHP不知道是否if會或不會計算。)

manual

功能不需要定義 之前被引用,除了當一個 函數有條件地定義爲 ,如下面兩個示例所示。

當一個函數被定義爲 有條件的方式,例如顯示的兩個 示例。其定義必須在被調用之前處理爲 。

+0

這不會屬於這種特殊情況:if(function_exists('xyz')){'自從它調用內建的函數以來就存在。 – Abs 2010-10-04 15:26:01

+0

這會工作;)如果你有條件地引用一個函數就沒關係。只有在*條件中定義了函數('if(false){function fooBar(){}}'),它纔會起作用。 – NikiC 2010-10-04 15:30:39