【问题标题】:Class not found with PSR-0PSR-0 找不到类
【发布时间】:2014-07-03 14:39:20
【问题描述】:

我完全被这个问题所困扰!我正在使用php-simple-html-dom-parser,它加载了 PSR-0。我对 PSR-0 不是很熟悉。但是我按照自述文件显示的方式使用该类,但无法使其正常工作。

在我的 IDE 中,自动完成工作正常,没有显示任何错误。但是当我运行脚本时,我得到了这个错误:

致命错误:在第 3 行的 C:\xampp\htdocs\folder\test.php 中找不到类“Sunra\PhpSimple\HtmlDomParser”

代码:

<?php
use Sunra\PhpSimple\HtmlDomParser;
$dom = HtmlDomParser::file_get_html();

文件结构:

folder\
  Sunra\
    PhpSimple\
      simplehtmldom_1_5\
      HtmlDomParser.php
test.php

正如我所说,我真的不知道出了什么问题。所以可能我正在寻找错误的东西,这就是我发布这个问题的原因。

【问题讨论】:

    标签: php psr-0


    【解决方案1】:

    下载Composer

    在你的项目目录中运行:

    php composer.phar require sunra/php-simple-html-dom-parser ~1.5

    在您的 php 文件(例如 index.php)中,添加:

    <?php
    
    include 'vendor/autoload.php';
    
    use Sunra\PhpSimple\HtmlDomParser;
    
    $dom = HtmlDomParser::file_get_html();
    

    在这里,当您包含vendor/autoload.php 时,composer 生成的自动加载配置会为您处理所有类自动加载。 github 上几乎所有遵循 PSR-0 的库都存在于 Packagist 上,因此可以通过这种方式进行安装。

    您可能需要阅读Semantic Versioning 以了解在需要库时您正在安装什么。

    现在,大多数现代 PHP 框架都使用 Composer 作为其依赖项。但是,对于即使是单个文件的小型项目,它仍然是完全可行的。

    【讨论】:

    • 好吧,我宁愿让他了解什么是自动加载器,也不愿告诉他“只要使用这个框架/工具/任何东西,你就可以了!”
    • 我个人倾向于阅读我使用的工具的来源。如果他和我一样觉得这项技术很吸引人,那么阅读 config composer 生成的内容将是一堂很好的课。
    • 好的,我会调查的。我对这些东西不是很熟悉,但是随着我自己的发展,我越来越多地遇到这个问题。所以我会深入这个!谢谢
    • @Timo002 阅读最新版本的 Laravel 和 Symfony 的安装说明,他们都使用它。一旦掌握了窍门,您甚至可以创建自己的库,以通过 composer 将其包含在其他项目中。
    【解决方案2】:

    好吧,你没有使用 autoloader,所以类不会自动加载。

    这是一个使用 PSR-0 的最小 autoloader example


    了解自动加载后,您应该尝试使用 Composer 等依赖管理框架。有关详细信息,请参阅 Flosculus's 答案。

    【讨论】:

    • 我认为自动加载器是与类本身一起交付的
    • 不,它是一个单独的组件。
    • +1 用于指出我们的实际问题,我知道我的解决方案有点偏题。
    【解决方案3】:

    使用 PSR-0 自动加载器,您是将其添加到 spl_autoload_register('autoload'),还是使用 composer 和包含的 composers 自动加载器?

    这对我有用:

    <?php
    function autoload($className)
    {
        $className = ltrim($className, '\\');
        $fileName  = '';
        $namespace = '';
        if ($lastNsPos = strrpos($className, '\\')) {
            $namespace = substr($className, 0, $lastNsPos);
            $className = substr($className, $lastNsPos + 1);
            $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        }
        $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    
        require $fileName;
    }
    spl_autoload_register('autoload');
    
    use Sunra\PhpSimple\HtmlDomParser;
    
    $dom = HtmlDomParser::file_get_html('http://google.com');
    var_dump($dom);
    ?>
    

    来源:http://www.php-fig.org/psr/psr-0/

    【讨论】:

    • -1。不再推荐使用__autoload()
    猜你喜欢
    • 2016-04-27
    • 2016-11-18
    • 2017-11-20
    • 2015-12-10
    • 2013-02-05
    • 2016-03-21
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多