Php 如何确保在调用/扩展类时加载正确的类文件
我确实浏览了一遍,但我觉得给出的答案并没有充分回答我正在努力解决的问题 我有一个小php项目。在这个项目中,我在自己的文件中定义了两个类。第二个类扩展了第一个类。在app.php文件中,我实例化了第二个类并调用了一个方法Php 如何确保在调用/扩展类时加载正确的类文件,php,oop,Php,Oop,我确实浏览了一遍,但我觉得给出的答案并没有充分回答我正在努力解决的问题 我有一个小php项目。在这个项目中,我在自己的文件中定义了两个类。第二个类扩展了第一个类。在app.php文件中,我实例化了第二个类并调用了一个方法 ├── Models/ │ ├── Class1.php │ └── Class2.php └── app.php 删除该行 include('./Class1.php'); 快速回答 除非您指定了include文件的完整路径,否则PHP将始终尝试根据条目脚本的位置
├── Models/
│ ├── Class1.php
│ └── Class2.php
└── app.php
删除该行
include('./Class1.php');
快速回答
除非您指定了include文件的完整路径,否则PHP将始终尝试根据条目脚本的位置解析文件。在您的例子中,您的输入脚本似乎位于应用程序的根目录下
因此,在Class2.php
中,而不是include('./Class1.php')代码>,您应该编写include('Models/Class1.php')代码>一切都应该正常。但是,虽然它解决了短期问题,但您的代码实际上是不可移植的。此外,两次包含同一文件将导致另一个错误(例如,重新声明类)
稍微聪明一点的方法
更聪明的方法是在Class2.php
中执行此操作
相对路径相对于当前工作目录。(如果必须建立关系,请使用\uuuuu DIR\uuuu
)。在这种情况下,你不需要。扩展
声明本身不需要定义Class1,也就是说,直到您实际实例化它<代码>包含(_DIR__.'/Class1.php')
app.php可能重复的@mario---这是否意味着在'Class2.php'中包含'Class1.php'是不必要的,因为仅在'app.php'中引用Class1
就足够了?如果您有一个中心配置文件(如:autoloader),甚至可能位于文档根目录下,相对路径通常就足够了。(就像在主app.php脚本中使用它一样)。\uuuuu DIR\uuuuu
解决方案主要适用于基于包含的直接引用。(顺便说一句:如果您可以自由地不使用en.vogue大小写混合文件名,那么就不要使用。这是90年代的遗留问题,如果使用逐字自动加载,则不太符合语言。PHP标识符不区分大小写。)显然添加了include(_udir../DB.Class.PHP')代码>解决了很多问题。伊利亚(这个“@”不适合你处理…)起初我给你投了反对票,但经过一些尝试后发现你的答案实际上解决了一个错误,然后对你的答案投了赞成票。如果我直截了当地说,这是摆脱警告的最简单的解决方案。我接受另一个答案的唯一原因是因为有大量的信息可以让我用我的小脚本更好地解决这个问题。它不是在任何地方被称为国有企业,而是在后台,看不见的东西。我想我会尝试去作曲家的路线,我喜欢标准,所以我会研究spr-4标准和PHPFIG网站。谢谢你详尽的回答!作曲家也在后台使用spl\u autoload\u寄存器
:-)。如果您想学习,可以在注册的函数中使用var\u dump
,查看何时何地触发。当然,使用composer autoload比手工编写自己的autoloader简单得多。PSR-4已经成为PHP世界中的一个实际标准,所以遵循它比自己动手练习更明智。
{
"autoload": {
"psr-4": {
"Model\\": "Model/"
}
}
}