![]() |
|
Модераторы: 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-ки нужно бы писать
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
![]()
|
| Правила форума "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. |