Включить файл представления в том же пространстве имен в PHP 5.3.0 - PullRequest
1 голос
/ 22 сентября 2009

Я начал разрабатывать 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 () внутри представления, что противоречит цели.

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

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

Ответы [ 2 ]

3 голосов
/ 22 сентября 2009

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

namespace view;
helper(); // works 

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

РЕДАКТИРОВАТЬ : вызов 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();
0 голосов
/ 22 сентября 2009

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

...