在 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