Включить файл представления в том же пространстве имен в PHP 5.3.0

Я начал разрабатывать своего рода mvc framweork на PHP5.3.0 для статического ключевого слова, но, поскольку я здесь, я сказал, что должен также использовать преимущества пространств имен.

Итак, у меня есть что-то вроде этого для представления:

namespace view
{
    function load($filepath)
    {
        include($filepath);
    }
    function helper()
    {
        echo 'lorem ipsum';
    }
}
view\load('view.php');

Теперь предположим, что мой view.php выглядит так:

<?= helper() ?>

Это не работает, потому что включенный файл по какой-то причине находится в глобальном пространстве имен, поэтому мне пришлось написать view\helper() внутри представления, что противоречит цели.

У вас есть идеи, как это сделать? В значительной степени то, что называется заголовком вопроса, чтобы включить файл в то же пространство имен, где происходит включение.

Обратите внимание, что мне не нужны решения для этого ТОЧНОГО сценария кода, он был упрощен, чтобы вы могли понять мою проблему.


person treznik    schedule 22.09.2009    source источник


Ответы (2)


Должен признаться, мне еще предстоит подробно изучить особенности пространства имен PHP, но я не верю, что это возможно. Файл included() будет находиться в глобальном пространстве имен, если вы не объявите, что view.php находится в том же пространстве имен:

namespace view;
helper(); // works 

Обратите внимание, что импорт helper с использованием use view\helper; не возможно либо, поскольку импортируются только произведения имен классов и других пространств имен.

EDIT: вызов include() из функции по-прежнему будет экспортировать текущую область во включенный файл, поэтому вы можете сделать что-то вроде этого:

namespace view {
    class Template { 
        public function load($filepath) { 
            include($filepath);
        }

        function helper(){
            echo 'lorem ipsum';
        }
    }

    $a = new Template();
    $a->load('test.php');
}

view.php:

$this->helper();
person Øystein Riiser Gundersen    schedule 22.09.2009

Я бы реализовал автозагрузку классов вместо того, чтобы загружать их методом «загрузки». Также я не понимаю, почему вы не можете поместить все файлы view.php в одно и то же пространство имен.

person Vladislav Rastrusny    schedule 22.09.2009