我收到一个错误,指出在required_once语句中找不到文件。全面披露;我不是一个完整的n00b人,但是当我使用php时距离我并不遥远。
在一个专用于Models文件夹内的类的文件中,我试图要求一个位于同级文件夹内的文件。我试图声明名称空间,试图要求然后“使用”文件,我尝试一个或另一个,尝试所有三个或任意组合,但都失败了,只是出现了不同但相似的错误消息。
这总是提供第一个错误:
// Models/Weather.class.php
<?php
require_once '../assets/helpers.php';
警告:include(.. \ assets \ helpers.php):无法打开流:第5行的C:\ xampp \ htdocs \ test \ Models \ Weather.class.php中没有此类文件或目录
helpers文件开始如下所示:
// assets/helpers.php
<?php
/**
* Send a GET request using cURL
*/
function curl_get($url, ...
VS代码提示我在输入php时可以在哪里找到文件,因此,我相当确定我在正确的位置引用了正确的文件,但是当我在xampp中运行脚本时,我得到了错误。
当我使用文件的绝对路径时,没有问题,但是为什么我需要这样做?我希望能够使用相对文件路径在我的类方法中使用helpers.php文件中的功能。
现在,当我使用绝对路径时,会出现下一个错误:
致命错误:未捕获错误:在C:\ xampp \ htdocs \ test \ index.php:7中找不到类'DB'堆栈跟踪:#0 {main}抛出在C:\ xampp \ htdocs \ test \ index中.php在第7行
// index.php
<?php
require_once 'Models/Weather.class.php';
require_once 'Models/DB.class.php';
$DB = new DB('weather'); // line 7
如果我也这样做,但添加行use Models\DB;
,错误消息将变为
致命错误:未捕获错误:在C:\ xampp \ htdocs \ test \ index.php:10中找不到类'Models \ PDO':堆栈跟踪:#0 {main}抛出在C:\ xampp \ htdocs \ test中\ index.php,第10行
第10行与上面的行相同,该行创建一个DB类实例。
我一直在尝试不同角度的代码,已经有好几天了。这应该很容易,将一个文件包含在另一个文件中。只需使用include
或require
,鲍勃便是您叔叔,轻松自在。那就是我的想法,但是我正在拔头发,而且我没有前进。我确定这是微不足道的,我正在忽略……您能帮帮我吗?
仍然有错误,但是感谢@Genhis,我在文档中的注释中实现了spl_autoload_register()
自动加载器,并回显了正在自动加载的内容,并创建了一个仅包含一个require和一个实例化的测试文件。 ;
<?php
spl_autoload_register(function ($class_name) {
if (file_exists($class_name . '.php')) {
require $class_name . '.php';
echo $class_name . ' exists'. "\n<br>";
return TRUE;
}
echo $class_name . ' does not exists' . "\n<br>";
return FALSE;
});
use db\DB; // gave the classes their own dir
$db = new DB('weather');
现在第一个输出是:
Models \ DB存在 型号\ PDO不存在
致命错误:未捕获错误:在C:\ xampp \ htdocs \ test \ test.php:15中找不到类'db \ PDO':堆栈跟踪:#0 {main}抛出在C:\ xampp \ htdocs \ test中\ test.php,第15行
DP类具有一个选项私有变量:
private $options = [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
];
当我删除变量时,尝试建立与数据库的连接时出现错误。我是否需要包含/需要pdo(头发更多)?
答案 0 :(得分:0)
当我使用文件的绝对路径时,没有问题,但是为什么我需要这样做?
如果该文件包含在其他文件中,则您的相对路径来自第一个文件-{main}
。
考虑一下-如果您直接致电dir1/include1.php
,一切都会正常;如果您先致电index.php
,则会收到错误消息:
root / index.php
include("dir1/include1.php");
//error: can't find file "root/../dir2/include2.php"
root / dir1 / include1.php
include("../dir2/include2.php");
root / dir2 / include2.php
为解决此问题,当我必须包括辅助函数和类似文件时,我使用了绝对路径。
致命错误:未捕获错误:在C:\ xampp \ htdocs \ test \ index.php:7中找不到类'DB'堆栈跟踪:#0 {main}抛出在C:\ xampp \ htdocs \ test \ index中.php在第7行
如果您的类具有名称空间,则应使用use
语句或完全限定的名称。
致命错误:未捕获错误:在C:\ xampp \ htdocs \ test \ index.php:10中找不到类'Models \ PDO':堆栈跟踪:#0 {main}抛出在C:\ xampp \ htdocs \ test中\ index.php,第10行
您的类DB
依赖于另一个尚未加载的类。您应该使用一个函数来处理按需加载的类(例如spl_autoload_register()
)或使用诸如Composer之类的框架。
答案 1 :(得分:0)
好的,我找到了答案,这在很大程度上是由于我对php的经验不足。
我不应该require
-在定义了类的文件中,而是在正在被调用/实例化的文件中。
所以:
// index.php
<?php
require_once 'Models/Weather.class.php';
require_once 'Models/DB.class.php';
$DB = new DB('weather');
..应该包含helpers.php
文件。因为即使我在类定义中使用了helpers.php
文件中的函数,该函数也仅在实例化该类的地方使用。在这种情况下,index.php
文件。
因此在此处添加包含/要求...:
// index.php
<?php
require_once 'Models/Weather.class.php';
require_once 'Models/DB.class.php';
require 'assets/helpers.php';
$DB = new DB('weather')
...解决了所有问题。
为什么要求在错误的位置放置文件会导致DPO错误消息,我仍然不明白。
我将离开问题,因为对我而言,这是“啊哈,我现在明白了”的时刻。 感谢您的输入,现在已经删除他们的注释的人,使用自动加载器非常有用,我将在使用类的文件中包含自动加载器!