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 :: Вызов несуществующих методов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
GoDr
Отправлено: 22 Мая, 2015 - 12:09:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




Появилась интересная мысль для вызова языковых констант (ну может не я один к такой мысли пришёл, но всё же..)

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

Суть в том чтобы сделать единый обработчик без дополнительного подключения необходимых языковых файлов. Ну то есть всё это делать в одном месте.. И при этом воспользоваться допустим __callStatic()

Допустим есть библиотека-обработчик
PHP:
скопировать код в буфер обмена
  1. class LibLang{
  2.     public static function __callStatic($name, $arguments){
  3.         //.................
  4.         //.................
  5.         //.................
  6.     }
  7. }
  8.  


Допустим используем какой-то компонент и делаем вызов языковой константы
PHP:
скопировать код в буфер обмена
  1. echo LibLang::ComMyExt('QQQ_WWW');
  2. echo LibLang::ComMyExt('AAA_SSS');


Соответственно такого метода нет и будет вызван __callStatic(). Ну и всё остальное будем подключать и делать уже в этом методе.

А суть вопроса простая.. На сколько это вообще "правильно"?


-----
Система управления веб-содержимым Lotos CMS
 
 Top
caballero
Отправлено: 22 Мая, 2015 - 12:38:29
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




каким боком вообще связаны языки и методы
и почему для подключения каких то модулей надо юзать несуществующие методы


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
GoDr
Отправлено: 22 Мая, 2015 - 13:14:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




caballero пишет:
каким боком вообще связаны языки и методы
Странный вопрос.. каким образом буквы связаны со словами? Да никаким, просто одно часть другого..

caballero, ты сразу в коде пишешь фразы/слова/буковки или всё же через константы и уже потом вставляешь в код?

caballero пишет:
и почему для подключения каких то модулей надо юзать несуществующие методы
для удобства написания и потому что такое возможно...


Сейчас есть языковой файл для компонента ComXMap, допустим такое (INI-файл)
CODE (htmlphp):
скопировать код в буфер обмена
  1. XMAP_NAME = "Карта сайта"
  2. XMAP_CONFIG = "Настройки"
  3. XMAP_LINK = "Ссылки"
  4. XMAP_MAP = "Создать SITEMAP.XML"
  5. XMAP_BASIC_SETTINGS = "Основные настройки"
  6. XMAP_VIEW_ARTICLE = "показывать материалы"


Для использования языка подключаю обработчик
PHP:
скопировать код в буфер обмена
  1. $lang = LibLang::getLang('ComXMap');


В самом классе соответственно подключаю, запоминаю, оптимизирую, что-то там ещё делаю... и в конечном итоге передаю переменной массив с языковыми данными именно для этого компонента.
Ну и в где-то в коде уже использую
PHP:
скопировать код в буфер обмена
  1. echo $lang['XMAP_VIEW_ARTICLE'];


В принципе достаточно просто. Но приходится или в каждой функции/методе создавать переменную с данными или хранить что-то всё в глобальной. Можно конечно сразу всё объединить в одно, например
PHP:
скопировать код в буфер обмена
  1. echo LibLang::getLang('ComXMap', 'XMAP_VIEW_ARTICLE');

ну или использовать какой-то сокращённый вариант
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo _lang('ComXMap', 'XMAP_VIEW_ARTICLE');
  2. .....
  3. function _lang(){
  4.     return LibLang::getLang('ComXMap', 'XMAP_VIEW_ARTICLE');
  5. }
  6.  


Вот в качестве эксперимента решил попробовать изобрести более простой "велосипед".
Достаточно просто и человекопонятно.. Вот и спросил на сколько "правильно" использовать магические методы

(Отредактировано автором: 22 Мая, 2015 - 13:17:18)



-----
Система управления веб-содержимым Lotos CMS
 
 Top
DeepVarvar Супермодератор
Отправлено: 22 Мая, 2015 - 14:32:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Я раньше прям в автолоаде проверял есть ли для вызванного компонента языковой файл в соответствии с настройками локали, и если есть, то подтягивал и докладывал в общак, а в шаблоне было: <?=$language->bla_bla_bla?>

Но потом отказался от этого, и теперь пишу все подгрузки в самих компонентах, ибо только компонент точно должен знать что ему надо и когда надо.
 
 Top
GoDr
Отправлено: 23 Мая, 2015 - 09:37:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




DeepVarvar пишет:
Но потом отказался от этого, и теперь пишу все подгрузки в самих компонентах, ибо только компонент точно должен знать что ему надо и когда надо.
Так я тоже так делаю, вот только смущает большое количество избыточного кода. Например,

PHP:
скопировать код в буфер обмена
  1. class MyClass
  2. {
  3.     public function AAA()
  4.     {
  5.         $lang = LibLang::getLang('MyClass');
  6.         // .................................
  7.         echo $lang['AAA1'];
  8.         // .................................
  9.         echo $lang['AAA2'];
  10.     }
  11.  
  12.     public function BBB()
  13.     {
  14.         $lang = LibLang::getLang('MyClass');
  15.         // .................................
  16.         echo $lang['AAA3'];
  17.         // .................................
  18.         echo $lang['AAA4'];
  19.     }
  20. }


То есть я постоянно загружаю в переменную языковой файл. К использованию глобальных переменных отношусь плохо. Вот и затеял такую штуку.. И Только сам компонент знает свои языковые переменные. Но вот только существует единая "точка" подключения
(Добавление)
В принципе вот идея моего велосипеда

сам класс обработки
PHP:
скопировать код в буфер обмена
  1. // корень файлов
  2. define('_LPATH_ROOT', __DIR__);
  3.  
  4. // абсолютный путь до каталога с языковыми файлами
  5. define('_LPATH_LANG', _LPATH_ROOT . '/languages');
  6.  
  7. // определение языка
  8. define('_LANG_NAME', 'ru');
  9.  
  10.  
  11. class LibLang
  12. {
  13.     /** @var array Массив Ключ-Значение */
  14.     public static $language = array();
  15.  
  16.     public static function _($str, $expansion = null)
  17.     {
  18.         // получам имя расширения если не задано
  19.         if (empty($exp)) {
  20.             $tmp = explode('_', $str);
  21.             if (isset($tmp[0]) and isset($tmp[1])) {
  22.                 $expansion = strtolower($tmp[0]) . '.' . strtolower($tmp[1]);
  23.             }
  24.         }
  25.  
  26.         // Проверяем подключено ли это расширение и подключаем если нет
  27.         if (array_search($expansion, self::$language) === false) {
  28.  
  29.             // Путь до языкового файла
  30.             $path_lang = _LPATH_LANG . '/' . _LANG_NAME . '/' . $expansion . '.lang.ini';
  31.  
  32.             // подгружаем языковой файл
  33.             if (is_readable($path_lang)) {
  34.                 $lang_ini = parse_ini_file($path_lang);
  35.                 self::$language[$expansion] = $lang_ini;
  36.             }
  37.         }
  38.  
  39.         // возвращаем значение языковой константы
  40.         if (isset(self::$language[$expansion][$str])) {
  41.             return self::$language[$expansion][$str];
  42.         } else {
  43.             return $str;
  44.         }
  45.     }
  46. }


вот вызовы
PHP:
скопировать код в буфер обмена
  1. echo LibLang::_('COM_XMAP_SITEMAP_MES_0');
  2. echo LibLang::_('COM_XMAP_SITEMAP_MES_1');
  3. echo LibLang::_('LIB_DATETIME_MONTH_NAME_R');
  4. echo LibLang::_('DATETIME_MONTH_NAME_R');


Получается довольно кратко и понятно. Если хочешь просто получать константу, то имя задаёшь по правилам, если нет, то можно задать и имя компонента


-----
Система управления веб-содержимым Lotos CMS
 
 Top
DelphinPRO
Отправлено: 23 Мая, 2015 - 13:41:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




GoDr пишет:
caballero пишет:
и почему для подключения каких то модулей надо юзать несуществующие методы
для удобства написания и потому что такое возможно...

Да нифига неудобна эта пхп-магия. Для существующих методов/полей IDE предлагает автокомплит, для несуществующих - нужно либо все помнить, либо подсматривать где-то.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Мая, 2015 - 14:49:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




GoDr пишет:
Например
Это хреновастый пример. Откуда вообще в каком-то классе ты делаешь echo?
GoDr пишет:
использованию глобальных переменных
Класс это тоже переменная, а с фабрикой (или чем там еще) так еще и глобальная.
Ну вот смотри как у меня в велосипеде сделано.

Подгрузка: https://github[dot]com/Romandry/phps[dot][dot][dot]sterForm.php#L37
Использование до какого либо вывода: https://github[dot]com/Romandry/phps[dot][dot][dot]sterForm.php#L44
Использование в шаблоне: (влом искать, ничем не отличается от использования до вывода)

Реализация подгрузки: https://github[dot]com/Romandry/phps[dot][dot][dot]re/View.php#L252

Тут можно сказать что костылик, метаю туда-сюда объекты-массивы, но можно было оставить это массивами, просто мне нравится обращение по ключу как имени св-ва.
 
 Top
GoDr
Отправлено: 24 Мая, 2015 - 08:38:37
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




DelphinPRO пишет:
Для существующих методов/полей IDE предлагает автокомплит, для несуществующих - нужно либо все помнить, либо подсматривать где-то.
Согласен. Это один офигенный минус Улыбка
Но(!) языковые константы всё равно подсматривать придётся.

DeepVarvar, да вот в том то и дело что не хочется постоянно перед выводом подключать нужный язык, хочется сразу на вывод пускать. Расширений для ядра много, иногда они используют языковые константы ядра. И получается что много это этих подключений...
Хотя может это просто "капризы" Радость

а почему языковые файлы ты в PHP-коде хранишь? Как-то принципиально? И почему бы сразу не возвращать массив а объекты? Улыбка
(Добавление)
DeepVarvar пишет:
Это хреновастый пример. Откуда вообще в каком-то классе ты делаешь echo?
почему хреновастый ? Радость
И в классе я не делаю вывод, только возврат.
нужно получить константу, делаю так
PHP:
скопировать код в буфер обмена
  1. $qqq = LibLang::_('COM_XMAP_SITEMAP_MES_0');

нужно вывести делаю так
PHP:
скопировать код в буфер обмена
  1. echo LibLang::_('COM_XMAP_SITEMAP_MES_0');

(Отредактировано автором: 24 Мая, 2015 - 08:39:42)



-----
Система управления веб-содержимым Lotos CMS
 
 Top
DeepVarvar Супермодератор
Отправлено: 24 Мая, 2015 - 18:12:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




GoDr пишет:
И почему бы сразу не возвращать массив а объекты?
И как их мержить?
GoDr пишет:
Расширений для ядра много, иногда они используют языковые константы ядра
Ты код пишешь или в игрушки играешь? Это твоя прямая обяза -- следить за зависимостями.
GoDr пишет:
делаю так
Да, через лишнюю сущность.
 
 Top
GoDr
Отправлено: 24 Мая, 2015 - 20:36:38
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




DeepVarvar пишет:
Ты код пишешь или в игрушки играешь? Это твоя прямая обяза -- следить за зависимостями.
ну так расширения и сторонние же бывают.. Как подключить всем известно, но что там в ядре твориться уже не их забота Улыбка

DeepVarvar пишет:
И как их мержить?
А зачем тогда в PHP-файла? Избыточного кода то сколько..


-----
Система управления веб-содержимым Lotos CMS
 
 Top
DeepVarvar Супермодератор
Отправлено: 24 Мая, 2015 - 23:07:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




GoDr пишет:
Избыточного кода то сколько
Сколько?
 
 Top
DelphinPRO
Отправлено: 25 Мая, 2015 - 07:25:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




GoDr пишет:
Но(!) языковые константы всё равно подсматривать придётся.

Тут беда.

мне еще локализацией заниматься не приходилось (в велосипедах), но собираюсь на своем сайтике сделать еще два языка. Так как запоминать лишнее не люблю, планирую сделать нечто такое:

PHP:
скопировать код в буфер обмена
  1. class I18n {
  2.     private static $lang = [];
  3.        
  4.     /** для примера и простоты просто передаю массив */
  5.     public static function set(array $lang) {
  6.         self::$lang = $lang;
  7.     }
  8.  
  9.     public static function _($key) {
  10.         if (array_key_exists(self::$lang, $key)) {
  11.             return self::$lang[$key];
  12.         }
  13.         return $key;
  14.     }
  15. }
  16.  
  17. // константы
  18. class Lang {
  19.     const OK = 'OK';
  20.     const CANCEL = 'CANCEL';
  21.     const WELCOME = 'WELCOME';
  22. }
  23.  
  24. // Языковой файл
  25. $data = [
  26.     'OK' => 'Ок',
  27.     'CANCEL' => 'Отмена',
  28.     'WELCOME' => 'Привет, %s',
  29. ]
  30.  
  31. // Использование
  32. I18n::set($data);
  33. echo I18n::_(Lang::OK);
  34. echo I18n::_(Lang::CANCEL);
  35. echo I18n::_(Lang::WELCOME);
  36.  

Нюансы не продумывал, но как-то так. Автокомплит в комлекте =)
Критику с удовольствием выслушаю.

(Отредактировано автором: 25 Мая, 2015 - 07:30:54)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
GoDr
Отправлено: 25 Мая, 2015 - 08:26:39
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




DelphinPRO, у тебя языковой файл в каком формате будет?


-----
Система управления веб-содержимым Lotos CMS
 
 Top
DelphinPRO
Отправлено: 25 Мая, 2015 - 11:31:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




GoDr я привел пример в виде php-массива. В такой массив будет считываться языковой файл. А в каком формате он будет - в принципе пофиг. Пока склоняюсь к ini-файлам.
(Добавление)
Одно фигово - "лишняя" сущность, в виде класса Lang с константами из примера. Но зато автокомплит. =)


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
GoDr
Отправлено: 25 Мая, 2015 - 13:22:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




DelphinPRO пишет:
Пока склоняюсь к ini-файлам.
Я в своё время проводил тесты: ini-файлов, констант и т.п.
Пришёл к выводу что INI лучше. Скорость подгрузки и преобразования в массив сумасшедшая, по сравнению с загрузкой констант. Но приходится жертвовать памятью.
Дума ещё над JSON, формат гибче, но очень критичен к ошибкам синтаксиса, вообще всё перестаёт работать ))))

НУ так вернёмся к самому вопросу.. На сколько правильно всё таки таким образом использовать магические методы? Т.е. получается я принудительно их вызываю. С другой стороны PHP это разрешает Радость

PS
DeepVarvar пишет:
GoDr пишет:
делаю так
Да, через лишнюю сущность.
Кстати, что это значит?


-----
Система управления веб-содержимым Lotos CMS
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB