![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| artuska |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 5.5.2007 Репутация: нет Всего: нет |
Есть переменная $lang = 'ru'; — отвечает за язык на странице.
Есть класс Core, которому очень нужна эта переменная, но в этом классе уже есть переменная $_lang которая по-дэфолту равна 'en' — чтобы контент сайта по-дэфолту был на английском. Хочу передать переменную $lang в класс Core, чтобы переменная $_lang класса Core стала не 'en', а 'ru' (ну, пользователь перешел с английской версии сайта на русскую). В класс Core, в зависимости от ситуации, передается массив переменных $options. Конструктор класса Core меняет значения дэфолтных переменных класса на новые значения, которые прибыли из массива $options. Класс Core
Классу Core я хочу передать переменную $lang, которая теперь уже равна 'ru'. Вот так:
Все идеально работает — если я где-нибудь в методе класса Core напишу echo $this->_lang, то у меня выведется не en, который был в начале по-дэфолту, а ru. Дальше. Есть класс User, который extends Core. Пишу где-нибудь в методе класса User echo $this->_lang, то он мне упорно возвращает en, хотя я уже присвоил переменной $_lang значение ru. Как сделать так, чтобы в класс User попадала переменная $_lang с новым значением, а не с тем, которое я задал сначала. Класс User
(Можт вопрос и тупой, но я реально нуб в ООП, и тут скорее всего что-то легкое нужно сделать, но я в упор не вижу что и как) |
||||||
|
|||||||
| Nikol |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 123 Регистрация: 5.4.2006 Где: Берег Черного мор я Репутация: 2 Всего: 4 |
Регистрируйте переменную в сессии и обращайтесь к ней, как к глобальной.
--------------------
Я не волшебник, я только учусь. |
|||
|
||||
| solenko |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 34 Всего: 67 |
artuska, ну как бы все логично. Инстанс класса User никак не связан с инстансом класса User. В вашем случае нужно использовать static члены класса:
как-то вот так. Кстати, php4 уже мертв. -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
| artuska |
|
||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 5.5.2007 Репутация: нет Всего: нет |
Ну да, вот и я так думаю — тобишь, если мы в классе Core поменяли значение переменной, то в классе User это ничего значить не будет — он будет наследовать изначальное значение переменной и все на том. Насчет этого...
...мне нужно чтобы переменная $this->_lang возвращала 'ru' именно внутри метода класса User. Вот я приведу реальный код, тогда вы поймете, что конкретно требуется:
Тобишь, мне не надо, чтобы какой-то метод возвращал мне язык, мне не надо, чтобы я мог обратиться к переменной где-нибудь за пределами класса — типа так $user = new User; echo $user->_lang; — мне это не надо. Я хочу внутри какого-нибудь метода класса User получить измененную переменную $this->_lang, которая приходит из класса Core, но значение которой там уже поменяли на другое. Тааак, начинается что-то интересное. Смотрим на класс Core, который я привел в самом начале темы. Теперь, если мы в конструкторе класса Core убираем цикл foreach и жестко пишем там $this->_lang = 'ru'; то теперь, в классе User, который extends Core у меня все работает - переменная $this->_lang теперь как и положено равняется 'ru'.
Что за ерунда? Получается, что вот эти функции (setOption и цикл foreach в конструкторе класса) не работают???
Но они работают! Они реально присваивают переменным новые значения. Если я напишу сразу после foreach'а - echo $this->_lang, то он мне выдаст 'ru', а значит замена значения переменной произошла.
Это сообщение отредактировал(а) artuska - 10.12.2008, 20:21 |
||||||||||
|
|||||||||||
| teroni |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 15.5.2007 Где: Днепропетровск Репутация: 8 Всего: 22 |
Вам же сказано, что инстансы классов Core и User никак между собой не связаны. Вы создали new Core, поменяли для него язык на русский, но инстанс User об этом даже не догадывается. Как вариант - можно передавать экземпляр Core в User.
|
|||
|
||||
| artuska |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 5.5.2007 Репутация: нет Всего: нет |
Попробовал, получилось. Вот только не глупо ли это, передавать экземпляр, если класс User и так уже extends Core?
Ну как это не связаны, я же говорю, если в конструкторе класса Core жестко пишем $this->_lang = 'ru'; то теперь, в классе User, который extends Core у меня все работает - переменная $this->_lang теперь как и положено равняется 'ru'
|
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Хмм... А почему меня на нем заставляют писать? Кругом меня некрофилы!!! Спасите меня!!! Аааааа!!! -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| solenko |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 34 Всего: 67 |
ksnk, писать?
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 -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
solenko, Мой работодатель тянет несколько заказчиков со своими серверами. Так что PHP4 жЫв, жЫл, и будет. жЫть forever!!! Хм.... До тех пор пока они платят деньги... Впрочем, php4 обладает тем свойством, что он практически без дополнительных телодвижений поддерживается php-5-м... Ну почти без дополнительных... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Nigel |
|
|||
|
познаю мир ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 20.11.2007 Репутация: 7 Всего: 19 |
artuska, а каким образом user относится к core. Я еще понимаю, если бы вы создали абстрактный класс пользователи, от него бы получили классы Admin, Moderator и тд. А так это похоже на: приделаем к самосвалу двигатель от самолета. "А теперь на всей этой фигне мы взлетим". На мой взгляд у вас явная ошибка в проектировании, я уж не говорю о том, зачем пользователю делать перенаправления куда-либо. Вы, похоже, используете ООП ради ООП. Не стоит, пишите обычно, как знаете, как умеете. А ооп попробуете, когда будете готовы.
|
|||
|
||||
| artuska |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 5.5.2007 Репутация: нет Всего: нет |
в данный момент — никак. Я же не буду постить здесь весь код класса Core, правильно. Я запостил только 2 метода из класса Core, чтобы показать логику. В классе Core у меня набор функций, которые используются не только в классе User, но и в других классах. Насчет "Вы, похоже, используете ООП ради ООП" — это так, ну надо же с чего-то начинать. Nigel, Вы мне просто скажите, почему переменная $_lang класса Core после присваивания ей другого значения в конструкторе класса Core, не работает в других классах, которые extends Core
Теперь приведу идиентичный код, в котором переменная $this->_lang в методе класса User будет равняться 'ru'
Это сообщение отредактировал(а) artuska - 10.12.2008, 22:46 |
||||
|
|||||
| teroni |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 15.5.2007 Где: Днепропетровск Репутация: 8 Всего: 22 |
удалено
Это сообщение отредактировал(а) teroni - 10.12.2008, 22:57 |
|||
|
||||
| artuska |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 5.5.2007 Репутация: нет Всего: нет |
Так-так-так, вразумительное предложение. Попробую сделать так:
Мдя, явная тупость. Даже параметры $options не передал функции Core() — а мне их и брать-то негде... ыыы Еще раз редактирую сообщение. С конструктором User расстаюсь, он не нужен, фигня полная. Дальше. Насчет
Вот здесь, в конструкторе класса Core я жестко присвоил переменной $this->_lang значение 'ru' и теперь в любом дочернем классе моя переменная $this->_lang равняется 'ru', а не 'en', так что вы что-то путаете.
Это сообщение отредактировал(а) artuska - 10.12.2008, 23:05 |
||||||||
|
|||||||||
| teroni |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 15.5.2007 Где: Днепропетровск Репутация: 8 Всего: 22 |
Да, спешил, показалось, что у вас в дочернем классе есть конструктор. Удалил, но вы уже прочитали На самом деле вся проблема в том, что вы не до конца понимаете разницу между классом и экземпляром класса. Может так станет понятнее:
|
|||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
artuska, Возможно, стоит помнить и о такой "доброй" фенечке php4-го.
в коде
Сначала создается экземпляр объекта Core, а потом, в операторе присваивания он дублируется. то есть после выполнения оператора присваивания существует 2 объекта Core с идентичными полями. Для 4-ки нужно бы писать
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| artuska |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 5.5.2007 Репутация: нет Всего: нет |
Сделал так:
Я-то думал, что можно создать один класс (Core), в котором есть некие необходимые переменные, и потом, те классы, которые наследуют первый класс (например, class User extends Core) будут не только наследовать переменные класса Core, но будут наследовать если я им присвою иные значения в конструкторе класса Core. А оказалось, что при вот этой записи — class User extends Core — конструктор класса Core исполняется еще раз, при создании класса User ($user = new User();), только уже без параметров $options, а массив $options по умолчанию у меня пустой, поэтому цикл foreach конструктора класса Core исполняется без параметров и не присваивает своим переменным новые значения. Кто не понял, вот пример:
Буду просто при вызове любого класса пихать туда массив переменных — $core = new Core($options); $user = new User($options); Тема затянулась. Спасибо всем! Думаю, вопрос можно считать решенным. |
||||
|
|||||
| Sanchezzz |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 41 Всего: 60 |
а почему не сделать все подключения в одном классе и работать между классами внутри одного класса и в зависимости когда они нужны грузить их и вызывать.
немного теории как это сделать есть список классов (все классы разделить на файлы и переименовать на имя класа.пхп ) далее сделать функцию которая перебирает массив методом foreach ишит совпадения если находит подключает файл класса и вызывает класс переменную затем запихиваем в другой массив (для создания списка подключенных файлов) в функции присвоения пример $this->arrayClass[] = new имя класса как их использовать core.arrayClass['имя класса'] и вызываем методы. создаовать копии также ( new или clone ) core.arrayClass['имя класса'] лично я уже такое сделал только у меня едро цмс использует большую вложенность классов каждый класс может обратится к функциям самого главного класса. минус в такой реализации всегда строго следовать вызовом класса и их методам ну минус это ил плюс все классы хранить в одной папке. плусы тоже есть все без global сделано и авто подключения класса нет не нужного кода на странице. если приведете еще минусы с удовольствием почитаю. -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
|||
|
||||
| solenko |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 34 Всего: 67 |
Sanchezzz, я так и не понял что вы предлагаете и что сделали у себя. Если говорить приминительно к задаче топикстартера, то тут достаточно отдельного класса i18n c сингелтоном.
например эту фразу я вообще не понял
-------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
| artuska |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 5.5.2007 Репутация: нет Всего: нет |
||||
|
||||
| Sanchezzz |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 41 Всего: 60 |
i18n c сингелтоном ну у меня совсем другое
точто я написал я у себя, это мой велик... как он работает подрубается один файл core далее у него есть пару методов подключение класса и вызов компонента (форум, новости , магазин, итд) - они тоже находятся в классах сам процесс: 1 Подключается коре класс. 2 главный класс собирает сколько классов и какие есть и запихивает все в один массив. Далее программист работает с классами через пользовательскую функция по вызову класса $mysql = new или clone $core->arrclass['mysqli']; вот про минус расскажу. есть еще один класс который подключается через другие функции и чтобы передать туда все функции главного класса нужно передавать этому классу $this главного класса и тогда все классы будут доступны этому новому классу через следующи. конструкцию
далее нужно передать ссылку от класса core
-------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
||||
|
|||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |