Хорошо, я сделал 3 файла, которые у меня есть index.php
где я включаю namespace.php
где у меня есть 2 функции:
Namespace namespaceName{
class classLoader{
public function __construct() {
//not used
}
public function executeFunctionOutsideTheNamespace() {
include("class.php");
new classExtended("badass");
}
}
class classBase{
public function __construct(){
}
}
}
Теперь из index.php
я пытаюсь динамически вызвать функцию из третьего файла class.php
где класс, который расширяет один класс из namespaces
, Здесь class.php
код
class classExtended extends namespaceName\classBase
{
public function __construct($action) {
echo $action;
}
}
И конечно мой index.php
файл
require("namespace.php");
$namespace= new namespaceName\classLoader();
$oController = $namespace->executeFunctionOutsideTheNamespace();
$oController
это пример classLoader()
право? теперь я вызываю функцию executeFunctionOutsideTheNamespace
из класса classLoader()
из пространства имен namespaceName
и я говорю include("class.php");
и создание расширенного класса ведьмы является основанием classBase от Namespace. Я повторяю Fatal error: Class 'namespaceName\classExtended' not found in C:\xampp\htdocs\exercices\namespace.php on line 10
Дело в том, что class.php
было include()
Эд внутри classLoader
класс, который находится внутри namespaceName
Пространство имен не заставляет его наследовать пространство имен из включающего файла.
Так в том числе class.php
загружает класс classExtended
в глобальное пространство имен, то есть для доступа к нему, как ваш код, вам нужно будет использовать
new \classExtended("cool");
Чтобы получить classExtended
в пространство имен namespaceName
, поскольку он находится в своем собственном файле, вам нужно объявить пространство имен в этом файле. Это также означает, что вам нужно удалить namespaceName
от extends
объявление, чтобы PHP не начал искать вложенный namespaceName\namespaceName\classBase
, Файл class.php
должен стать
namespace namespaceName;
// Declare the class without the namespace in extends
// since classExtended is now in the same namespace as classBase
class classExtended extends classBase
{
public function __construct($action) {
echo $action;
}
}
Я настоятельно рекомендую ознакомиться с Стандарт автозагрузки класса PSR-4 определяется группой взаимодействия PHP Framework и использовать Композитор для обработки вашего класса автозагрузки. Пространство имен становится в основном вопросом компоновки файловой системы, и включение файла обрабатывается автоматически.
Других решений пока нет …