【问题标题】:How can I adjust my autoloader so it will load my classes?如何调整我的自动加载器以便加载我的类?
【发布时间】:2017-12-07 21:01:04
【问题描述】:

我的项目结构如下:

.
└── src
    ├── Domain
    │   ├── Customer
    │   │   ├── Basic.php
    │   │   └── Premium.php
    │   ├── Book.php
    │   ├── Customer.php
    │   ├── Payer.php
    │   └── Person.php
    └── init.php

我的脚本init.php 包含以下内容:

<?php

use Bookstore\Domain\Book;
use Bookstore\Domain\Customer;

function autoloader($classname) {
    $lastSlash = strpos($classname, '\\') + 1;
    $classname = substr($classname, $lastSlash);
    $directory = str_replace('\\', '/', $classname);
    $filename = __DIR__ . '/src/' . $directory . '.php';
    require_once($filename);
}

spl_autoload_register('autoloader');

$basic = new Basic(1, "name", "surname", "email");
$premium = new Premium(2, "name", "surname", "email");
var_dump($basic);
var_dump($premium);

我的错误是:

PHP 警告:require_once(/srv/http/libro_php7/src/asic.php):无法打开流:第 11 行的 /srv/http/libro_php7/init.php 中没有此类文件或目录 PHP 致命错误:require_once(): Failed opening required '/srv/http/libro_php7/src/asic.php' (include_path='.:') in /srv/http/libro_php7/init.php on line 11

谢谢!

【问题讨论】:

    标签: php namespaces autoload


    【解决方案1】:

    自动加载器

    首先,您应该调整您的自动加载器以忽略不在Bookstore 命名空间内的类名,并将其简化为:

    function autoloader($classname) {
        /**
         * only handle classnames starting with "Bookstore\"
         */
        if (0 === strpos($className, 'Bookstore\\')) {
            $filename = __DIR__ . '/src/' . str_replace('\\', '/', $className) . '.php';
    
            require_once $filename;
        }
    }
    

    进口

    其次,您缺少导入(这就是自动加载器无法正确找到您的类的原因

    • Bookstore\Domain\Customer\Basic
    • Bookstore\Domain\Customer\Premium(事件还没到这一步,在创建它的实例之前失败)

    调整进口

    <?php
    
    use Bookstore\Domain\Book;
    use Bookstore\Domain\Customer\Basic;
    use Bookstore\Domain\Customer\Premium;
    
    // see definition above
    spl_autoload_register('autoloader');
    
    $basic = new Basic(1, "name", "surname", "email");
    $premium = new Premium(2, "name", "surname", "email");
    var_dump($basic);
    var_dump($premium);
    

    与导入相关的引用类

    <?php
    
    use Bookstore\Domain\Book;
    use Bookstore\Domain\Customer;
    
    // see definition above
    spl_autoload_register('autoloader');
    
    $basic = new Customer\Basic(1, "name", "surname", "email");
    $premium = new Customer\Premium(2, "name", "surname", "email");
    var_dump($basic);
    var_dump($premium);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-30
      • 2014-06-16
      • 1970-01-01
      • 2015-09-15
      • 2020-02-08
      • 2016-06-27
      • 2019-06-08
      • 2017-11-28
      相关资源
      最近更新 更多