2017-07-04 1 views
0

マイプロジェクト構造は以下の通りです:オートローダーを調整してクラスをロードするにはどうしたらいいですか?

. 
└── 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 Warning: require_once(/srv/http/libro_php7/src/asic.php): failed to open stream: No such file or directory in /srv/http/libro_php7/init.php on line 11 PHP Fatal error: require_once(): Failed opening required '/srv/http/libro_php7/src/asic.php' (include_path='.:') in /srv/http/libro_php7/init.php on line 11

ありがとう!すべての

答えて

0

オートローダ

まず、あなたはおそらく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); 
関連する問題