【问题标题】:SPL Autoload doesn't load classSPL 自动加载不加载类
【发布时间】:2014-12-24 21:11:15
【问题描述】:

我已经在 SO 阅读了相同问题的答案,但它们并没有帮助我解决我的问题。

我的目录结构如下:

还有这个类:

namespace Util;

final class Autoloader
{
    public static function loader($class)
    {
        define('PHP_FILE_EXTENSION', '.php');
        $filename = '';
        $file = '';
        $phisicalFilePath = '';

        $filename = $class . PHP_FILE_EXTENSION;
        $phisicalFilePath = __DIR__ . DIRECTORY_SEPARATOR . $filename;

        if (file_exists($phisicalFilePath)) {
            require_once 'util/' . $filename;
        }
    }
}

我使用bootstrap.php文件中的上述类如下:

require_once('util/Autoloader.php');

spl_autoload_register('Util\Autoloader::loader');

我从index.php 文件中调用所有内容:

require_once('bootstrap.php');

echo StringUtils::randomString(10);

但不幸的是,SPL 自动加载不会加载类:

Fatal error: Class 'StringUtils' not found in 'xxx\index.php' on line 5

我做错了什么?

【问题讨论】:

  • 保重:StringUtils !== stringutils
  • @MarkBaker 是的,这是最后一刻的改变。我会更新图片。
  • 您正在检查一个文件是否存在 ($phisicalFilePath),但包含另一个文件 ('back-end/util/' . $filename)
  • @Lashane 是的,但我也尝试了util/$filename,但没有成功。
  • util/$filename 与$phisicalFilePath 不同

标签: php spl-autoload-register


【解决方案1】:

我有另一个解决方案。如果您想继续使用 PHP 进行开发,它可能会很有用。

看看这篇文章 - http://www.php-fig.org/psr/psr-0/ 和 http://www.php-fig.org/psr/psr-4/。它们包含官方批准的关于基于 PHP 的项目的类结构的标准。

在这种情况下,我们不应该调查车轮 - 因此,如果可能,请尽量与“官方标准”保持联系。


我创建了示例项目来展示如何应用上述规则。

项目结构:

Autoloader.php 是从这里复制的:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md#class-example。唯一的区别是我的自动加载器被放置在命名空间Util 并且它的类被重命名为Autoloader。

那么Account.php 包含:

<?php

namespace Model;

class Account { }

还有index.php:

<?php

require_once('Util/Autoloader.php');

$autoloader = new \Util\Autoloader();
$autoloader->addNamespace('\Model\\', __DIR__ . '/Model');
$autoloader->register();

$model = new \Model\Account();

【讨论】:

  • 更多框架互操作性小组“推荐”的案例,但肯定推荐在任何应用程序中使用
  • 我刚刚更改了我的代码以使用 PSR-4 回调示例,但它不起作用,但感谢您的建议。
  • @leoMestizo,等一下 - 我会用示例更新我的答案
  • 引用“官方标准”很好。但请记住,总有一天人们会意识到,他们已经被语言破坏和最低效的逐个文件自动加载方案所欺骗。
  • @mario,我认为您在谈论当前的自动加载解决方案,该解决方案被接受为“官方标准”。而不是对 PHP 本身进行更深入的工作,例如在语言级别实现“导入”机制。你是说这个吧?
【解决方案2】:

我刚刚创建了一个项目作为您的项目并复制了您的文件内容。 这个对我有用。 您的代码没有问题。

【讨论】:

  • 这很有意义...我只是将我的代码更改为使用include,我得到了同样的错误。
  • 我认为代码在我的系统上运行但不幸的是在您的系统上无法运行的原因只有一个。检查您的 StringUtils.php 文件的权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2014-12-07
  • 2018-12-04
  • 2013-07-19
  • 2017-04-05
  • 2010-12-07
相关资源
最近更新 更多