【问题标题】:PHP Autoloading Extended ClassesPHP 自动加载扩展类
【发布时间】:2017-01-20 12:27:23
【问题描述】:

根据this question 的回复,我希望我的代码能够工作,但由于某种原因它不是。我有一个简单的类,它从我的类库中扩展了一个类。

_custom.php

$custom = new MyClass();
class MyClass extends MyAbstractClass{

  public function __construct(){
      parent::__construct();
  }

}

不幸的是,我收到了这个致命错误:

致命错误:在...中找不到类“MyClass”

但如果我删除extends MyAbstractClass,那么错误就会消失。问题似乎在于,在尝试扩展类时,它不会尝试加载 MyAbstactClass,这会导致根本找不到 MyClass

对此有何想法或建议?

【问题讨论】:

  • 您确定错误消失了还是出现了更冷/更难调试的错误?
  • 还需要显示自动加载器代码
  • 当我按预期删除比MyClass 自动加载的扩展时...
  • 如果你在你的班级声明之后做$custom = new MyClass();?当您尝试加载它时,该类尚未定义。我的意思是代码是否与您的问题完全相同。不确定这是自动加载问题。
  • 你在哪里加载 MyAbstractClass?

标签: php oop spl-autoload-register


【解决方案1】:

PHP 是一种解释型语言,这意味着 PHP 定义的已知是在语句之​​前解析的代码。

class MyClass extends MyAbstractClass{

  public function __construct(){
      parent::__construct(); #you are forcing a construct call, it is not required if the parent constructor has no args.
  }

}

$custom = new MyClass();

对于类,您可以通过使用自动加载器来防止这种行为,当一个对象被调用但未定义时,它会尝试注入并通过您给定的代码解析该类。

您可以定义魔术函数__autoload(),但首选spl_autoload_register(),因为它更具动态性,而不是像__autoload() 函数那样的常量。

【讨论】:

  • 我想我觉得奇怪的是,在使用 spl_autoload_register() 之前将其按该顺序排列是可行的,在当前的重构中,我实现了自动加载,现在该顺序受到了影响。它现在正在工作,所以这才是最重要的。谢谢你的解释。
  • 它会起作用如果您包含包含类名的文件。我个人使用 PS4 自动加载类,对其进行了修改以使其更高效。它按命名空间包含一个类,还定义了它所在的文件夹。因此,如果我在一个类中use \lib\db\statement,它将尝试从我的“webroot\lib\db\”目录加载“statement.php”。跨度>
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多