Не удается найти класс с пространством имен PHP

Ранее я отправлял несколько вопросов относительно использования пространств имен в PHP, и, судя по тому, что я получил, приведенный ниже пример кода должен работать.

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

Fatal error: Class 'Controller' not found in E:\Controllers\testing.php on line 6

E: \ Controller \ testing.php File

<?php
use \Controller;

include('testcontroller.php');

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

E: \ Controller \ testcontroller.php File

<?php
use \Library\Registry;

namespace Controller
{
    class Controller
    {
        public $registry;

        function __construct()
        {
            include('E:\Library\Registry.class.php');
            $this->registry = new Registry;
        }

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

E: \ Library \ Registry.class Файл .php

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

Как вы можете видеть, я попытался сделать его как можно более простым, чтобы заставить работать часть пространства имен. Я пробовал разные варианты и, кажется, не могу понять.

26
задан JasonDavis 22 December 2011 в 23:10
поделиться

1 ответ

Даже при использовании оператора use вам необходимо указать пространство имен класса, который вы пытаетесь создать. Здесь много примеров: http://www.php.net/manual/en/language.namespaces.importing.php

Чтобы лучше это понять, я опишу Вы, как это работает. В вашем случае, когда вы делаете use \Controller, вам становится доступно все пространство имен Controller, но не классы, которые находятся в этом пространстве имен. Так, например:

<?php
include('testcontroller.php');

use \Controller;

// Desired class is in namespace!
$controller = new Controller\Controller();

// Error, because in current scope there is no such class
$controller = new Controller();

$controller->show();
?>

Другой пример:

testcontoller.php:

<?php
namespace Some\Path\To\Controller;

class Controller
{
    function __construct()
    {

    }

    function show()
    {
        echo '<br>Was run inside testcontroller.php<br>';
    }
}
?>

testing.php:

<?php
include('testcontroller.php');

use \Some\Path\To\Controller;

// We now can access Controller using only Controller namespace,
// not Some\Path\To\Controller
$controller = new Controller\Controller();

// Error, because, again, in current scope there is no such class
$controller = new Controller();

$controller->show();
?>

Если Вы хотите импортировать именно класс Controller , вам нужно сделать use Controller\Controller - тогда этот класс будет доступен в вашей текущей области.

36
ответ дан 28 November 2019 в 06:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: