2014-12-24 4 views
0

Я прочитал ответы на те же вопросы здесь, в SO, но они не помогли мне решить мою проблему.SPL Autoload не загружает класс

У меня есть следующие структуры каталогов:

enter image description here

И этот класс:

namespace Util; 

final class Autoloader 
{ 
    public static function loader($class) 
    { 
     define('PHP_FILE_EXTENSION', '.php'); 
     $filename = ''; 
     $file = ''; 
     $phisicalFilePath = ''; 

     $filename = $class . PHP_FILE_EXTENSION; 
     $phisicalFilePath = __DIR__ . DIRECTORY_SEPARATOR . $filename; 

     if (file_exists($phisicalFilePath)) { 
      require_once 'util/' . $filename; 
     } 
    } 
} 

я использую выше класс, как следует из bootstrap.php файла:

require_once('util/Autoloader.php'); 

spl_autoload_register('Util\Autoloader::loader'); 

И я все называю от index.php файл:

require_once('bootstrap.php'); 

echo StringUtils::randomString(10); 

Но к сожалению, SPL автозагрузка не загружает класс:

Fatal error: Class 'StringUtils' not found in 'xxx\index.php' on line 5 

Что я делаю неправильно?

+0

Позаботьтесь: 'StringUtils'! ==' stringutils' –

+0

@MarkBaker Да, это было последнее изменение. Я обновлю фотографию. – leoMestizo

+0

вы проверяете существование одного файла ('$ phisicalFilePath'), но включаете другое (' 'back-end/util /'. $ Filename') –

ответ

1

У меня есть другое решение. Это может быть полезно, если вы хотите продолжить разработку в PHP.

Посмотрите на эту статью - http://www.php-fig.org/psr/psr-0/ и http://www.php-fig.org/psr/psr-4/. Они содержат официально утвержденные стандарты в отношении структуры классов для проектов на базе PHP.

Мы не должны расследовать колесо в таких случаях - поэтому старайтесь поддерживать связь с «официальными стандартами», если это возможно.


Я создал примерный проект, чтобы показать, как применять указанные правила.

Структура проекта:

Project tree

Autoloader.php был скопирован здесь: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md#class-example. Единственное различие заключается в том, что мой автозагрузчик был помещен в пространство имен Util, и его класс был переименован в Autoloader.

Account.php Тогда содержит:

<?php 

namespace Model; 

class Account { } 

И index.php:

<?php 

require_once('Util/Autoloader.php'); 

$autoloader = new \Util\Autoloader(); 
$autoloader->addNamespace('\Model\\', __DIR__ . '/Model'); 
$autoloader->register(); 

$model = new \Model\Account(); 
+1

Еще один случай «рекомендуется» группой взаимодействия с платформой, но определенно рекомендуется для использования в любом приложении –

+0

Я только что изменил свой код, чтобы использовать пример обратного вызова PSR-4, и он не работал, но спасибо за предложение , – leoMestizo

+1

@leoMestizo, подождите минуту. Я обновлю свой ответ на примере –

0

Я просто сделал проект, как ваши годы и скопировали файлы содержимого. это работает для меня. нет проблем с вашим кодом.

+0

Это имеет большой смысл ... Я просто хочу изменить свой код, чтобы использовать 'include', и я получаю ту же ошибку. – leoMestizo

+0

Я думаю, что есть только одна причина, по которой код работает над моей системой и, к сожалению, не работает в вашей системе. проверьте разрешение вашего файла StringUtils.php. – mhndev

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