在 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