Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Проблема при создании динамического класса при использовании пространственных имен [2]
Покинул форум
Сообщений всего: 198
Дата рег-ции: Май 2012
Помог: 0 раз(а)
То что в пространстве classes\app\controller находится по пути classes/app/controller, это я тут для наглядности все в один фаил определил
Саныч
Отправлено: 19 Августа, 2013 - 18:12:29
Участник
Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010 Откуда: Украина, Запорожье
Помог: 62 раз(а)
0. у вас ошибка, именя переменных $obj и $odj
1. слеши перед AppC не нужны
2. потестил малость, вывод следующий: когда мы конкатенируем псевдоним, получаем ошибку Class not found, если же прописать сразу namespace, все ОК. Почему так, не знаю.
Покинул форум
Сообщений всего: 198
Дата рег-ции: Май 2012
Помог: 0 раз(а)
avtor.fox пишет:
PHP:
скопировать код в буфер обмена
namespace CORE;
class INITIAL{
public static function autoloader($c)
{
$f = strtolower(str_replace('\\', '/', $c)).'.c.php';
if(file_exists($f)){
require_once initial::BASE.$f;
}
else throw new \Exception('Error message');
}
}
index.php
PHP:
скопировать код в буфер обмена
namespace CORE;
require_once 'file is autoload';
spl_autoload_register('CORE\INITIAL::autoloader');
урезан до невозможности. рабочий.
Простите-это что? И что конкретно работает?
avtor.fox
Отправлено: 19 Августа, 2013 - 19:39:32
Постоянный участник
Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012 Откуда: Воронеж
Помог: 50 раз(а)
qtk, Вы пишете в ООП парадигме (очевидно же) приложение, которое построено на наэмспейсах, а спрашиваете у меня, что за каракули я привёл?))
Есть класс INITIAL, в котором есть статический метод autoloader, который принимает параметр, в нашем случае название класса (название полностью содержит в себе пространство имени, при вызове new APT\GET\INSTALL в метод передастся APT\GET\INSTALL. очевидно). Метод autoloader использует переданное ему свойство как путь до папки и ищет необходимый файл. Если файл найден, то он его подключает, в противном случае выбрасывается исключение.
require_once'file is autoload';//подключаем файл, в котором находится class INITIAL
spl_autoload_register('CORE\INITIAL::autoloader');//регистрируем метод, в котором описана реализация подключения классов.
qtk
Отправлено: 19 Августа, 2013 - 19:47:42
Частый гость
Покинул форум
Сообщений всего: 198
Дата рег-ции: Май 2012
Помог: 0 раз(а)
Нет вы меня не поняли, у меня нет проблем с загрузкой классов через лоадер! Проблема в том как создать экземпляр полученный динамически используя псевдонимы.
avtor.fox
Отправлено: 19 Августа, 2013 - 20:03:47
Постоянный участник
Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012 Откуда: Воронеж
Помог: 50 раз(а)
Да, простите. Не понял сразу. И Вам же ответили уже.
Можно конечно заморочиться и сделать рекурсивный поиск. Но лучше и проще, если Вы хорошенько подумаете.
qtk
Отправлено: 19 Августа, 2013 - 20:07:24
Частый гость
Покинул форум
Сообщений всего: 198
Дата рег-ции: Май 2012
Помог: 0 раз(а)
Да да я в курсе этого метода, так же можно просто передать путь в Url
test.ru/?cl=\classes\app\controller\Main
только не уверен на сколько это правильно и безопасно
avtor.fox
Отправлено: 19 Августа, 2013 - 20:09:06
Постоянный участник
Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012 Откуда: Воронеж
Помог: 50 раз(а)
qtk, не могу сказать по поводу безопасности, но очевидно, что архитектура плачевна)
armancho7777777
Отправлено: 19 Августа, 2013 - 20:21:17
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
caballero пишет:
а в конце почему то надо
Одиночный слэш на конце экранирует саму ковычку.
EuGen
Отправлено: 20 Августа, 2013 - 10:25:41
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Importing is performed at compile-time, and so does not affect dynamic class, function or constant names.
Попросту говоря - альяс - это средство для того, чтобы PHP распознал обращение к пространству имени и в дальнейшем оно преобразуется в полное имя, альяс же пропадает насовсем и после интерпретации более недоступен.
Таким образом, автозагрузчик следует построить таким образом, чтобы он не опирался на альясы пространств имён.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.