在 PHP 中呼叫未定義的函式

Shraddha Paghdar 2022年5月14日
PHP
在 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 種方法可以訪問檔案系統中的檔案:

  1. 相對檔名,如 fooBar.txt。它將解析為 fooDirectory/fooBar.txt,其中 fooDirectory 是當前繁忙的目錄。
  2. 相對路徑名,如 subdirectory/fooBar.txt。它將解析為 fooDirectory/subdirectory/fooBar.txt
  3. 絕對路徑名,如/main/fooBar.txt。它將解析為/main/fooBar.txt

PHP 中的名稱空間元素遵循等效的原則。例如,可以通過三種方式指定類名:

  1. 不合格名稱/不帶字首的類名:
    $a = new foo();
    
    或者,
    foo::staticmethod();
    
    如果當前名稱空間是 foonamespace,它將始終解析為 foonamespace\foo。如果程式碼是一個全域性的、非名稱空間的程式碼,這將解析為 foo
  2. 限定名/帶字首的類名:
    $a = new fooSubnamespace\foo();
    
    或者,
    fooSubnamespace\foo::staticmethod();
    
    如果當前的名稱空間是 foonamespace,它將始終解析為 foonamespace\fooSubnamespace\foo。如果程式碼是全域性的、非名稱空間的程式碼,則解析為 fooSubnamespace\foo
  3. 全限定名/帶全域性字首運算子的字首名:
    $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 Paghdar avatar Shraddha Paghdar avatar

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