2014-04-09 6 views
1

Я хочу автозагрузку использовать пространство имен в моих классах, но я получаю сообщение об ошибке в index.phpПространство имен и ошибка автозагрузки, как правильно использовать пространства имен PHP с автозагрузкой?

Error: Fatal error: Class 'foo\B' not found ... 

Пример:

каталоги скелет:

\var\www 
     |_ foo 
     | |_ A.php 
     | |_ B.php 
     | 
     |_ view 
     | |_ index.php 

A.php

<?php 

namespace foo; 

class A { 

    private $a; 

    public function __construct($a) { 
     $this->a = $a; 
    } 

} 

B.php

<?php 

namespace foo; 

use foo\A; 

class B extends A { 

    private $b; 

    public function __construct($a, $b) { 
     parent::__construct($a); 
     $this->b = $b; 
    } 

} 

И Index.php

<?php 

use foo\B; 

define('ROOT', __DIR__ . DIRECTORY_SEPARATOR); 

$b = new B('s', 2); 

function __autoload($classname) { 
    $namespace = substr($classname, 0, strrpos($classname, '\\')); 
    $namespace = str_replace('\\', DIRECTORY_SEPARATOR, $classname); 
    $classPath = ROOT . str_replace('\\', '/', $namespace) . '.php'; 

    if(is_readable($classPath)) { 
     require_once $classPath; 
    } 
} 

Этот вопрос почти так же, как этот: PHP autoload namespace, но я включаю index.php в другой папке и не работает.

Если я поместил тот же проект, но со скелетом следующих каталогов, я не получаю никаких ошибок.

\var\www 
     |_ foo 
     | |_ A.php 
     | |_ B.php 
     | 
     |_ index.php 

вопрос: почему, если я ставлю index.php в папке не работает?

Благодаря

ответ

1

Это потому, что константа ROOT указывает на /var/www/view/, не /var/www/. Он изменяется при перемещении index.php в другой каталог.

Возможно, вы захотите взглянуть на функцию set_include_path(). С этим вы можете установить несколько определений корневых каталогов. Затем вы можете потерять постоянную ROOT.