PHP: автозагрузка классов с пространством имен PEAR в классах с пространством имен PSR-0 конфликтует

Для своего приложения я использую пространства имен PSR-0. Все работает красиво!

Пока я не захотел использовать Twig в качестве парсера шаблонов, Twig использовал псевдопространства имен PEAR. Например, Twig_Loader_Filesystem.

Проблема в том, что когда я хочу использовать Twig внутри своего приложения с разделением имен, вот так:

<?php
namespace Tact\ViewManager;

class ViewManager {

    public function init()
    {
        $loader = new Twig_Loader_Filesystem($this->templatepath);
        $this->twig = new Twig_Environment($loader);
    }  
}
?>

PHP скажет моему автозагрузчику искать класс с именем Tact\ViewManager\Twig_Loader_Filesystem

Как я могу автоматически загружать классы стилей с пространством имен PEAR без пространства имен PSR-0 вызывающего класса?

Мой автозагрузчик может загрузить и PEAR, и PSR-0..

Заранее спасибо!


person mmmmm    schedule 12.09.2012    source источник


Ответы (2)


Это потому, что вы находитесь в пространстве имен Tact\ViewManager. Классы с псевдопространством имен на самом деле находятся в глобальном пространстве имен, поэтому для их вызова следует добавлять к ним префикс \:

$loader = new \Twig_Loader_Filesystem($this->templatepath);

Если вас смущает префикс \, вы можете сделать это:

namespace Tact\ViewManager;

use Twig_Loader_Filesystem;
use Twig_Environment;

class ViewManager {
    public function init()
    {
        $loader = new Twig_Loader_Filesystem($this->templatepath);
        $this->twig = new Twig_Environment($loader);
    }  
}
person Ivan Pintar    schedule 12.09.2012
comment
Спасибо за ответ! Я уже пробовал это, но мой автозагрузчик обнаружит префикс `` и попытается включить его способом PSR-0. Боюсь, ваше решение - единственное решение, чтобы все заработало. - person mmmmm; 12.09.2012
comment
Цитата: Боюсь, что ваше решение — единственное решение, позволяющее заставить все работать, сработало оно или нет? Что вы имеете в виду, говоря о способе PSR-0. Где он ищет класс? Не могли бы вы отредактировать сообщение, чтобы показать код автозагрузчика (часть, в которой вы преобразуете пространства имен в каталоги)? - person Ivan Pintar; 12.09.2012
comment
Извините, вы были правы. Оно работает! Но как я уже говорил. Выглядит очень некрасиво :P - person mmmmm; 12.09.2012
comment
Хорошее решение! Даже не подумал об этом. Ты сделал мой день:) - person mmmmm; 12.09.2012
comment
@igorw испортил ваш ответ, чтобы он не работал - person mmmmm; 12.09.2012
comment
@WoutvanderVegt Извините, исправлено. - person igorw; 12.09.2012

Попробуй это:

    $loader = new \Twig_Loader_Filesystem($this->templatepath);
    $this->twig = new \Twig_Environment($loader);

Это сообщит PHP о принудительном поиске пространства имен\класса на «корневом» уровне, и если ваш автозагрузчик настроен на загрузку как пространств имен, так и обычных имен классов соглашения PEAR, он будет работать.

person Ivan Hušnjak    schedule 12.09.2012
comment
Мой автозагрузчик действительно получает имя класса без префикса пространства имен. Так что теперь все может работать. Но это выглядит чертовски некрасиво.. Спасибо! - person mmmmm; 12.09.2012