Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Подскажите, правильно ли я делаю? Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. У меня есть большой код в виде множества различных функций. Хочу сделать рефакторинг, потому что вызывать последовательно определенные процедуры становится неудобно. ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 12:02 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Alibek B.Подскажите, правильно ли я делаю? нет зачем глобальная переменная $cfg ? нужна классу конфигурация - передайте её через конструктор а в данном случае параметры нужны не классу, а методу и передавать методу лучше нормальные именованые параметры, а не массив ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 12:07 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Я бы хотел держать все конфигурационные переменные в отдельном подключаемом php-файле (мне так удобнее будет подстраивать систему). Поскольку в этом конфигурационном файле указываются пароли, желательно чтобы он был за пределами www-сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 12:19 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Alibek B.Я бы хотел держать все конфигурационные переменные в отдельном подключаемом php-файле (мне так удобнее будет подстраивать систему). Поскольку в этом конфигурационном файле указываются пароли, желательно чтобы он был за пределами www-сервера. а кто мешает? держите где угодно. читайте этот конфиг, вытаскивайте нужные параметры, присваивайте их нужным переменным и свойствам объектов(через конструктор или сеттеры). глобальная переменная в данном случае не лучший вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 12:52 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Alibek B.Я бы хотел держать все конфигурационные переменные в отдельном подключаемом php-файле (мне так удобнее будет подстраивать систему). Поскольку в этом конфигурационном файле указываются пароли, желательно чтобы он был за пределами www-сервера. желательно чтобы всё что не относиться к стартовому скрипту(а лучше чтоб такой был один) было всё за пределами вебкорня а нащот класов - что значит верно не верно. (в даном случае на ересь похоже, но...) смотря от цели... это же магическая конструкция, которая используеться одним способом... определись зачем ты пишешь клас, вот на листике возьми и напиши, что не так счас в коде...что плохо. как хочешь, как через класс собираешься этого добиться. ========= у меня есть код и куча функций, вызывать не удобно..а класс сам будет вызывать типо??? это как?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 13:51 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Класс нужен: 1. Сейчас код подключаемого модуля выглядит так: в глобальном контексте объявлены переменные с параметрами (в том числе и с паролями) и множество (десятка два) функций, которые делают какую-то одну вещь. Для получения каких-либо данных я вызываю три-четыре функции в определенном порядке. При этом у меня используется CURL и я в держу ссылку на открытую сессию CURL (в процессе выполнения корневого скрипта выполняется несколько CURL-запросов), передавая ее из функции в функцию. Хотелось бы упростить сопровождение скрипта. Создал объект — в нем все что надо инициализировалось. Закрыл объект — все закрылось. 2. Если вдруг где-то накосячу, наружу могут вылезти значения глобальных переменных, в которых хранятся пароли. Хотелось бы все инкапсулировать, чтобы из объекта «наружу» торчали только интерфейсы, а не потроха. Правда с этим какая-то странность. Объявляю в классе private-массив, заполняю внутри класса значения. Но когда снаружи делаю print_r($obj), то вижу все private-члены класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 14:08 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Alibek B.Хотелось бы упростить сопровождение скрипта. Создал объект — в нем все что надо инициализировалось. Закрыл объект — все закрылось. это правильно. только забудь в этом классе обращения к глобальным переменным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 14:31 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Alibek B.Класс нужен: 1. Сейчас код подключаемого модуля выглядит так: в глобальном контексте объявлены переменные с параметрами (в том числе и с паролями) и множество (десятка два) функций, которые делают какую-то одну вещь. Для получения каких-либо данных я вызываю три-четыре функции в определенном порядке. При этом у меня используется CURL и я в держу ссылку на открытую сессию CURL (в процессе выполнения корневого скрипта выполняется несколько CURL-запросов), передавая ее из функции в функцию. Хотелось бы упростить сопровождение скрипта. Создал объект — в нем все что надо инициализировалось. Закрыл объект — все закрылось. 2. Если вдруг где-то накосячу, наружу могут вылезти значения глобальных переменных, в которых хранятся пароли. Хотелось бы все инкапсулировать, чтобы из объекта «наружу» торчали только интерфейсы, а не потроха. Правда с этим какая-то странность. Объявляю в классе private-массив, заполняю внутри класса значения. Но когда снаружи делаю print_r($obj), то вижу все private-члены класса. 1. "Для получения каких-либо данных я вызываю три-четыре функции в определенном порядке" - что мешает сделать пятую функцию, которая будет вызывать описанные 4 функции и возвращать из них данные в правильном формате? 2. Насчёт глобальных переменных - их вообще использовать не надо, это факт. Но не из-за бреши в безопасности, а из-за неочевидности кода (функция меняет то, что ей менять не положено по задумке вызывающего кода) 3. разные print_r, var_dump, var_export в принципе сериализируют входные данные. Потому каждая из них будет приводить настолько точную текстовую копию объекта, насколько это возможно (со всеми приватными свойствами). var_export если не ошибаюсь вообще создавалась так, что бы возвращённый код можно было прогнать через eval и получить точную копию переданного объекта. А вообще... что значит "Если вдруг где-то накосячу, наружу могут вылезти значения глобальных переменных"? Насколько я понимаю, это возможно только в связке с eval (по сути зло), echo, print и т.д. ... Любой другой метод предполагает взлом самого приложения, ну а тогда уже неважно какие там переменные используются... получив доступ к файлам приложения, из них можно вытянуть всё, что угодно :) А вообще полноценная модульность мне видится именно в использовании ООП. Объекты модулей подгружают в себя объекты разных компонентов, типа работы с базой, разных отображений, специальные компоненты обработки данных, сущности типа пользователе и тому подобное, а уже само приложение подгружает сам объект модуля. При этом все параметры объектов передаются как аргументы конструкторов. При этом не должно быть такого параметра, который возможно было бы не задать в конструкторе, но при этом без которого сам объект остаётся недееспособным, не несущим никакой сути (ну как например объект изображения без ссылки на картинку :) ). Очень важно - использование интерфейсов. Если модуль предполагает наличие неких универсальных API функций, то он должен реализовать соответствующий интерфейс. Если же эти функции можно определить по-умолчанию не нанеся системе вреда, или же есть некая общая заготовка под модуль, со всеми требуемыми параметрами и тому подобное, то надо такую заготовку определять как абстрактный класс и уже от неё создавать модули (при этом при подгрузке модуля проверять что бы он обязательно реализовывал указанный интерфейс или был наследником указанного класса). Ну то есть переводить код 1 в 1 с процедурного в ООП нету особого смысла. Он станет, возможно, немного более понятным, но в целом ничего не изменится. Если уже строить объектную модель системы, то делать это надо правильно, сначала до малейших деталей продумал что и как будет устроено и с точным пониманием иерархии классов в приложении. Судя по вопросу такая подготовка к рефакторингу не была проделана :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 14:53 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Alibek B.Класс нужен: 1. Сейчас код подключаемого модуля выглядит так: в глобальном контексте объявлены переменные с параметрами (в том числе и с паролями) и множество (десятка два) функций, которые делают какую-то одну вещь. Для получения каких-либо данных я вызываю три-четыре функции в определенном порядке. При этом у меня используется CURL и я в держу ссылку на открытую сессию CURL (в процессе выполнения корневого скрипта выполняется несколько CURL-запросов), передавая ее из функции в функцию. Хотелось бы упростить сопровождение скрипта. Создал объект — в нем все что надо инициализировалось. Закрыл объект — все закрылось. 2. Если вдруг где-то накосячу, наружу могут вылезти значения глобальных переменных, в которых хранятся пароли. Хотелось бы все инкапсулировать, чтобы из объекта «наружу» торчали только интерфейсы, а не потроха. Правда с этим какая-то странность. Объявляю в классе private-массив, заполняю внутри класса значения. Но когда снаружи делаю print_r($obj), то вижу все private-члены класса. мдя..код на пхп твой явно не соответсвует текту :) я про прочитаное чтиво где расхвалили опп. отсюда и трудности. хочешь не понимая сделать. 1) есть много функций, вызываю по очереди 4 из них --- это класика продурного програмирования, на ооп она переноситься без изменений func1();func2();func3();func4(); ->>> function user_action1(){func1();func2();func3();func4();} 2)чтобы наружу не лезло, не должно быть безконтрольных эхо, и сдесь тебе ооп не помочник. общее правило такое, есть грубо говоря у тебя два места в коде где есть команда ехо(в коде где первая строка открытие пхп тега, и дальше только пхп и не закрываеться пхп тег) где ты выдаёшь документ - подходит для сайтов когда отдача штмл странички, для мелких файлов. где ты динамически выдаёшь большой обьём в цикле. хотя первую, можно свести как часный случай второй, - цикл с одной итерацией получиться. но это уже гемор и зря, учитывая что почти всегда надо только первый случай. 3)нащот конфига в одном файле. сделай лучше сразу заготовку конфига который строиться... - главный конфиг, который подключает локальный конфиг(суть которого специфика сервера - класика жанра, разработка на локалхосте и работа на хостинге...скорей всего подключение к базе разные настройки) и клас конфиг, который при инициализации считывает это дело, и имеем интерфейсный метод получения настройки по имени. 4)главное - не пытайся сразу придумать архитектуру идеальную. вот возьми простое, напиши свой класс конфиг под интерфейс Код: php 1. 2. 3. задачка со звёздочкой, конфиг, это ведь не единый масив, а масив где есть свои масивы...скажем так, конфигурационная група - скажем настройки для базы данных. мне нравиться изза практического удобства, это когда я могу так... Config::get('dbauth.server2.login') - если представить весь конфиг ввиде масива, то возвратиться елемент $_config['dbauth']['server2']['login'] - удобсво изза краткости записи, через точку короче чем через набор параметров для гет(разделителем будет запятая пробел доллар), через масив (разделителем получиться кавычка запятая конец строки кавычка) --- вторым макаром напиши обёртку к глобальным масивам. Код: php 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 14:59 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 15:03 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Alibek B., добавлю ещё )) Надо избегать неявного использования глобальных переменных (значений). То есть, нельзя предполагать, что когда объект создан, то уже открыто подключение к базе и при том к той, которая нужна. Объект должен быть полностью самодостаточен. То есть он в конструкторе должен запросить для себя соединение, сохранить его у себя, а потом работать с базой через него. При уничтожении он разумеется должен запросить и разрыв соединения с базой... ну и тому подобное :) И пускай это даже будет объект (а точнее не "пускай даже", а это скорее должен быть объект), который имеет метод getConnection, при вызове этого метода идёт проверка аргументов и если соответствующее соединение уже создано, то отдаётся ссылка на готовое соединение, иначе отдаётся ссылка на новый ресурс (ну то есть singleton объект). При closeConnection, подсчитывается количество запрошенных соединений, и если равно нулю (после выполнения dec), то соединение закрывается. Надо рассчитывать на нормальную масштабируемость системы, что бы при переносе данных модуля например в другую базу система могла продолжать функционирование при смене конфига, или же минимальной смене кода (что бы не пришлось начинать мутить новый механизм доступа к базе). Иначе как я говорил это получится сложный, но очень маленький шаг, который придётся повторять каждых несколько месяцев так как система будет переставать отвечать задуманным требованиям (когда начинал кодить все мои поделки страдали этим недостатком, потому уже научен за те немногие годы работы, хотя иногда и допускаю подобные ошибки в архитектуре, но не такие значимые :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 15:08 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Програмёр, это уже один из подходов. у меня между моделями и базой есть прослойка - класс датабейс Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 15:17 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
запомните это дети и НИКОГОДА больше так не делайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 15:31 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
ScareCrowзапомните это дети и НИКОГОДА больше так не делайте. Надо написать наверное памятку для некоторых участников форума о правильных и логичных ответах. 1. При возникновении противоречий с написанным сформулируйте свой ответ 2. Убедитесь, что Ваш ответ отвечает на вопросы "как?" и "почему?" (если нет, задание можно считать проваленным и стоит начать по новой) 3. Нажмите на предосмотр и перечитайте получившейся ответ 4. Нажмите на кнопку отправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 15:37 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Что-то не понимаю я PHP. Должно быть что-то вроде такого? Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. Код вроде бы работает, но мне непонятны следующие моменты. 1. Я не могу создать в контексте класса обычные приватные переменные, а не свойства класса? Чтобы можно было использовать $config, а не $this->config. 2. Меня опять таки смущает, что вывод print_r($unifi) выводит все приватные свойства. Нельзя ли сделать так, чтобы приватные свойства/переменные не были видны снаружи? 3. По советам я попробовал использовать интерфейсы. Допустим я создаю interface iUnifi с описаниями методов. Почему при создании методов класса я снова должен указывать у метода те же аргументы, что и в интерфейсе? Ведь метод уже описан в интерфейсе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 15:41 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Alibek B.print_r($unifi) это отладочная функция. В отладчике приватные поля ведь хочется видеть? Alibek B.Почему при создании методов класса я снова должен указывать у метода те же аргументы, что и в интерфейсе? Ведь метод уже описан в интерфейсе? такова спецификация языка. Собственно полезно видеть глазами имена(и опционально типы) параметров там где тело метода пишется Alibek B.1. Я не могу создать в контексте класса обычные приватные переменные, а не свойства класса? Чтобы можно было использовать $config, а не $this->config. смиритесь, тем более при использовании языков где this опционален зачастую его записывают, чтоб явно указать, что обращаемся не к локальной переменной, а члену класса. использование this в методах инициализации позволяет использовать одно и то же имя для параметра и поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 16:33 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Alibek B., эээх... пошли разбирать )) Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. Смысл такого конструктора? Через месяц забудете как делали, и не передадите в него одно из требуемых значений... что произойдёт? ошибка ))) На этапе выполнения... то есть работа будет готова, сдана, но при этом нестабильна!!! Ещё интереснее return $this->_init();. Что этот код должен вернуть при вызове конструктора? :) А ничего, что конструктор объекта может вернуть только соответствующий объект? ). Потому это "ошибка запроса" будет благополучно съедено системой :) Имеет ли смысл продолжать работу, если инициализация объекта провалилась? Если имеет, то это должно быть учтено в самом объекте, который должен раппортировать о провале (и оставить решение о перезапросе программисту) или же сделать повторный запрос самостоятельно. Если же дальнейшая работа с объектом теряет смысл, то должно быть брошено исключение, на которое будет соответствующая реакция извне. Весь код перелопачивать не хочу, так как сижу на работе :) По поводу интерфейсов... ну что можно сказать (по поводу повторения списка аргументов). Перегрузка методов (или как это правильно называется не помню, когда одноимённые методы с разным списком аргументов реализуются по-разному) в php отсутствует, однако для понимания ситуации достаточно вспомнить как это работает в С++ (паскале и где угодно ещё, где есть перегрузка методов). Что, если я определю 2 метода с разным списком аргументов? Надо же как-то указать какой из методов реализуется. Ну вот в пхп что бы не уходить от стандарта (я так думаю) решили использовать общепринятую систему указания аргументов как в оглавлении, так и в реализации. Тем более что это удобнее, когда видя реализацию методов видишь и список аргументов, а не каждый раз бегаешь в файл с соответствующими оглавлениями (тем более что не всегда понятно где они лежат). По поводу переменных в контексте класса... Ну тут просто надо почитать про области видимости переменных в php. Насколько я понмю в пхп даже нету такого понятия как контекст выполнения. Там под каждый метод создаётся собственный "контекст" со своим списком переменных, и при этом контексты методов не вкладываются друг в друга как в js. Потому метод связан с объектом, атрибутом которого является, только неявным параметром this переданным в этот метод. Потому из метода нету возможности добраться до свойств объекта как либо окромя указателя $this :) И это правильно, так как все эти "замыкания" это побочные эффекты :) Я точно такой же побочный эффект получил когда писал свой второй шаблонизатор ))) И это отнюдь была не гениальная идея, просто ошибка, которая вылилась в некоторое удобство... Но если на основании шаблонизатора делать новый язык, то такое замыкание приводит к сбоям логики :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 16:41 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
авторЯ не могу создать в контексте класса обычные приватные переменные, а не свойства класса? Чтобы можно было использовать $config, а не $this->config как мсье себе это представляет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 16:42 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
ScareCrowкак мсье себе это представляет? как в Java,с++,c# ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 16:44 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
автор А ничего, что конструктор объекта может вернуть только соответствующий объект? вы это ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 16:44 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
ИзопропилScareCrowкак мсье себе это представляет? как в Java,с++,c# тоетсь никак. эпично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 16:44 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
авторНасколько я понмю в пхп даже нету такого понятия как контекст выполнения. Там под каждый метод создаётся собственный "контекст" со своим списком переменных ты сделал мой день. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 16:46 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
автор Потому из метода нету возможности добраться до свойств объекта как либо окромя указателя $this : жжошь. жги еще, а я пока за попкорном схожу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 16:48 |
|
||
|
Использование объектов в PHP
|
|||
|---|---|---|---|
|
#18+
Насчет return в конструкторе принял к сведению. С остальным пока буду разбираться. Еще такой вопрос. Вот у меня есть базовый класс UnifiClass. В нем могут быть дочерние объекты, UnifiApClass и UnifiStaClass. Делаю это примерно так: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. В таком виде я могу из основного объекта получить ссылку на дочерний объект и работать уже с его методами и свойствами: Код: php 1. 2. 3. Допустим нужные мне дополнительные методы я пропишу. Но в приватном массиве data, который получается в конструкторе и в методе refresh, есть целая куча свойств. Причем это не фиксированный список, там могут быть дополнительные поля. Можно ли написать дефолтный метод, который на обращения вида $ap->field1 будет возвращать содержимое $data['field1']? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2014, 17:06 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38666627&tid=1462707]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 375ms |

| 0 / 0 |
