Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передается не то значение переменной, из одного класса в другой класс 
:(
    Опции темы
artuska
  Дата 10.12.2008, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Есть переменная $lang = 'ru'; — отвечает за язык на странице.
Есть класс Core, которому очень нужна эта переменная, но в этом классе уже есть переменная $_lang которая по-дэфолту равна 'en' — чтобы контент сайта по-дэфолту был на английском.
Хочу передать переменную $lang в класс Core, чтобы переменная $_lang класса Core стала не 'en', а 'ru' (ну, пользователь перешел с английской версии сайта на русскую).

В класс Core, в зависимости от ситуации, передается массив переменных $options. Конструктор класса Core меняет значения дэфолтных переменных класса на новые значения, которые прибыли из массива $options.

Класс Core
Код

class Core {
 var $_lang = 'en';

 function Core($options = array()){
  foreach($options AS $key=>$value){
   $this->setOption($key, $value);
  }
 }

 function setOption($name, $value){
  $property = '_'.$name;
  $this->$property = $value;
 }
}


Классу Core я хочу передать переменную $lang, которая теперь уже равна 'ru'.
Вот так:
Код

$lang = 'ru';
$options = array( 
 'lang' => $lang,
);
$core = new Core($options);


Все идеально работает — если я где-нибудь в методе класса Core напишу echo $this->_lang, то у меня выведется не en, который был в начале по-дэфолту, а ru.

Дальше. Есть класс User, который extends Core. Пишу где-нибудь в методе класса User echo $this->_lang, то он мне упорно возвращает en, хотя я уже присвоил переменной $_lang значение ru. Как сделать так, чтобы в класс User попадала переменная $_lang с новым значением, а не с тем, которое я задал сначала.

Класс User
Код

class User extends Core {
 var $_id;
 var $_role;

 function foo(){
  echo $this->_lang; // нихрена, возвращает en, а не ru
 }
}


(Можт вопрос и тупой, но я реально нуб в ООП, и тут скорее всего что-то легкое нужно сделать, но я в упор не вижу что и как)
PM MAIL   Вверх
Nikol
Дата 10.12.2008, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 5.4.2006
Где: Берег Черного мор я

Репутация: 2
Всего: 4



Регистрируйте переменную в сессии и обращайтесь к ней, как к глобальной.
--------------------
Я не волшебник, я только учусь.
PM MAIL WWW ICQ   Вверх
solenko
Дата 10.12.2008, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



artuska, ну как бы все логично. Инстанс класса User никак не связан с инстансом класса User. В вашем случае нужно использовать static члены класса:
Код

class Core {
  protected static $lang = 'en';
  public static function setLang($lab) {
     self::$lang = $lang;
  } 
}

class User extends Core {
   public function getLang() {
      return self::$lang;
   }
}

$user = new User();
Core::setLang('ru');
echo $user->getLang();

как-то вот так. 
Кстати, php4 уже мертв.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
artuska
  Дата 10.12.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Цитата(solenko @  10.12.2008,  02:35 Найти цитируемый пост)
Инстанс класса Core никак не связан с инстансом класса User

Ну да, вот и я так думаю — тобишь, если мы в классе Core поменяли значение переменной, то в классе User это ничего значить не будет — он будет наследовать изначальное значение переменной и все на том.

Насчет этого...
Код

$user = new User();
Core::setLang('ru');
echo $user->getLang();


...мне нужно чтобы переменная $this->_lang возвращала 'ru' именно внутри метода класса User. Вот я приведу реальный код, тогда вы поймете, что конкретно требуется:
Код

class User extends Core {
 var $_id;
 var $_role;

 function processLogin(){
  /* Здесь идет код, запросы к базе данных, бла-бла-бла... */

  // а вот тут начинает работать xAjax и делает он вот это - 
  $objResponse->script("location.href='/".$this->_lang."/';");
  // вот тут-то моему классу User и его методу processLogin требуется переменная $this->_lang, которая учавствует в том, чтобы редиректить юзера на страницу с русским языком
  // сейчас в скрипте получается так - location.href='/en/'; - хотя я $this->_lang уже изменил на ru

  return $objResponse;
 }
}


Тобишь, мне не надо, чтобы какой-то метод возвращал мне язык, мне не надо, чтобы я мог обратиться к переменной где-нибудь за пределами класса — типа так $user = new User; echo $user->_lang; — мне это не надо. Я хочу внутри какого-нибудь метода класса User получить измененную переменную $this->_lang, которая приходит из класса Core, но значение которой там уже поменяли на другое.









Тааак, начинается что-то интересное.
Смотрим на класс Core, который я привел в самом начале темы. Теперь, если мы в конструкторе класса Core убираем цикл foreach и жестко пишем там $this->_lang = 'ru'; то теперь, в классе User, который extends Core у меня все работает - переменная $this->_lang теперь как и положено равняется 'ru'.
Код

class Core {
 var $_lang = 'en';

 function Core($options = array()){
  $this->_lang = 'ru';
 }
}

class User extends Core {
 var $_id;
 var $_role;

 function processLogin(){
  /* Здесь идет код, запросы к базе данных, бла-бла-бла... */

  // а вот тут начинает работать xAjax и делает он вот это - 
  $objResponse->script("location.href='/".$this->_lang."/';");
  // вот теперь $this->_lang равняется 'ru', и получается все клева --- location.href='/ru/';

  return $objResponse;
 }
}


Что за ерунда? Получается, что вот эти функции (setOption и цикл foreach в конструкторе класса) не работают???
Код

 function Core($options = array()){
  foreach($options AS $key=>$value){
   $this->setOption($key, $value);
  }
 }

 function setOption($name, $value){
  $property = '_'.$name;
  $this->$property = $value;
 }


Но они работают! Они реально присваивают переменным новые значения. Если я напишу сразу после foreach'а - echo $this->_lang, то он мне выдаст 'ru', а значит замена значения переменной произошла.
Код

 function Core($options = array()){
  foreach($options AS $key=>$value){
   $this->setOption($key, $value);
  }
  echo $this->_lang; // возвратит мне 'ru', все, значит, клева, было 'en', запустили в цикле функцию setOption, она заменила переменные, и теперь $this->_lang равняется 'ru' - но всеравно, в классе User $this->_lang продолжает равняться 'en'.
 }


Это сообщение отредактировал(а) artuska - 10.12.2008, 20:21
PM MAIL   Вверх
teroni
Дата 10.12.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 15.5.2007
Где: Днепропетровск

Репутация: 8
Всего: 22



Вам же сказано, что инстансы классов Core и User никак между собой не связаны. Вы создали new Core, поменяли для него язык на русский, но инстанс User об этом даже не догадывается. Как вариант - можно передавать экземпляр Core в User.

Код


<?
class Core {
   var $_lang = 'en';
   function Core($options = array()){
   foreach($options AS $key=>$value){
   $this->setOption($key, $value);
   }
 }
 function setOption($name, $value){
  $property = '_'.$name;
  $this->$property = $value;
 }
}

class User extends Core {
 var $_id;
 var $_role;
 function User($parent_core){
 $this->core = $parent_core;
 }

 function foo(){
  echo $this->core->_lang;
 }
}

$lang = 'ru';
$options = array(
 'lang' => $lang,
);
$core = new Core($options);
$user = new User($core);
$user->foo();
$core->setOption('lang', 'fr');
$user->foo();
?>

PM MAIL   Вверх
artuska
  Дата 10.12.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Цитата(teroni @  10.12.2008,  20:29 Найти цитируемый пост)
Как вариант - можно передавать экземпляр Core в User

Попробовал, получилось. Вот только не глупо ли это, передавать экземпляр, если класс User и так уже extends Core?

Цитата(teroni @  10.12.2008,  20:29 Найти цитируемый пост)
Вам же сказано, что инстансы классов Core и User никак между собой не связаны.

Ну как это не связаны, я же говорю, если в конструкторе класса Core жестко пишем $this->_lang = 'ru'; то теперь, в классе User, который extends Core у меня все работает - переменная $this->_lang теперь как и положено равняется 'ru'
Код

class Core {
 var $_lang = 'en';

 function Core($options = array()){
  $this->_lang = 'ru';
 }
}


PM MAIL   Вверх
ksnk
Дата 10.12.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата

Кстати, php4 уже мертв.

Хмм... А почему меня на нем заставляют писать? Кругом меня некрофилы!!! Спасите меня!!! Аааааа!!!


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
solenko
Дата 10.12.2008, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



ksnk, писать?  smile Меняйте работу. Я еще понимаю существующий код поддерживать, но чтоб писать...
p.s. Support for PHP 4 has been discontinued since 2007-12-31. Please consider upgrading to PHP 5.2. 

Это сообщение отредактировал(а) solenko - 10.12.2008, 21:30


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 10.12.2008, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата

p.s. Support for PHP 4 has been discontinued since 2007-12-31. Please consider upgrading to PHP 5.2. 

solenko, Мой работодатель тянет несколько заказчиков со своими серверами. Так что PHP4 жЫв, жЫл, и будет. жЫть forever!!! 
Хм.... До тех пор пока они платят деньги...  smile 
Впрочем, php4 обладает тем свойством, что он практически без дополнительных телодвижений поддерживается php-5-м... Ну почти без дополнительных...





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Nigel
Дата 10.12.2008, 21:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 7
Всего: 19



artuska, а каким образом user относится к core. Я еще понимаю, если бы вы создали абстрактный класс пользователи, от него бы получили классы Admin, Moderator и тд. А так это похоже на: приделаем к самосвалу двигатель от самолета. "А теперь на всей этой фигне мы взлетим". На мой взгляд у вас явная ошибка в проектировании, я уж не говорю о том, зачем пользователю делать перенаправления куда-либо. Вы, похоже, используете ООП ради ООП. Не стоит, пишите обычно, как знаете, как умеете. А ооп попробуете, когда будете готовы.

PM MAIL   Вверх
artuska
  Дата 10.12.2008, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Цитата(Nigel @  10.12.2008,  21:57 Найти цитируемый пост)
artuska, а каким образом user относится к core

в данный момент — никак. Я же не буду постить здесь весь код класса Core, правильно. Я запостил только 2 метода из класса Core, чтобы показать логику. В классе Core у меня набор функций, которые используются не только в классе User, но и в других классах.
Насчет "Вы, похоже, используете ООП ради ООП" — это так, ну надо же с чего-то начинать.

Nigel, Вы мне просто скажите, почему переменная $_lang класса Core после присваивания ей другого значения в конструкторе класса Core, не работает в других классах, которые extends Core
Код

class Core {
 var $_lang = 'en'; // любой другой класс, который extends Core почему-то видит в переменной $this->_lang именно значение 'en'... (следующий комментарий)

 function Core($options = array()){
  foreach($options AS $key=>$value){
   $this->setOption($key, $value); // ... хотя здесь, в конструкторе класса, я только что задал переменной $_lang значение 'ru'
  }
 }

 function setOption($name, $value){
  $property = '_'.$name;
  $this->$property = $value;
 }
}

$lang = 'ru';
$options = array( 
 'lang' => $lang,
);
$core = new Core($options);

class User extends Core {
 var $_id;
 var $_role;

 function processLogin(){
  // абсолютно не имеет значения, что у меня в этой функции происходит, непонятно одно, почему у меня переменная $this->_lang равняется 'en', а не 'ru'? Ну вот почему? Теперь приведу идиентичный код, в котором переменная $this->_lang будет 'ru'
 }
}


Теперь приведу идиентичный код, в котором переменная $this->_lang в методе класса User будет равняться 'ru'
Код

class Core {
 var $_lang = 'en';

 function Core($options = array()){
  $this->_lang = 'ru'; // вот, жестко прописываю новое значение и, вуаля, в методе processLogin класса User переменная $this->_lang равняется 'ru'! НО! А в чем отличие от предыдущего способа присвоения переменной нового значения? Там просто цикл, который присваивает значения, но там не работает, а здесь работает?
 }
}


class User extends Core {
 var $_id;
 var $_role;

 function processLogin(){
  // теперь у меня переменная $this->_lang равняется 'ru'.
 }
}


Это сообщение отредактировал(а) artuska - 10.12.2008, 22:46
PM MAIL   Вверх
teroni
  Дата 10.12.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 15.5.2007
Где: Днепропетровск

Репутация: 8
Всего: 22



удалено

Это сообщение отредактировал(а) teroni - 10.12.2008, 22:57
PM MAIL   Вверх
artuska
  Дата 10.12.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Цитата(teroni @  10.12.2008,  22:53 Найти цитируемый пост)
Потому, что при создании объекта дочернего класса выполняется его конструктор, а не конструктор его родителя

Так-так-так, вразумительное предложение.

Попробую сделать так:
Код

class User extends Core {
 var $_id;
 var $_role;

 function User(){
  $this->Core();
 }

 // ... всякие функции ...
}


Мдя, явная тупость. Даже параметры $options не передал функции Core() — а мне их и брать-то негде... ыыы

Еще раз редактирую сообщение. С конструктором User расстаюсь, он не нужен, фигня полная.
Дальше. Насчет
Цитата(teroni @  10.12.2008,  22:53 Найти цитируемый пост)
Потому, что при создании объекта дочернего класса выполняется его конструктор, а не конструктор его родителя


Вот здесь, в конструкторе класса Core я жестко присвоил переменной $this->_lang значение 'ru' и теперь в любом дочернем классе моя переменная $this->_lang равняется 'ru', а не 'en', так что вы что-то путаете.
Код

class Core {
 var $_lang = 'en';

 function Core($options = array()){
  $this->_lang = 'ru'; // вот, жестко прописываю новое значение и, вуаля, в методе processLogin класса User переменная $this->_lang равняется 'ru'! НО! А в чем отличие от предыдущего способа присвоения переменной нового значения? Там просто цикл, который присваивает значения, но там не работает, а здесь работает?
 }
}

class User extends Core {
 var $_id;
 var $_role;

 function processLogin(){
  // теперь у меня переменная $this->_lang равняется 'ru'.
 }
}


Это сообщение отредактировал(а) artuska - 10.12.2008, 23:05
PM MAIL   Вверх
teroni
Дата 11.12.2008, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 15.5.2007
Где: Днепропетровск

Репутация: 8
Всего: 22



Цитата(artuska @  10.12.2008,  22:58 Найти цитируемый пост)
так что вы что-то путаете

Да, спешил, показалось, что у вас в дочернем классе есть конструктор. Удалил, но вы уже прочитали smile

На самом деле вся проблема в том, что вы не до конца понимаете разницу между классом и экземпляром класса. Может так станет понятнее:
Код

class Core
{
   var $_lang;
   function Core($lang = 'en')
      {
      $this->_lang = $lang;
      }
   function echoLangParent()
     {
     echo $this->_lang;
     }
}
class User extends Core
{
   function echoLangChild()
     {
     echo $this->_lang;
     }
}

// есть несколько вариантов создания объекта $user
// например, с передачей в него аргумента, который обработается конструктором
// класса User, или если его нету - конструктором родительского класса Core
$user = new User('ru');
$user->echoLangChild();  // ru
$user->echoLangParent(); // ru

// или без аргумента
$user = new User();
$user->echoLangChild();  // en
$user->echoLangParent(); // en

// а вот что делаете Вы
$core = new Core('ru'); // создаёте экземпляр родительского класса с передачей в него аргумента 'ru'
$user = new User();     // создаёте экземпляр дочернего класса без аргументов
$user->echoLangChild(); // естественно en
$user->echoLangParent(); // опять же en
$core->echoLangParent(); // ну а тут всё в порядке - ru


PM MAIL   Вверх
ksnk
Дата 11.12.2008, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



artuska, Возможно, стоит помнить и о такой "доброй" фенечке php4-го.
в коде 
Код

$core = new Core('ru');

Сначала создается экземпляр объекта Core, а потом, в операторе присваивания он дублируется. то есть после выполнения оператора присваивания существует 2 объекта Core с идентичными полями. Для 4-ки нужно бы писать 
Код

$core = &new Core('ru');






--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
artuska
  Дата 11.12.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Сделал так:
Код

// класс Core абсолютно такой же, как и в начале обсуждения
// класс User абсолютно такой же, как и в начале обсуждения

// вызываю все это так же, как и в начале, только теперь массив $options пихаю и в класс User
$options = array(
 'lang' => $lang
);
$core = new Core($options);
$user = new User($options);


Я-то думал, что можно создать один класс (Core), в котором есть некие необходимые переменные, и потом, те классы, которые наследуют первый класс (например, class User extends Core) будут не только наследовать переменные класса Core, но будут наследовать если я им присвою иные значения в конструкторе класса Core. А оказалось, что при вот этой записи — class User extends Core — конструктор класса Core исполняется еще раз, при создании класса User ($user = new User();), только уже без параметров $options, а массив $options по умолчанию у меня пустой, поэтому цикл foreach конструктора класса Core исполняется без параметров и не присваивает своим переменным новые значения. Кто не понял, вот пример:
Код

class Core {
 var $_lang = 'en';

 function Core($options = array()){
  foreach($options AS $key=>$value){
   $this->setOption($key, $value);
  }
  echo $this->_lang.'<br />'; // что это нам выведет? ru<br />en<br /> - второй раз он нам выведет язык, потому что конструктор класса Core исполняется еще и при вызове класса User, который extends Core, а так, как я вызываю класс User без параметов ($user = new User() - нету $options), то и мой цикл foreach ничего ничему не присваивает, так как массив $options пустой.
 }
}


Буду просто при вызове любого класса пихать туда массив переменных — $core = new Core($options); $user = new User($options);
Тема затянулась. Спасибо всем! Думаю, вопрос можно считать решенным.
PM MAIL   Вверх
Sanchezzz
  Дата 11.12.2008, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



а почему не сделать все подключения в одном классе и работать между классами внутри одного класса и в зависимости когда они нужны грузить их и вызывать.

немного теории как это сделать 

есть список классов (все классы разделить на файлы и переименовать на имя класа.пхп )

далее сделать функцию которая перебирает массив  методом foreach 

ишит совпадения если находит подключает файл класса и вызывает класс

переменную затем запихиваем в другой массив (для создания списка подключенных файлов) 

в функции присвоения 

пример $this->arrayClass[] = new имя класса

как их использовать core.arrayClass['имя класса'] и вызываем методы. 

создаовать копии также ( new или clone ) core.arrayClass['имя класса']


лично я уже такое сделал только у меня едро цмс использует большую вложенность классов каждый класс может обратится к функциям самого главного класса.

минус в такой реализации всегда строго следовать вызовом класса и их методам ну минус это ил плюс все классы хранить в одной папке.
плусы тоже есть все без global сделано и авто подключения класса нет не нужного кода на странице.

если приведете еще минусы с удовольствием почитаю.







--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
solenko
Дата 11.12.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Sanchezzz, я так и не понял что вы предлагаете и что сделали у себя. Если говорить приминительно к задаче топикстартера, то тут достаточно отдельного класса i18n c сингелтоном. 

например эту фразу я вообще не понял
Цитата

минус в такой реализации всегда строго следовать вызовом класса




--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
artuska
  Дата 11.12.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Цитата(solenko @  11.12.2008,  20:42 Найти цитируемый пост)
то тут достаточно отдельного класса i18n c сингелтоном

Можно тут по-подробней? Про синглетоны читал, но так и не понял, с чем его едят :(

PM MAIL   Вверх
Sanchezzz
Дата 11.12.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



i18n c сингелтоном ну у меня совсем другое

точто я написал я у себя, это мой велик...

как он работает подрубается один файл core далее у него есть пару методов

подключение класса и вызов компонента (форум, новости , магазин, итд) - они тоже находятся в классах

сам процесс:

1 Подключается коре класс.
2 главный класс  собирает сколько классов и какие есть и запихивает все в один массив.

Далее программист работает с классами через пользовательскую функция по вызову класса
$mysql = new или clone $core->arrclass['mysqli'];

вот про минус расскажу.

есть еще один класс который подключается через другие функции и чтобы передать туда все функции главного класса нужно передавать этому классу $this главного класса и тогда все классы будут доступны этому новому классу через следующи. конструкцию
Код

class  otherclass {
public $engine;

function otherclass(){}
function fun1(){

 $this->engine->runModul('mysqli') //вызвать и подрубить класс

$class1 = clone $this->engine->arrclass['mysqli']; //если такой уже был верху проверку на isset нужно сделать

$class2 = clone $this->engine->arrclass['ban'];
}

}


далее нужно передать ссылку от класса core 
Код


$bb = new otherclass();
$bb->engine = $this; // 
вот это и минус что приходится ссылки кидать главного ядра зато можно использовать в классе функцию подключения классов и други функции.


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0849 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.