Ранее я отправлял несколько вопросов относительно использования пространств имен в 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';
}
}
}
?>
Как вы можете видеть, я попытался сделать его как можно более простым, чтобы заставить работать часть пространства имен. Я пробовал разные варианты и, кажется, не могу понять.
Даже при использовании оператора 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
- тогда этот класс будет доступен в вашей текущей области.