Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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