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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Anguis
Отправлено: 29 Декабря, 2012 - 09:44:50
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


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




Здравия всем!
Подскажите неумному, имя класса может содержаться в константе?
К примеру я хочу хранить в константе имя класса с локализацией. Возможно?
PHP:
скопировать код в буфер обмена
  1.  
  2. abstract class russian{
  3.  static meeting = 'Добро пожаловать';
  4. }
  5.  
  6. define('LANG','russsian',true);
  7.  
  8. echo LANG::meeting;
  9.  

не работает - Fatal error: Undefined class constant 'meeting'
И так тоже не работет - echo {LANG}::meeting;
 
 Top
EuGen Администратор
Отправлено: 29 Декабря, 2012 - 09:51:37
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Не может.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
avtor.fox
Отправлено: 29 Декабря, 2012 - 10:10:04
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




Нет. Да и бессмысленно это.

PHP:
скопировать код в буфер обмена
  1. class LANGlib{
  2.         private $meeting = array(
  3.                 'ru'    =>      array(
  4.                         'greeting'      =>      'Привет мир!'
  5.                 ),
  6.                 'en'    =>      array(
  7.                         'greeting'      =>      'Hello world!'
  8.                 )
  9.         ),
  10.         $error = array(
  11.                 'ru'    =>      array(
  12.                         'error_word'    =>      'Нет такого слова'
  13.                 ),
  14.                 'en'    =>      array(
  15.                         'error_word'    =>      'No such word'
  16.                 )
  17.         );
  18.         protected $language;
  19.        
  20.        
  21.         public function __construct($lang){
  22.                 $this->language = (!empty($this->meeting[$lang]))?$lang:'ru';
  23.         }
  24.        
  25.         public function getWord($word){
  26.                 return (isset($this->meeting[$this->language][$word]))?$this->meeting[$this->language][$word]:$this->error[$this->language]['error_word'].' : '.$word;
  27.         }
  28. }
  29.  
  30. $lng = new LANGlib('us');
  31. echo $lng->getWord('ass');

например

(Отредактировано автором: 29 Декабря, 2012 - 10:29:51)

 
 Top
Anguis
Отправлено: 29 Декабря, 2012 - 10:15:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


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




Благодарю! А теперь тогда следующий вопрос.
Мне очень не хочется использовать глобальные переменные для этого дела. Есть ли какие-то другие пути хранить имя языкового класса с доступностью его в любой части программы?
Явно имя не могу использовать по понятным причинам - оно может различаться в зависимости от версии (рус/англ/нем).
Мои мысли меня наталкивают на конструкции типа такого:
PHP:
скопировать код в буфер обмена
  1.  
  2. abstract class lang{
  3. static $get_lang = 'russian';
  4. }
  5. abstract class russian{
  6. static $meeting = 'Добрый день';
  7. }
  8. echo lang::get_lang::meeting;// не работает - Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting ',' or ';'
  9.  
 
 Top
KingStar
Отправлено: 29 Декабря, 2012 - 10:17:47
Post Id



Участник


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


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




бред... Хм


-----
То что программа работает, не означает что она написана правильно!
 
 Top
Anguis
Отправлено: 29 Декабря, 2012 - 10:18:36
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


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




avtor.fox, в вашем примере опять либо глобалки, либо создание объекта каждый раз по необходимости, тоже не то.
 
 Top
avtor.fox
Отправлено: 29 Декабря, 2012 - 10:24:53
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




Anguis, гкхмм.
В моём примере нет ни одной глобальной переменной. Объект создаётся один раз при запуске скрипта, потом вызывается метод для вывода слова когда нужно.

Для чего Вам абстрактные классы? Для чего плодить кучу классов?

KingStar пишет:
бред... Хм

не пойму тебя
 
 Top
KingStar
Отправлено: 29 Декабря, 2012 - 10:27:49
Post Id



Участник


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


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




avtor.fox пишет:
не пойму тебя


Anguis бред пишет Хм


-----
То что программа работает, не означает что она написана правильно!
 
 Top
Anguis
Отправлено: 29 Декабря, 2012 - 10:32:48
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


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




avtor.fox, Спасибо! Ваш код навел меня на мысли, нам поможет синглтон!
PHP:
скопировать код в буфер обмена
  1.  
  2. class lang{
  3.   protected static $instance;
  4.   private function __construct(){
  5.     $lang = 'russian';//тут уже побарабану как определять имя языкового класса, можно через ту же константу передать
  6.     self::$instance = new $lang;
  7.   }
  8.   private function __clone()    {  }
  9.   private function __wakeup()   {  }
  10.   public static function get() {
  11.         if ( is_null(self::$instance) ) {
  12.             new lang;
  13.         }
  14.         return self::$instance;
  15.   }
  16. }
  17. class russian{
  18.   static public $message = 'Я мессаго!';
  19. }
  20. echo lang::get()->message;
  21.  

Проблема решена!
 
 Top
esterio
Отправлено: 29 Декабря, 2012 - 10:35:09
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




Как вариант
PHP:
скопировать код в буфер обмена
  1. class a{
  2.         static $a = 'a';
  3. }
  4.  
  5. define('A', 'a');
  6.  
  7. $tmp = A;
  8. var_dump($tmp::$a);

Но ето бред. Если так хотите сделать то лучше константой будет язык, а класс синглотоном который являеться обгорткой. Ну короч что-то типо етого.
 
 Top
avtor.fox
Отправлено: 29 Декабря, 2012 - 10:38:14
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




Anguis
Было такое слово интересное, "козодёр" по моему. Почему такая страсть к бессмысленным, статическим методам?
 
 Top
Anguis
Отправлено: 29 Декабря, 2012 - 10:42:11
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


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




avtor.fox пишет:
В моём примере нет ни одной глобальной переменной. Объект создаётся один раз при запуске скрипта, потом вызывается метод для вывода слова когда нужно.

Я к тому что переменная $lng не будет доступна в другой области видимости, если ее глобальной не делать:
PHP:
скопировать код в буфер обмена
  1.  
  2. $lng = new LANGlib('us');
  3.  
  4. function get_mess(){
  5. echo $lng->getWord('ass');
  6. }
  7. echo $lng->getWord('ass');//работает
  8. get_mess();//не работает
  9.  
 
 Top
avtor.fox
Отправлено: 29 Декабря, 2012 - 10:49:14
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




PHP:
скопировать код в буфер обмена
  1. function getMessage($language){
  2.         static $LANGlib;
  3.         if(is_null($LANGlib)){         
  4.                 $LANGlib = new LANGlib($language);
  5.         }
  6.         return $LANGlib;
  7. }
  8. echo getMessage('en')->getWord('greeting');

Вы что-то мудрите Однако
 
 Top
esterio
Отправлено: 29 Декабря, 2012 - 10:50:13
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




PHP:
скопировать код в буфер обмена
  1. interface lang
  2. {
  3.         public function getWord($word)
  4. }
  5.  
  6. class ru implements lang
  7. {
  8.         public function getWord($word)
  9.         {
  10.                 return $word;
  11.         }
  12. }
  13.  
  14. class lang
  15. {
  16.         static $instance = null;
  17.  
  18.         static protected function getInstance()
  19.         {
  20.                 if(self::$instance !== null)
  21.                         return self::$instance;
  22.  
  23.                 $tmp = LANG;
  24.                 return self::$instance = new $tmp();
  25.         }
  26.  
  27.         static public function getWord($word)
  28.         {
  29.                 return self::getInstance()->getWord($word);
  30.         }
  31. }
  32.  
  33. define('LANG', 'ru');
  34. echo lang::getWord('hello_world');
 
 Top
Anguis
Отправлено: 29 Декабря, 2012 - 11:07:01
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


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




avtor.fox, классы подгружаются по autoload. lang::get()->message сначала подгрузит lang.php. затем russian.php. Согласен, Ваш вариант лаконичней. Но не вижу смысла держать все переводы в одном классе. Там может быть много текста, зачем погружать лишнюю информацию и забивать память. Тогда как в моем варианте при обращении погрузится только нужный текст. Поэтому мне удобней пользоваться все-же классами. Если взялся делать в одном стиле, то такого стиля и надо придерживаться.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB