Нельзя использовать класс пространства имен внутри другого пространства имен в PHP - PullRequest
5 голосов
/ 23 декабря 2011

У меня все еще проблемы с пространствами имен PHP5.

У меня есть пространство имен с именем Project, и я пытаюсь получить доступ к классу с именем registry внутри этого Project пространства имен с пространством имен Library, поэтому в верхней части файла, который является Project namespace Я использую эту строку use Library\Registry;

Registry класс находится внутри Library пространства имен

Это должно работать, но это не так, вместо этого ЕДИНСТВЕННЫЙ способ получить доступ к моему registry классу внутри этого пространства имен Project - это использовать

$this->registry = new \Library\Registry;

Я хочу использовать это вместо ...

$this->registry = new Registry;

Вот и вся причина использования

use Library\Registry;

в верхней части Project файла пространства имен


Ниже у меня есть 3 небольших примера скриптов в структуре папок, подобных этой.
Library/registry.class.php класс в папке моей библиотеки
Controller/controller.class.php и класс в моем каталоге контроллеров
Controller/testing.php тестовый файл для запуска скрипта.

E: \ Library \ Registry.class.php file

<?php
namespace Library
{
    class Registry
    {
        function __construct()
        {
            echo 'Registry.class.php Constructor was ran';
        }
    }
}
?>

E: \ Controller \ Controller.class.php file

<?php
use Library\Registry;

namespace Project
{
    class Controller
    {
        public $registry;

        function __construct()
        {
            include('E:\Library\Registry.class.php');

            // This is where my trouble is
            // to make it work currently I have to use
            //  $this->registry = new /Library/Registry;
            // But I want to be able to use it like below and that is why
            // I have the `use Library\Registry;` at the top
            $this->registry = new Registry;
        }

        function show()
        {
            $this->registry;
            echo '<br>Registry was ran inside testcontroller.php<br>';
        }
    }
}
?>

E: \ Controller \ testing.php file

<?php
use Project\Controller;

include('testcontroller.php');

$controller = new Controller();
$controller->show();

?>

Я получаю эту ошибку ...

Fatal error: Class 'Project\Registry' not found in PATH to file

если я не использую это ниже в файле controller.class.php

$this->registry = new \MyLibrary\Registry;

Потому что в этом файле вверху у меня есть use Library\Registry; Я должен иметь к нему доступ, как это ...

$this->registry = new Registry;

Пожалуйста, помогите мне получить это, где я могу использовать это вместо этого

Ответы [ 4 ]

6 голосов
/ 23 декабря 2011
use Library\Registry;

namespace Project
{

Я полагаю , что это не так: вы use ing Library\Registry в глобальном пространстве имен и затем открываете пространство Project.

Поместите оператор use в пространство имен, в которое вы хотите его импортировать.

namespace Project
{
    use Library\Registry;
2 голосов
/ 23 декабря 2011

Вам необходимо импортировать свой класс Registry в пространство имен Project, потому что они вам нужны, а не в глобальной области видимости.

<?php   
namespace Project
{
    use Library\Registry;

    class Controller
    {
        public $registry;

        function __construct()
        {
            include('E:\Library\Registry.class.php');

            // This is where my trouble is
            // to make it work currently I have to use
            //  $this->registry = new /Library/Registry;
            // But I want to be able to use it like below and that is why
            // I have the `use Library\Registry;` at the top
            $this->registry = new Registry;
        }

        function show()
        {
            $this->registry;
            echo '<br>Registry was ran inside testcontroller.php<br>';
        }
    }
}
?>
1 голос
/ 23 декабря 2011

Просто добавьте: использовать \ Library \ Registry;

вверху вашего скрипта под объявлением пространства имен

Тогда вы можете просто сказать:

$ registry = new Registry;

внутри вашего класса

Кстати, объявление вашего класса неверно. Вы не должны заключать свое пространство имен в фигурные скобки, пространство имен не является функцией.

Так и должно быть. Также убедитесь, что объявление класса Library \ Registry уже включено, используя include ('/ path / to / registry.php'); или используя автозагрузчик

namespace Project;

включают ( 'E: \ Library \ Registry.class.php');

use \Library\Registry;

    class Controller
    {
        public $registry;

        function __construct()
        {


            // This is where my trouble is
            // to make it work currently I have to use
            //  $this->registry = new /Library/Registry;
            // But I want to be able to use it like below and that is why
            // I have the `use Library\Registry;` at the top
            $this->registry = new Registry;
        }

        function show()
        {
            $this->registry;
            echo '<br>Registry was ran inside testcontroller.php<br>';
        }
    }

Наслаждайтесь

0 голосов
/ 20 октября 2013
<?php namespace Project;
    require_once 'your registry class file';
    use \Library\Registry as Registry;

Теперь вы сможете использовать ...

    $this->registry = new Registry;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...