0 / 0 / 1
Регистрация: 11.10.2017
Сообщений: 27
|
||||||||||||||||
1 | ||||||||||||||||
(ООП) Область видимости полей, созданных динамически29.10.2017, 13:46. Показов 973. Ответов 10
Метки нет Все метки)
(
Есть у меня такой класс
И есть другой класс
так же в классе XGroup есть большая длинная функция, в которой делается так:
Как динамически создать новые поля класса, так чтобы потомки класса его видели? Edit: только после создания темы, заметил что на форуме есть раздел PHP: ООП. Если модераторы перенесут тему туда, возражать не буду)
0
|
|
29.10.2017, 13:46 | |
Ответы с готовыми решениями:
10
Обработка динамически созданных полей
Область видимости Область видимости |
29.10.2017, 14:26 | 2 |
Хм... Что то мне кажется (я конечно не знаю деталей вашей задачи, но тем не менее), что создавать свойства класса это дурной тон. При чем даже не класса, а объекта... Т.е. по факту вы уже имеете объект какого то иного класса. Если использовать эти "новоиспеченные" свойства вне класса - то есть шанс однажды уронить проект, забыв о существовании свойства... Или выкинув "за ненадобностью" (а по факту забыв) незадекларированое в классе свойство.... А если это свойство пропадет из источника - обрушится проект? бррр.... Я бы руки пообрывал.
На мой личный взгляд правильнее было бы сделать приватное свойство типа массив (ассоциативный) и заносить в него все, что вам нужно. А для получения значений вне класса - сделать геттер. (а если нужно и задавать по отдельности - сеттер). В геттере проверять наличие и производить определенное действие (бросать исключение, возвращать специальное значение). Так ваш код будет прозрачным и понятным. А так вы даже задокументировать не сможете. Т.е. я работаю с вашим кодом в нормальной ide. Вижу типа $myObhect->exploded_participants , подсказки не появляется, гляжу в описание класса- там нет такого.... ужас. Добавлено через 4 минуты О как.. Это еще хлеще. Ни как. Приведенным выше кодом, вы свойства не у класса создаете, а у объекта. Для нужного вам эффекта., делайте protected статическое свойство типа массив и далее как выше я сказал
0
|
![]() 4841 / 3853 / 1599
Регистрация: 24.04.2014
Сообщений: 11,304
|
||||||
29.10.2017, 14:34 | 3 | |||||
Zander_driver, рекомендую весь код выше удалить, почитать литературу по теме объектно ориентированное проектирование, и после этого вернуться к задаче
Думаю это и имелось ввиду, просто ТС не разделяет понятия класс и объект
0
|
0 / 0 / 1
Регистрация: 11.10.2017
Сообщений: 27
|
||||||
29.10.2017, 15:41 [ТС] | 4 | |||||
Есть классы, они могут друг друга наследовать, а есть объекты, которые могут быть экземплярами класса. В моем верхнем посте имелось в виду - как методами класса-родителя, создавать динамические поля видимые для методов класса-потомка. Создавать у объекта конечно же, просто вопрос касается принадлежности методов (создающих и читающих) к разным классам. Добавлено через 5 минут Но, на Луа например я раньше многократно делал объекты классов, с динамически добавляемыми полями как переменных, так и методов. Эдакий объект, который "на лету" определяет, какие интерфейсы он (его класс? индивидуально созданный "для этого объекта" уже после его создания) будет реализовывать. Хотя мб в php это действительно лучше делать иначе, через массивы. Добавлено через 21 минуту В то же время mysqli->query(бла-бла) с последующим result->fetch_object() создает объект с заранее неизвестными полями. (Известными, если посмотреть структуру БД и запрос) И класс-родитель у меня наследует от StdClass не случайно... так что вопрос я все же повторю в более точной формулировке, дабы избежать обвинений в неразличении понятий класс/объект и прочих азов ООП. Как методами класса-родителя, создать у конкретного объекта, поля (и методы), видимые для методов класса-потомка. Чтобы у данного объекта, методы класса-потомка (собственно класса, объект которого создавался конструктором), могли обращаться к новым динамически созданным полям и методам. То что приведенная в первопосте задача, решается многими другими путями, это понятно. Как и понятно, что один из вариантов ответа на выделенный вопрос - это создать массив и туда все новосозданное пихать. Но это не всегда приемлемо, а вдруг я хочу динамически переопределять "родные" методы класса? у данного конкретного объекта, разумеется. Мы же динамически переопределяем. Так что для саморазвития буду благодарен если кто-то даст ответ на вопрос, выделенный жирным. Добавлено через 9 минут Прокомментирую то что я хочу.
0
|
![]() 4841 / 3853 / 1599
Регистрация: 24.04.2014
Сообщений: 11,304
|
|
29.10.2017, 16:10 | 5 |
![]() Я уже приводил пример (ООП) Область видимости полей, созданных динамически В общем повторюсь
0
|
0 / 0 / 1
Регистрация: 11.10.2017
Сообщений: 27
|
|
29.10.2017, 17:28 [ТС] | 6 |
т.е. способность иметь динамически создаваемые поля есть у любого класса? окей. я не был уверен что в php это так.
Который наводит на мысли, что вы не понимаете о чем речь, к сожалению. В противном случае поясните мне, почему в моем вышеприведенном коде, экземпляр класса XGroup (его методы), не видят поле exploded_participants, (отсутствующее в описании обоих классов), динамически созданное методом класса AjaxCoreObject. объект один и тот же. для создания нового поля обращаемся к методу класса-родителя. потом в методе собственно этого класса, к которому принадлежит объект, пытаемся обратиться к этому полю, а оказывается что "его нет". Причина?
0
|
![]() 4841 / 3853 / 1599
Регистрация: 24.04.2014
Сообщений: 11,304
|
|
29.10.2017, 18:00 | 7 |
0
|
0 / 0 / 1
Регистрация: 11.10.2017
Сообщений: 27
|
||||||
29.10.2017, 18:21 [ТС] | 8 | |||||
Порылся в проблеме самостоятельно, получилось следующее.
1) если явно не создать его как массив, то его и нету, тип NULL (это в принципе логично, но почему-то умалчивается всеми справочниками, везде утверждается что конструкция вида $a[что-то] = $b при изначальном отсутствии переменной $a, создает массив. Ага щаз.) 2) даже несмотря на то, что массив создан. (тип yy - array) - его значения не доступны. Вот она собственно и проблема. И не надо мне показывать как просто это делается. Почему не делается в динамически создаваемом массиве?
0
|
![]() 4841 / 3853 / 1599
Регистрация: 24.04.2014
Сообщений: 11,304
|
||||||
29.10.2017, 20:06 | 9 | |||||
![]() Решение
так и есть http://sandbox.onlinephpfuncti... 05aed20ab3
Добавлено через 15 минут Такие конструкции будут по-разному работать в php 5 и 7. В 5 скобки будут расставлены таким образом $this->{$aname[0]} = $aval; , в 7 $this->{$aname}[0] = $aval; В 7 версии этот код будет работать, в 5 нет http://sandbox.onlinephpfuncti... e7dfee5427
0
|
0 / 0 / 1
Регистрация: 11.10.2017
Сообщений: 27
|
|
29.10.2017, 21:00 [ТС] | 10 |
Спасибо. Значит php5 устарел, т.к. поведение "не создавать массив а ругаться, при вызове $this->$несуществующая_переменная[0] = $x;" - логически не верно.
0
|
![]() 4841 / 3853 / 1599
Регистрация: 24.04.2014
Сообщений: 11,304
|
|
29.10.2017, 21:17 | 11 |
0
|
29.10.2017, 21:17 | |
Помогаю со студенческими работами здесь
11
Область видимости ПОлучить данные методом Post из динамически созданных input'ов Как передать значения на сервер из динамически созданных <select>
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |