2017-02-18 39 views
0

с использованием SplClassLoader. Я продолжаю получать ошибку class not found. Я пробовал различные sources, скопировал их точную структуру папок и назвал но еще not found.PHP Класс SplClassLoader не найден

Моя структура

application 
    - Router 
    - Exceptions 
     - HttpException.php 
    - Klein.php 
index.php 
SplClassLoader.php 

index.php

$loader = new SplClassLoader('application', 'application'); 
$loader->register(); 
$klein = new \router\Klein(); 

Klein.php

namespace application\router; 
    class Klein{ 
     __construct() 

HttpException.php

namespace Klein\Exceptions; 

use RuntimeException; 

class HttpException extends RuntimeException implements HttpExceptionInterface 
{ 

Как включить оба эти параметра в классLoader?

Точная ошибка: Fatal error: Class 'router\Klein' not found in /home/i366963/domains/[domain]/private_html/public/index.php on line 44

линия 44 является $klein = new \router\Klein();

Предложение:

$loader = new SplClassLoader('application', 'application'); 
$loader->register(); 
$klein = new application\Router\Klein(); 

ошибка дает:

Warning: require(application/application/Router/Klein.php): failed to open stream: No such file or directory in /home/i366963/domains/[domain]/private_html/SplClassLoader.php on line 140 

Fatal error: require(): Failed opening required 'application/application/Router/Klein.php' (include_path='.:/usr/local/lib/php') in /home/i366963/domains/[domain]/private_html/SplClassLoader.php on line 140 
+0

Опубликовать точное сообщение об ошибке целиком. – Augwa

+0

@Augwa добавил ошибку внизу. –

+0

ваше пространство имен \ application \ router, а не \ router. измените на new \ application \ router \. Кроме того, если вы используете это в Unix, ваше имя каталога зависит от регистра, что означает, что вам нужно либо изменить имя каталога на «маршрутизатор», либо обновить пространство имен, чтобы оно было «application \ Router» – Augwa

ответ

1

Так, глядя на подпись SplClassLoader, ожидает два параметра

$ns (namespace)

$includePath

Так прямо сейчас вы добавляете пространство имен «приложения» и поиск в каталоге «приложения».

Это означает, что это означает, что пространство имен приложений будет иметь префикс всего, что находится в каталоге приложения.

Итак, когда вы загружаете \ application \ router, он ищет в каталоге приложение \ приложение.

Вы можете решить это, выполнив $loader = new SplClassLoader('application');, что означает, что он будет искать только из текущего каталога вперед.

Теперь, глядя на ваши другие опубликованные классы, вы столкнетесь с проблемами, поскольку ваши пространства имен не соответствуют стандарту PSR-0, поэтому вам нужно убедиться, что ваши пространства имен соответствуют вашей структуре каталогов и имени файла точно (он чувствителен к регистру в любой системе на основе * nix)

+0

Отлично! Я предположил, что имя папки будет достаточным. –