2012-06-19 4 views
3

Я использую PHP ActiveRecord с моей небольшой инфраструктурой MVC, в которую входит автозагрузчик. В моем контроллере я, например, обращаюсь к модели Pub :: find (64).php autoloader Fatal error: Class not found

Моя проблема заключается в том, что Pub :: найти (64) inheritating пространство имен контроллера и я получаю ошибку

Fatal error: Class 'App\Controllers\Pub' not found in /home/i554246/public_html/mvc/App/Controllers/Index.php on line 27 

Pub это имя модуля. Файл включается в порядке. Я могу решить эту проблему, добавив \ Pub :: find (64), но это не очень интуитивно для новых людей в проекте.

Есть ли способ остановить пространство имен, добавляемое для Pub :: find (64), не изменяя эту строку?

Index Контроллер

namespace App\Controllers; 

class Index extends \Core\Controller 
{ 
    protected 
     $title = 'Home' 
     ; 

    /** 
    * Default action 
    */ 
    public function index() 
    { 
     // Pass the data to the view to display it 
     $this->view->set('testdb', \Pub::find(64)); 

    } 
} 

app.php

/** 
* Class autoloader 
* @param $className 
* @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md 
*/ 
public function autoload($className) 
{ 
    preg_match('/(^.+\\\)?([^\\\]+)$/', ltrim($className, '\\'), $match); 

    //Build namespace Autoloading 
    $file = str_replace('\\', '/', $match[1]) . str_replace('_', '/', $match[2]) . '.php'; 

    //Build Model path 
    $model = 'App/Models/' . $match[2] . '.php'; 

    if (is_file($file)) { 
     require $file; 
    }elseif (is_file($model)) { 
     require $model; 
    } 

} 

Модели/Pub.php

class Pub extends ActiveRecord\Model 
{ 
} 
+0

Какова ваша версия PHP? Здесь (правильно, как я не делал класс 'Pub') говорит _« Fatal error: Class 'Pub «not found» _, если я использую ваш индекс, так как '\ Pub' является полностью квалифицированным именем. _However_, это не будет первый раз, когда фреймворк _'ttimizes'_-код, загружая все виды деклараций классов в один длинный файл кеша и включает это вместо вашего фактического кода. Выполняет ли это 'PHP ActiveRecord'? Что означает 'get_included_files()' прямо перед этим '\ Pub'? Что он говорит правильно _ после того, как вы используете другую (рабочую) модель? – Wrikken

+0

PHP-версия 5.3.10, никакая фреймворк не является моей собственной очень маленькой только с автозагрузчиком. Я добавляю модули, и я использую PHP ActiveRecord –

+0

Hm, точно так же, как и мой (Debian 'PHP 5.3.10-2 (cli) (построен: 20 февраля 2012 21:36:46)'), я боюсь, что я Тогда я из идей, надеюсь, кто-то еще может пролить свет на него. – Wrikken

ответ

1

Кажется, вы не понимаете пространств имен.

Поскольку вы используете пространство имен App\Controllers, глобальное пространство имен обозначается \. Так что, если вы не хотите использовать полное имя \Pub вы должны положить использовать декларацию ниже имен, например:

namespace App\Controllers; 
use Pub; 

PS: Это хорошая практика, чтобы поместить свои модели в пространстве имен тоже.