Покинул форум
Сообщений всего: 177
Дата рег-ции: Июль 2010 Откуда: Ukraine::Kiev
Помог: 1 раз(а)
ну потому что функция С() находится в классе A
Goshik
Отправлено: 27 Июля, 2010 - 16:54:26
Новичок
Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2008
Помог: 0 раз(а)
Да, но вызывается метод ЦЭ() из контекста класса БЭ, поэтому по идее должён возвращать переопределённую константу ЦЭ.
Arch-Web
Отправлено: 27 Июля, 2010 - 16:58:24
Частый гость
Покинул форум
Сообщений всего: 177
Дата рег-ции: Июль 2010 Откуда: Ukraine::Kiev
Помог: 1 раз(а)
Goshik ну она только вызывается ,у вас два класса и с класса С вы можете использувать все что в классе А ,а так как вы используете функцию с класса А то она и возвращает вам то что в A::C
unded
Отправлено: 27 Июля, 2010 - 17:30:21
Новичок
Покинул форум
Сообщений всего: 43
Дата рег-ции: Март 2010
Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2008
Помог: 0 раз(а)
2unded
Ты меня неправильно понял. Я хочу добиться эффекта прототивоположного тому что ты предлагаешь.
2Arch-Web На сколько я знаю при наследовании, в классе наследнике создаются свои методы. И они нифига не должны вызываться из класа родителя. Для этого есть ключевое слово parent.
Здесь всё ОК, выводится 100600 как и следовало ожидать. Почему эта фича не работает с константами и статическими полями, йух его знает. Возможно дело в разнице "->" и "::". Или просто я туплю?
Мелкий
Отправлено: 27 Июля, 2010 - 18:22:47
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
А может именно от того, что это константа и дочерний класс её просто не переопределяет?
----- PostgreSQL DBA
Arch-Web
Отправлено: 27 Июля, 2010 - 18:24:29
Частый гость
Покинул форум
Сообщений всего: 177
Дата рег-ции: Июль 2010 Откуда: Ukraine::Kiev
Помог: 1 раз(а)
Мелкий скорей всего так и есть ,т.к константу нельзя переписать
Goshik
Отправлено: 27 Июля, 2010 - 18:37:45
Новичок
Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2008
Помог: 0 раз(а)
>Мелкий скорей всего так и есть ,т.к константу нельзя переписать
Авотфиг. Если написать в конструкторе класса БЭ echo self::C, то тогда выведется 100600, т.е. константа переопределяется. Также напоминаю что со статическими полями та же фигня.
Добавлено:
Есть подозрение, что косяк вот в чём:
self - это константа, которая заменяется на имя класса в котором обЪявлен метод (в нашем случае это A).
$this - это переменная в которой хранится ссылка на создаваемый обЪект. В нашем случае обЪект БЭ.
Вот если бы к константам можно было к константам через зыс обращаться...
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Goshik Ваш вопрос является достаточно интересным и для получения полного ответа на него - необходимо подробно разобрать каким образом поступает PHP-интерпретатор при выполнении данного участка кода - в частности рассмотреть области видимости и пространства имен объектов а также динамическое связывание во время выполнения
Важно понимать что несмотря на то что PHP напрямую реализует ООП-концепции но он является динамически языком - и поэтому реальные программные элементы классов имеют свою область видимости и свое время разыменовывания и подстановки значения переменных то есть динамического связывания И даже если некоторая функция используестся в наследуемом классе - то часть контекста она берет из того участка программного кода где она реально определена Такое поведение берет свое начало из того что в PHP иногда объекты первого и второго рода смешиваются между собой - с одной стороны в PHP 5.2 функция не является объектом первого рода и может определеяться только один раз и притом статически - но в то же время возможно условное определение функций или наличие вложенных функций что является проявление повеления объекта первого рода Аналогичная ситуация проявляется и при работе с ООП - с одной стороне методы базовых классов и классов-наследников проявляются в контексте текущего экземпляра и сам класс является только шаблоном - но с другой стороны элементы класса могут работать как отдельный программный код
Рассмотрим различные варианты обработки приведенного PHP-кода интерпретатором К примеру для ускорения процесса обработки интерпретатор может производить предварительную замену значений-констант в соответствии с пространством имен в котором они находятся - в таком случае приведенная функция к моменту выполнения уже будет содержать конструкцию вывода заданной константы - и соответственно везде где данная функция будет использоваться она будет возвращать одно и то же значений В принципе такой подход является оправданным - ведь в PHP функции по умолчанию работают с локальными переменными вне зависимости от того из какого контекста они вызывались - и соответственно в отсутсвии оператора глобализации global она должна сохранять это значений С классами ситуация обстоит почти также причем имя класса является именем пространства имен а оператор :: используется для расширения области видимости - то есть для обычного метода внутри класса локальными являются его внутренние переменные и поля класса доступные через операцию расширения области видимости С другой стороны с точки зрения обычного ООП для метода класса должны быть доступны в качестве локальный переменных поля конкретного экземпляра - в этом случае они привязаны уже не к контексту в котором располагается код метода а к контексту в котором они вызываются через соответствующий экземпляр Таким образом получается что метод класса работает с двумя типами переменных из разных контекстов - которые тем не менее являются локальными относительно него и обращение к которым осуществляется через ключевое слово self При этом ввиду различной природы данных переменных и контекстов к которым они принадлежат сооответствующее динамическое связывание происходит также в различое время - из-за чего и возникает указанная вами особенность
Goshik пишет:
Также напоминаю что со статическими полями та же фигня
Статические поля по сути являются обычными переменными находящимися в определенном пространстве имен доступ к которому осуществляется через имя класса и оператор расширения области видимости - и соответственно при наследовании классов и создании экземпляров они остаются неизменными и привязанными к самому определению класса Поля констант таким образом можно считать статическими полями - доступными для инициализации только один раз
В PHP существуют достаточно эффективные средства которые возволяет управлять указанной схемой работы - пакет runkit http://www.php.su/functions/?cat=runkit позволяет осуществлять динамические манипуляции с элементами классов и обычными функциями С помощью использования данных функций а также eval по необходимости можно добиться осуществление связывание в нужный момент времени - с переключением на соответствущим правильный контекст - при этом перерасчет кода метода должен происходить в связи с требуемым классом
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
like_you
Отправлено: 30 Декабря, 2010 - 19:30:17
Гость
Покинул форум
Сообщений всего: 82
Дата рег-ции: Июнь 2010 Откуда: Харківська обл. с. Криштопівка
Помог: 0 раз(а)
Или я чего то недопонял в обсуждаемом вопросе или просто не все видят такую маленькую деталь как скопки при вызове self::C().
Если требуется переопределить константу, то просто нужно вызвать self::C в дочернем классе:
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Champion
Отправлено: 30 Декабря, 2010 - 20:24:13
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Убедительная просьба, касающаяся всех: если вы недопонимаете вопрос, не отвечайте на него.
Отдельная просьба к, JustUserR, (в принципе, эту просьбу я уже много раз озвучивал, но он ее упорно игнорирует): хотя бы в больших текстах следует расставлять знаки препинания. Особенно, когда витееватые речевые обороты лежат друг на друге. Просто отсутствие запятых и, тем более точек, и несогласованность падежей слов сводет на нет глубокий (возможно) смысл всего написанного. (Добавление)
А вопрос интересный. Виновато во всем позднее статическое связываение: http://habrahabr[dot]ru/blogs/php/23066/
Если с английским в хороших отношениях, то http://www.php.net/manual/en/lan...tic-bindings.php
JustUserR
Отправлено: 30 Декабря, 2010 - 20:44:31
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
like_you Описанное автором оригинальное функционирование PHP-приложения осущестлвяющего тестирование ООП-возможностей языка - в действительности является корректным
В качестве наиболее простого объяснения указанной ситуации может использоваться тот факт что вся ООП-реализация языка PHP в действительности представляет собой комбинацию именованных пространств имен и ссылок на объекты - с включением внутренних реализций синтаксических ООП-конструкций
Используемая в рассматриваемом приложении констуркция в действительности включает в себя действия по вызову переопределенного метода родительского класса вызываемого из его области - для включения собственной требуемой функциональности допустимо использование целевого метода в управляемом режиме из требуемого контекста
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.