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

Поиск:

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


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

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