【问题标题】:Autoloading Problem in Object-Oriented PHP Program面向对象的 PHP 程序中的自动加载问题
【发布时间】:2020-10-23 07:07:15
【问题描述】:

大家下午好。

在过去的 3 天里,我一直在努力使用 PHP 的自动加载功能,该功能旨在简化和统一程序的类文件,所有这些文件都位于一个执行文件中。对于上下文,我目前正在从this tutorial videos学习PHP的OOP视角,不仅是为了在大学做PHP OOP项目之前进一步了解PHP的OOP理解,同时也是为了尝试创建自己的PHP程序,所以ELI5关于请给我解决方案。

根据我从以下视频中学到的知识:Video 1Video 2,我根据我学到的知识编写的自动加载代码似乎工作正常,但是,它给出了两个警告:

警告:include(/classes/person.php):无法打开流:第 12 行的 C:\xampp\htdocs\CollegeTimetableApp\includes\autoloader.php 中没有这样的文件或目录

警告:include():在 C:\xampp\htdocs\CollegeTimetableApp\includes\autoloader.php 中打开 '/classes/person.php' 以包含 (include_path='C:\xampp\php\PEAR') 失败在第 12 行

并且,它给出了如下致命错误消息:

致命错误:未捕获的错误:在 C:\xampp\htdocs\CollegeTimetableApp\includes\index.php:33 中找不到类 'person' 堆栈跟踪:#0 {main} 在 C:\xampp\htdocs\CollegeTimetableApp 中抛出\includes\index.php 第 33 行

我将包含downloadable files,以便任何人与我一起检查和验证。

自动加载文件上的自动加载器代码:

<?php

spl_autoload_register(function($className) {
    include str_replace("\\","/","\classes").'/'.str_replace('\\',"/",$className).'.php';
});

?>

对索引文件的简单执行代码:

<?php

$person1 = new person();
$person1->SetName("Kai");
echo $person1->name;

?>

我的问题:出了什么问题,如何创建功能正常的自动加载功能,以及是否可以从我的程序中进行任何其他更正?

谢谢。

【问题讨论】:

    标签: php autoload


    【解决方案1】:

    尝试将$_SERVER['DOCUMENT_ROOT'] 包含在您的路径中,以及该文件夹中包含您的应用程序的子文件夹中。

    <?php
    
    spl_autoload_register(function($className) {
        $file = $_SERVER['DOCUMENT_ROOT']; // This is the folder you serve files from
        $file .= '/CollegeTimetableApp' // This is the folder in which your app lives
        $file .= str_replace("\\", "/", "\classes"); 
        $file .= '/'; // Consider using DIRECTORY_SEPARATOR instead
        $file .= str_replace('\\', "/", $className);
        $file .= '.php';
        include $file;
    });
    
    ?>
    

    【讨论】:

    • 我从php.net/manual/en/language.oop5.autoload.php#120258 找到了这个自动加载代码。我用它来替换我之前编写的代码,但是,它显示如下错误:致命错误:未捕获的错误:C:\xampp\htdocs\CollegeTimetableApp\includes\index.php:39 堆栈中找不到类'vehicle' trace: #0 {main} throw in C:\xampp\htdocs\CollegeTimetableApp\includes\index.php on line 39。我不明白这个错误的含义,你能详细说明一下吗?非常感谢。
    • 这意味着自动加载器期望在错误消息中提到的文件中定义类vehicle。自动装载机很可能在错误的地方寻找。我发布的代码对您不起作用吗?如果您可以分享您收到的任何错误消息,这将有助于解决这个问题
    • 说实话,您发布的代码脚本不起作用。它显示了两个警告: 警告:include(C:/xampp/htdocs/classes/vehicle.php): failed to open stream: No such file or directory in C:\xampp\htdocs\CollegeTimetableApp\includes\autoloader.php on line 12 和警告:include():在 C:\xampp\htdocs\CollegeTimetableApp\ 中打开 'C:/xampp/htdocs/classes/vehicle.php' 以包含 (include_path='C:\xampp\php\PEAR') 失败在第 12 行包含\autoloader.php
    • 我已经扩展了我的答案以包括 CollegeTimetableApp 这似乎是您的文件所在的位置,以及添加 cmets 来说明每行的作用
    • 您编辑的代码脚本有效!非常感谢!
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 2013-09-05
    • 2017-07-05
    • 2011-11-29
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多