在 PHP 中呼叫未定義的函式
你們中的許多人多次遇到過這個錯誤致命錯誤:呼叫未定義的函式 function_name()
。在今天的帖子中,我們正在尋找解決此錯誤的方法。但是在我們解決這個問題之前,讓我們先了解一下 PHP 是如何評估函式的。
有多種方法可以定義函式並呼叫它們。假設你將它寫在 function.php 檔案中並在 main.php 檔案中呼叫它。
// function.php
<?php
namespace fooNamespace {
function foo() {
return "Calling foo"
}
}
?>
// main.php
include function.php
<?php
echo fooNamespace\foo();
?>
名稱空間是限定符,通過對協同工作以執行任務的類進行分組來實現更好的管理。它允許你對多個類使用相同的名稱。瞭解 PHP 如何知道程式碼需要名稱空間的哪個元素很重要。PHP 名稱空間的工作原理類似於檔案系統。有 3 種方法可以訪問檔案系統中的檔案:
- 相對檔名,如
fooBar.txt
。它將解析為fooDirectory/fooBar.txt
,其中 fooDirectory 是當前繁忙的目錄。 - 相對路徑名,如
subdirectory/fooBar.txt
。它將解析為fooDirectory/subdirectory/fooBar.txt
。 - 絕對路徑名,如
/main/fooBar.txt
。它將解析為/main/fooBar.txt
。
PHP 中的名稱空間元素遵循等效的原則。例如,可以通過三種方式指定類名:
- 不合格名稱/不帶字首的類名:
或者,
$a = new foo();
如果當前名稱空間是foo::staticmethod();
foonamespace
,它將始終解析為foonamespace\foo
。如果程式碼是一個全域性的、非名稱空間的程式碼,這將解析為foo
。 - 限定名/帶字首的類名:
或者,
$a = new fooSubnamespace\foo();
如果當前的名稱空間是fooSubnamespace\foo::staticmethod();
foonamespace
,它將始終解析為foonamespace\fooSubnamespace\foo
。如果程式碼是全域性的、非名稱空間的程式碼,則解析為fooSubnamespace\foo
。 - 全限定名/帶全域性字首運算子的字首名:
或者,
$a = new \foonamespace\foo();
這總是解析為程式碼中列出的字面名稱,\foonamespace\foo::staticmethod();
foonamespace\foo
。
現在假設你定義了一個類並在同一名稱空間內呼叫類的方法。
<?php
class foo {
function barFn() {
echo "Hello foo!"
}
function bar() {
barFn();
// interpreter is confused which instance's function is called
$this->barFn();
}
}
$a = new foo();
$a->bar();
?>
$this
偽變數具有當前物件的方法和屬性。這樣的事情是有益的,因為它允許你訪問類的所有成員變數和方法。在類內部,它被稱為 $this->functionName()
。在類之外,它被稱為 $theclass->functionName()
。
$this
是對直譯器為你建立的 PHP object
的引用,它包含一個變數陣列。如果你在普通類的普通方法中呼叫 $this
,$this
會返回該方法所屬的物件。
PHP 呼叫未定義函式出錯的解決步驟
-
驗證檔案是否存在。找到寫入函式定義的 PHP 檔案。
-
使用頁面上上述檔案的
require
(或include
)語句驗證該檔案是否已包含在內。檢查require
/include
中的路徑是否正確。 -
驗證檔名在
require
語句中拼寫是否正確。 -
列印/回顯包含檔案中的單詞以確定它是否已正確包含。
-
在檔案末尾定義了一個單獨的函式並呼叫它。
-
檢查功能是否正確關閉。 (跟蹤大括號)
-
如果你正在呼叫類的方法,請確保編寫了
$this->
。
Shraddha is a JavaScript nerd that utilises it for everything from experimenting to assisting individuals and businesses with day-to-day operations and business growth. She is a writer, chef, and computer programmer. As a senior MEAN/MERN stack developer and project manager with more than 4 years of experience in this sector, she now handles multiple projects. She has been producing technical writing for at least a year and a half. She enjoys coming up with fresh, innovative ideas.
LinkedIn