PHP使用include_once引入文件仍报Call to undefined function错误原因?
你遇到的报错核心原因有两个:
- 命名空间未正确导入:目标类
phpIWantToInclude定义在Scripto\Api\Representation命名空间下,而调用方BeepBoop类在Scripto\Form命名空间下,没有显式引入的情况下PHP会默认在当前命名空间下查找目标类,导致找不到类,连带类的方法也无法识别。 - 类方法调用逻辑错误:
theFunctionIWant是phpIWantToInclude的公共实例方法,既不是全局函数,也不是当前BeepBoop类的方法,也没有定义为静态方法,所以无法直接调用、也无法用静态语法调用。
具体修改步骤
- 在调用方文件顶部补充目标类的引入语句,放在现有use语句之后即可:
use Scripto\Api\Representation\phpIWantToInclude;
- 先实例化
phpIWantToInclude类,再调用对应实例方法(注意如果父类AbstractEntityRepresentation的构造方法需要传参,你需要补全对应参数):
修改后BeepBoop类的init方法代码参考:
public function init() { // 实例化目标类 $targetInstance = new phpIWantToInclude(/* 补全构造方法所需参数 */); // 调用目标方法 $var = $targetInstance->theFunctionIWant(); }
你之前尝试的调用方式错误说明
this::theFuctionIWant():this缺少$符号,且该方法不属于当前BeepBoop类,同时方法名拼写错误(少了字母n,应为Function)phpIWantToInclude::theFunctionIWant():目标方法未定义为静态方法,不能用::做静态调用,同时未引入对应命名空间下的类,PHP会判定当前命名空间下不存在该类$this->theFunctionIWant():该方法不属于当前BeepBoop类,无法通过当前类的实例调用phpIWantToInclude->theFunctionIWant():未先实例化类得到对象,不能直接用类名加->调用实例方法,同时存在命名空间未引入的问题
可选补充:如果你不需要用到类的实例属性,可以把目标方法改为静态方法
修改phpIWantToInclude类中的方法定义:
public static function theFunctionIWant() { // 方法逻辑注意不能用到$this return other stuff; }
修改后不需要实例化类,直接用静态语法调用即可:
$var = phpIWantToInclude::theFunctionIWant();
内容的提问来源于stack exchange,提问作者Nicholas Davis
相关产品推荐
相关产品推荐

