2013-04-18 2 views
0

Я следующую структуру каталогов:
/var/www/Project1/Project1.php
/var/www/Project1/User/UserProfile.php
Внутри Project1.php:
PHP Namespaces автозагрузку

<?php 
namespace Project1; 
set_include_path(__DIR__); 
spl_autoload_extensions('.php'); 
spl_autoload_register(); 

use User\UserProfile; 

$u = new Avatar(); 
... 

?> 

Внутри UserProfile.php:

<?php  
namespace Project1\User; 
class Avatar{ 
} 
... 
?> 

Когда я исполняю php Project1.php Я получаю:

PHP Fatal error: spl_autoload9(): Class User\UserProfile could not be loaded

Я не вижу проблемы.

ответ

1

spl_autoload_register();, когда вызываемые без параметров просто регистрируют автозагрузчик по умолчанию, который не может обрабатывать пространства имен с макетом проекта. Вам нужно будет зарегистрировать свой собственный метод, чтобы он работал. Например:

spl_autoload_register('my_autoload'); 

И вот функция автозагрузки. Эта функция ожидает, что классы должны храниться таким образом, как:

/path/to/project/Namespace/Classname.php 
/path/to/project/Namespace/Subnamespace/Classname.php 

Вы можете назвать классы как \Namespaces\Classname или старому стилю Namespace_Classname:

function my_autoload ($classname) { 
    // if the class where already loaded. should not happen 
    if (class_exists($classname)) { 
     return true; 
    } 

    // Works for PEAR style class names and namespaced class names 
    $path = str_replace(
     array('_', '\\'), 
     '/', 
     $classname 
    ) . '.php'; 

    if (file_exists('/path/to/project/' . $tail)) { 
     include_once 'path/to/project/' . $tail; 
     return true; 
    } 

    return false; 
} 

Заметим, что функция берется из моего GitHub пакет Jm_Autoloader. Пакет предоставляет больше функциональности, поскольку несколько включают пути, префиксы пути и статическую автозагрузку (с предопределенным именем имени массива ассоциированного массива =>). Вы можете использовать его, если хотите;)

Смежные вопросы