Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
пример (как-то так): Код: 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. Это кусок моего фреймворка для работы с объектами БД как сущностями и позволяющий "не заморачиваться" каким способом соединять таблицы зависимых сущностей БД промеж себя, дабы выбрать нужную конфигурацию данных. Пример сильно упрощен, дабы показать проблему. А проблема в следующем: обнаруживается утечка памяти при таком способе работы с наследованием, а именно: дочерние классы не имеют метода объекта выборки данных. Метод выборки - один и находится в базовом классе. Каждый дочерний класс переопределяет собственный статический метод формирования запроса (или его части), который окончательно собирается уже в базовом методе выборки данных: Base->getData(). Проблема в том, что "память медленно течёт". PHP 5.2.17. Кто-нибудь сталкивался с таким или я делаю что-то запрещенное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 19:02 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
автор// собственно заглушка. Наверное можно сделать даже abstract, не пробовал. static public function getSql( Select $sql, array $params ) { return false; } не пишите своё. возьмите уже существующий фреймворк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 23:24 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, а по существу вопроса - ответов/советов не будет? Дело в том, что все проверки, воткнутые в код - отрабатывают "как надо". Апач работает в среднем часов 6 и потом валится по 502, сообщая "canary mismatch on efree() heap overflow ..." на вызове одного и того же метода, который достает данные из БД таким способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 09:04 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, Какой "существующий" фреймворк посоветуете, для решения следующих задач: 1. Выборка данных из БД сложной архитектуры (сущности распределены в среднем по 10-12 подчиненным таблицам) в 3-4НФ + EAV + Иерархическое хранение сущностей, произвольной переменной вложенности. То есть запрос к БД надо формировать динамически, желательно оптимального построения из простых массивов/наборов условий, типа: "отдай мне все заявки по регионам таким-то, кроме города такого-то, которые прошли по фирмам имеющим в своем прайсе товары, у которых свойство "длина" не более 4м из товарных подразделов содержащих вид товара "доска", кроме такого раздела И которые (фирмы) отвечали на заявку не позднее 1 часа от момента отправки заявки." Формулируется и собирается крайне просто, в виде сложного массива типа Код: php 1. 2. 3. 4. 5. 6. 7. , и чтобы мне было достаточно прописать некий базовый метод(ы) к той или иной сущности (региону, городу, мылам и т.д.) КАК она участвует в запросах ... и больше не парить моск КАК составить очередной запрос... и какие там джойны, подзапросы, сортировки и группировки или даже объединения используются - по барабану. 2. Чтобы к выборке/запросу автоматически добавлялись проверки по ключам доступа данного юзверя, блокировкам данных по например наличию некоторого события в системе или его отсутствия или до его истечения... например "данные не проверены модератором портала" 3. Чтобы при модификации данных автоматически добавлялась инфа об авторе сего действа и моменте модификации... куда-то и как-то (мне все равно) 4. Чтобы при модификации данных автоматически велась история для "исторических" данных. 5. Чтобы при наличии иерархии сущностей автоматически вставлялись в запрос джойны к структуре иерархий. 6. Чтобы система была "легко расширяема" в части добавления новых сущностей. Тут - достаточно отнаследовать новый клас для новой таблички и прописать одно сложное место: статический метод getSql(), который собственно и парсит набор допустимых для сущности параметров. Ваше предложение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 09:47 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, Да, ещё: полнота методов модификации данных, а именно возможность использования ВСЕХ форм оператора insert, в том числе и массивом данных одним запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 09:49 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 13:00 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, и? думаете не читал и не смотрел? наивняк. По сабжу, насколько понимаю ответов нет. Жаль. не по теме: покажите КАК в доктрине будет создан запрос по указанному набору условий... брошу всё и перейду на Доктрину ... или куда ещё. у меня это выглядит так, как в конце примера, последней строчкой... тока массивчик "заменить" на приведенный далее. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 14:54 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ты по русски скажи что те надо. пока только могу послать в доку http://doctrine-orm.readthedocs.org/en/2.0.x/reference/query-builder.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 16:56 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrowты по русски скажи что те надо. пока только могу послать в доку http://doctrine-orm.readthedocs.org/en/2.0.x/reference/query-builder.html Понятно. То есть вы - теоретик, и ни по вопросу ответить, ни по фреймворкам подсказать... Подскажите тогда, чем ЭТО(по ссылке на доку) отличается от ZF? "внезапно", УЖЕ сказано "чё надо", причем буквально парой постов выше 14378610 , все 7 пунктов (с последующим постом). Даже пример приведен "в чисто словах" (для тех кто понимает по-русски) ... и в виде массива набора условий (для программистов). Кстати, по теме. Вопрос, похоже закрыт. Разобрался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 19:21 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, если разобрался, расскажи пожалуйста в чём дело то было. Мало ли, на такое же кто-нить нарвётся. Что бы знать хотя бы чего остерегаться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 19:57 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ПрограмёрArhat109, если разобрался, расскажи пожалуйста в чём дело то было. Мало ли, на такое же кто-нить нарвётся. Что бы знать хотя бы чего остерегаться :) Сухошин ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 21:38 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Програмёр, Банальщина... сисадмин при "обновлении" сервака воткнул в него бажную версию PHP 5.2.6 ... заменили. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2013, 23:09 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
>> PHP: Вызов static метода из метода объекта. Баг или фича? Странный вопрос. А что статические методы запрещено вызывать из любого места кода? >>$className = get_class($this); >>$sql = call_user_func($className.'::getSql'... >>...бажную версию PHP 5.2.6 Каменный век PHP 5.4.15 (Current stable) Начиная с 5.3 можно (и нужно) static::getSQL... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 08:17 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
apapacy, пасибки. Это всё известно. Но пока крутится 5.2.17 (он и стоял... нафига админ переставлял - не знаю)... переход на последний stable release поставлен планы. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 08:22 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
apapacy, ещё. Там не просто стоит вызов статического метода из метода объекта... вы же заметили: вызов статического метода, того дочернего класса, чей объект обратился к методу объекта... который НЕ перекрывается в дочернем классе (он финальный, есть только в базовом классе - родителе).. не был уверен, что PHP способен на такой "выверт"... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 08:25 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, Обратите внимание на использование parent:: (not self::) Доступно с версии 5.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 10:02 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Sorry not parent:: - static:: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 13:09 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, 1. могу предположить что в пхп наследование статических методов лучше не стоит юзать. К примеру никогда не пытались написать: abstract static ? Сразу ошибку получите. 2. все что вы описаи есть как вам уже все посоветовали (ScareCrow==doctrine) лучше юзать готовые фреймворки и ормы.К примеру : Код: php 1. 2. 3. 4. 5. 6. 7. это чуть ли не копия relations у yii. автор2. Чтобы к выборке/запросу автоматически добавлялись проверки по ключам доступа данного юзверя, блокировкам данных по например наличию некоторого события в системе или его отсутствия или до его истечения... например "данные не проверены модератором портала" defaultScope вам поможет дополнительно фильтровать автор3. Чтобы при модификации данных автоматически добавлялась инфа об авторе сего действа и моменте модификации... куда-то и как-то (мне все равно) init() автор4. Чтобы при модификации данных автоматически велась история для "исторических" данных. behaviors (те же самые тригеры) автор5. Чтобы при наличии иерархии сущностей автоматически вставлялись в запрос джойны к структуре иерархий. with автор6. Чтобы система была "легко расширяема" в части добавления новых сущностей. Тут - достаточно отнаследовать новый клас для новой таблички и прописать одно сложное место: статический метод getSql(), который собственно и парсит набор допустимых для сущности параметров. эот не понял зы. как видите все это уже умеют современые фреймворки, зачем тратить время на написание ооного вручную? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 16:03 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Ренат, пасибки, в имеющихся фреймворках (по крайней мере тех, что смотрел и юзал) - задачи решаются или по отдельности или через ..опу. Собственно решение - как раз и есть результат опыта писания на фреймворках.. Сейчас, холиварить нет никакого желания и времени, поскольку сабж о другом. Я был наивен, ошибка осталась. Идей пока больше нет, требуется помощь. Итого: Стоит Squeeze, nginx, apache2, PHP 5.2.17, suhosin, eaxelerator, memcache и есть Zend. Судя по логам апача, ошибка появляется при вызове одного и того же метода, который получает в параметрах массив данных и массив настроек КАК его преобразовать (типа getModeSelector( array, array); ). Используется в 5 местах. 1. В одном вызове получает полноценный массив в первом параметре и преобразует его в цикле по набору условий из другого масива. Этот вызов в логах апача последнее время - не светится. 2. В 3-х случаях вместо первого параметра получает неустановленную переменную (null), опознает ситуацию - есть проверка if( !isset(..) ) и, в этом случае использует часть второго массива как набор для выборки из БД для получения списка, типа так: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Вот здесь $modeModel->getData() -- как раз обращение к единому базовому методу выборки данных... используется в куче мест (около 50 классов моделей отнаследовано). Лог ошибки heap overflow указывает только на этот вызов. Сервер валится с 502 ошибкой. 3. Причем сегодня обнаружил такой момент: вставляешь в файл просто пробел в комментариях к чему-либо: и какое-то время оно работает... может полчаса, может 5 минут... может несколько часов. После чего опять валится с тем же переполнением. Это-то КАКИМ БОКОМ может происходить?!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 19:06 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Код: php 1. жжошь! жгт еще! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 19:13 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
авторСтоит nginx, apache2, PHP 5.2.17 и ты таки зажёг! ты сделал мой скучный поденельник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 19:22 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, а по-подробней, чего не понравилось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 19:22 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, или только троллить есть настроение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 19:28 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
late static bindings тебе ничего не говорит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 19:30 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, В данном контексте - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 19:32 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, Может разжуёте КАК позднее статическое связывание может сказываться именно в этом коде? Оно ТУТ причём? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 19:36 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
поясню, почему тут нет никакого "позднего связывания": 1. Тут Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. приведен вызывающий код. Который никаких объектов не создает и НЕ содержит. Обынкавенная PHP функция с двмя параметрами, имеющими каки-то значения "по умолчанию". 2. В коде стоит проверка входного параметра на наличие, и вот если его нет (null) , то только тогда создается объект класса Model, через метод которой получаются данные для второй части функции. Всё. 3. Метод объекта ->getData() описан в самом начале, в примере. Он отсутствует у класса Model, но есть в родительском классе. Совершенно нормально должен вызываться как и любой наследуемый метод. 4. Метод ->getData() внутри себя, через get_class() обращается к статическому методу но уже дочернего класса Model... опять же не вижу проблем, поскольку объект класса уже создан и метод объекта, вполне способен вызвать дочерний статический метод... 5. Метод возвращает массив результата, который замещает собой пустой параметр... в PHP нельзя присваивать значение параметру локально внутри функции??? Поясните, плиз свою иронию... или перестаньте троллить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 20:12 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, больше помочь - некому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 20:16 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Так я думал проблема решена уже переустановкой ПЫХа. Как Вы и написали в предыдущих сообщениях. Мне этото вопрос понравился так как не так часто приходится наблюдать завал сервака пыховским скриптом. Но Вы уверены что ошибка локализована именно в той части кода которую Вы нам предоставили? Я так думаю что пора дать полный архив и тогда можно и поговорить по сабжу - где может идти утечка? Позднее связывание у Вас все равно не получится так как ПЫХ 5.2 а нужен 5.3. Непонятно почему необходимость устанавливать и даже переустанавливать именно 5.2, когда на дворе уже 5.4? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 20:46 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
apapacy, да, я тоже так думал. Однако ошибался. :( Дело в том, что сервак пашет "какое-то" время... при этом отдает всё как надо. Потом "внезапно" (и не знаю как локализовать момент), он в лог пишет ошибку "canary mismatch ... efree heap overflow... " , там указывается файл PHP который вызвал ошибку и строку. Вот там и нашел, что ссылка из всех мест идёт именно в эту функцию. Она вызывается, конкретно на этой строке. Всего есть 5 мест где она используется. В трех местах одинапково - и именно они и фигуряют в ошибках "кучи". Код самой функции, за исключением содержимого второй части (цикла foreach) - тут. Ещё сегодня обнаружил такую "странность" и никак не могу понять КАК такое возможно: после отвала сервера (уже выдает 502), если просто пересохранить файл с этой функцией - восстанавливает работоспособность... но опять же "на произвольное время"... ваще бред какой-то... КАК это может происходить? Стоит Zend Framework 1.7.8 (и вот покинуть его - возможности нет и ещё до меня наколбасили)... собственно классы догружаются через Zend Loader... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 21:00 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
насчет "позднего связывания" - его там и нет. Базовый метод вызывает статические методы (см. первый пост) через классическую функцию get_class и calc_user_func()... "всё в лоб". :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 21:03 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
собственно "мой фреймворк" - это попытка заменить работающий ZF. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 21:05 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
А Вы рабочий код написали то? Спустя 5 минут всматривания в код замечаешь вот такую вещь: Arhat109пример (как-то так): Код: 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. Насколько я помню, вызов несуществующего метода должен или обвалить скрипт, или просто вернуть null (если данная ошибка игнорируется). Я понимаю, что не гуру никак уж. Но походу тут же ошибка или в коде, или в описаниях пропущенных частей кода. По-этому надо хоть код классов показать полностью, что бы понятно было. Кстати, а как скрипт то запускается? по крону? в фоне висит и постоянно что-то делает? по запросу юзера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 21:25 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Програмёр, в первом посту - конечно "пример", писанный для показу идеи, да ещё и "на скорую руку", а не полностью рабочий код. В рабочем коде пока ещё гоняются Zend_Db_Select объекты и их методы, вместо класса Select примера.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 21:40 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
недочитал. Дополню: стандартно для ZF: index.php грузит кучу его классов, в т.ч. и автолоадер и диспетчер запросов, который разбирает урл и создает объект класса "контроллер", вызывая его метод обработки запроса и передавая ему парамтеры запроса... уплощенно. Вот эти самые методы обработки запросов (действия в терминах ZF) и вызывают эту функцию для подготовки данных к показу. Функция "всего лишь" формирует текстовку <option ..>..</option> для селекторов, в виде массива. Просто, она "умеет" формировать как простые селекторы, так и группированные, так и иерархически группированные с формированием текста опции из нескольких указанных полей выборки, соединяя их по заданному правилу. Когда основные данные уже выбраны - она получает их, а когда их ещё нет или они не нужны - запрашивает самостоятельно по расширенному набору правил (часть к ней приходит и "так" из действия контроллера - по ним, всё одно текстовки формировать, а стало быть из БД брать - надо). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 21:49 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Возникают такие мысли 1) Зачем статические методы если вызываются из экземпляря всегда. Заменить на методы экземпляра Вызов метода из строки решение явно нерациональное. Предполагаю что engine может пытаться закешировать их и переполняется. 2) Собственно query - не получается ли где-то супербольшой выборки. 3) Ну и реккурсия... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 22:16 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
авторопять же не вижу проблем, поскольку о бъект класса уже создан и метод объекта, вполне способен вызвать дочерний статический метод... чем дальше тем понедельник всё удачней и удачней. жги еще, пока он не кончился! Модератор: Скаря, пора бы объяснить уже поводы для веселья, растолковать "что не так" в высказываниях оппонентов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 23:13 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, Хм. Ответ на вопрос то я получил, но не тот который нужен был. Ладно, тогда первые возможные соображения: 1. Скрипт запускается пользователем - ответ приходит? Сайт грузится? Скорее всего попадаете в цикл/рекурсию, в котором выделяется огромное количество ресурсов. 2. Скрипт запускается по крону - скорее всего зацикливание или бесконечная рекурсия. То есть один процесс не завершается, а второй уже запускается. Спустя некоторое время не достаточно памяти. 3. Скрипт висит в фоне - любое нерациональное использование ресурсов. Из вышесказанного следует, что первым делом надо проверить все циклы и вызовы. Помню на yii получил бесконечную рекурсию, когда случайно вызвал одну функцию из другой, а в первой был вызов второй. Может и у Вас так же? З.Ы. есть вариант, что представленный код не приводит к данной ошибке (ведь он не проверен). И тогда обсуждения не дадут никакого результата. По сути пой пост - это пальцем в небо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 23:18 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, Кстати. По поводу фреймворка. Не знаю как в zend (думаю так же. Помню читал, что yii писали на основе zend), но в yii запрос, который Вы предложили несложно создаётся с помощью связей и критерий. Меня например он мало в чём ограничивает и чем дальше, тем больше убеждаюсь, что из-за недостаточного его познания мной. Так что, я бы всё же пересмотрел на Вашем месте вопрос об рациональности написания своего фреймворка. Хотя это уже вопрос насколько сильно хочется :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 23:32 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, зачем вызывать статический метод, если вы создаете сам объект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 05:50 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, как известно, "сила дурака - в молчании". Продолжайте, только НЕ мешайте решать проблему... , а то все подумают что Вы - знаете решение, а это не так. (посмотрев ваши прошлую трепню - в этом УЖЕ уверен) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 06:29 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Програмёр, ок. Вариант рабочего кода, сделанный из первого примера (согласен, поторопился с примером.) Код: 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. Это полный пример использования такого подхода. Достоинства и недостатки - тут обсуждать не намерен. Тут хочется понять проблему и её решить. В частности, обращаю внимание на этот факт (вопроизводится 100%): при любом изменении даты файла класса ModeModel.php -- апач начинает работать, произвольное время. Потом все одно - валится. Как это может происходить?!? P.S. очень большая просьба писать по делу: "не пишите мне какой фреймворк НАДО использовать, и я не пошлю вас туда, где он у меня УЖЕ лежит". :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 07:49 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, блин, все равно с параметрами в массивах накосячил... надо было в редакторе писать, а не тут править... :) смысел - понятен, надеюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 07:53 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, Дополню ещё по ситуации: 0. Рекурсий там нет. Есть примерно та вложенность, которая описана в примере... Есть и больше, но там "всё работает". 1. Скрипт запускается, отдает ответы, всё нормально... какое-то время. 2. Потом (непонятно когда) происходит выдача апачем ошибки "canary mismatch .. efree() heap overflow .." в которой указавается в том числе и строка действия контроллера, которая вызывает именно такую функцию. 3. Есть ещё более 50 классов, куча действий, работающих на этой же модели доступа к БД и гораздо сложнее: запросы по 70 строк по 80 символов - генерятся полностью через этот подход... однако работают нормально и устойчиво... и крайне шустро. 4. После того как выпала 502 ошибка, далее такие страницы (их много) все отдаются только с 502. 5. Достаточно перезаписать файл с этой функцией (ModeModel.php в примере, например добавить/убрать пробел в комментах)... апач начинает отдавать страницы верно... и даже БЕЗ перезагрузок (кеш?!? где?!?)... но опять произвольное время... ... цикл повторяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 08:06 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
авторМодератор: Скаря, пора бы объяснить уже поводы для веселья, растолковать "что не так" в высказываниях оппонентов. это бесполезно. он все равно не понимает. ссылку на нормальный ORM ему давали в самом начале. потом выяснилось что ORM то у него уже есть. код представляет собой какую то мешанину. я честно пытаюсь его понять уже второй день и у меня не выходит. потом выясняется что для вызова статических методов надо создавать экземпляр класса. человека в это тыкают два раза, он просто это не воспринимает. по сабжу топика. думаю если переделать вызов статических методов в вызов динамических половина падений пройдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 12:48 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, для тех, кто в танке, ещё раз: для вызова статических методов экземпляр класса создавать НЕ надо... собственно не удивительно. По теме: ещё утром внесли изменения. 6 часов - "полет нормальный". Если завтра не упадет, значит исправили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 13:01 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109ScareCrow, для тех, кто в танке, ещё раз: для вызова статических методов экземпляр класса создавать НЕ надо... собственно не удивительно. а как же: автор поскольку объект класса уже создан и метод объекта, вполне способен вызвать дочерний статический метод... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 13:03 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 14:27 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, полёт всё ещё нормальный, тему похоже можно закрывать (ах как хочется верить! :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 16:13 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Ну хоть бы написали шо исправили прежде чем тему закрывать-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 21:32 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
apapacy, а зачем? Если тут никто так и не понял, что и как делает этот код... и "потроллить" оказалось важнее чем помочь. Спросите "Скарю" - он же точно знает... :) По-поводу "велосипеда": то что делается - ближе всего к Yii "наоборот". Фреймворк с минимальной ООП схемой (только там, где никак), и соответственно для особо высоких нагрузок (без различной "универсальной дури для идиотов"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 07:19 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109а зачем? Если тут никто так и не понял, что и как делает этот код... мы то поняли, ждали когда дойдет до автора, но видно несудьба) хотя судя по сообщениям, автор кода, сам слабо понимает что там происходит. следует вопрос - зачем писать и использовать ООП и статику если в этом неразбираешься и там где это нах.. ненужно и можно сделать намного проще и без этого? а вместо того чтобы разобраться и точно решить проблему, они ("внесли изменения" - значит сам неосилил) и теперь остается "молится" )) чтоб скрипт опять не "упал"... очень профессиональный подход, молитесь дальше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 07:38 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
r u, Да, пасибки. Делайте "как надо", а у меня и так всё работает. Тему можно закрывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 10:22 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Ну ваще. Задали вапрос - Вам немного разобрали код Ваш - я например. Открыл Вам великое открытие за static:: А теперь илите все на бан? У меня все хорошо. Это мне напоминает недавно решил немного изучить Harbour (типа xBase). Проект не очень популяпен и прмеров мало. Пошарился по форумам и три мужика задают вопрос с примером говнокода на три экрана. И в каждую строчку внесли по умышленной ошибке. Блин ну ваще спрашивают вапрос а я еще должен был 10 минут исправлять их обфускацию кода типа Код: sql 1. 2. Нехорошо-с. Некрасиво-с. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 00:10 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
apapacy, Возможно. Но единственный кто тут пытался реально помочь - это "программер". То что вы писали, к делу не относилось (перечитайте и мои ответы тоже). А так, скажите спасибо Скаре. Больше, у меня нет никакого желания делится чем-то с таким сообществом. Программёр, пока ещё до проблем PHP такого уровня - ещё не вырос... незачем. Проблема протестирована и решена. По коду ещё раз: нет там никакого позднего связывания, впрочем как и "фатальных" ошибок. Так (или почти так) писать - вполне можно и даже на 5.2... как раз чёткое понимание того что писано и как (в отличии от "тут" и "как надо") позволяет свободно пользовать такие решения, в т.ч. и для ускорения и улучшения кода. Этот ещё (недо-)фреймворк (через Zend_Db_Adpater!) в профилировании показывает примерно в 10 раз большую скорость чем предыдущие решения на Zend или Yii с меньшим потреблением памяти... примерно раз 20. Как раз потому, что в нём применяется РАНЕЕ и по большей части статическое связывание, а не позднее и объектно-динамическое. ... так что, когда разберётесь - пишите. И, в другой раз, когда народ просит помощи (надеюсь не придется) - относитесь уважительнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 06:56 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109относитесь уважительнее. заметь, тебе задавали наводящие вопросы и пытались повернуть в правильном направлении, вежливо. но ты каждый раз твердил одно и тоже, что мы непонимаем свой код, что советуем совсем не то и вообще недоросли похоже до понимания такого сложного кода... ты сам себе противоречишь. пишешь о статическом связывании, в коде при этом у тебя фигурирует СОЗДАНИЕ объектов в методах которых идет обращение к статике... ЗАЧЕМ? -ты же сам тут пишешь что статика рулит - ну так и пиши вообще без ООП или хотябы без инстанцирования объектов, получишь еще большую производительность(исходя из твоих слов). -либо если уж создал объект, так и работай с ним как с объектом. статические методы тут каким боком? твою примитивную задачу можно решить и просто функциями, и статическим ООП и динамикой. что быстрее будет незнаю, зависит от реализации, но ты говоришь одно а делаешь другое. нелогично, как минимум. качество кода тоже под вопросом, хоть и не критично, но уровень автора показывает(лови критику): -класс Base у тебя нигде не создается, работа ведется только с его потомками, да и вообще по логике, его создание не имеет смысла - следовательно - делай его абстрактным! -не у всех методов указаны модификаторы доступа, getSql вызывается внутри getData, тогда должен быть protected - читаем твой комментарий к getData() - "получаем строку запроса тем способом, который определен в дочернем(!) классе": а решение то очень простое $this->getSql(); никакой статики тут ненужно. чистый полиморфизм. наследник имеет свою реализацию метода, и объект ИМЕННО этот метод и будет использовать. это как раз придумали чтобы не заниматься "ананизмом" - получать ИМЯ текущего объекта и вызывать его метод через жопустатику. да так тоже можно, но это не значит что так нужно в данном случае. -хочется высокой производительности? нах тогда тут ОРМ, хоть и простейший. в данном контексте он нифига не даст. странно в общем. проще тогда уж строчить запросы чистые. хоть экономия будет на сборке-парсинге-разборке запросов. - про бессмысленную и постоянную передачу в методы new Select, я уже писал. для того чтоб передать готовый и модифицировать его, но ты этим не пользуешься, везде передается new Select, т.е. пустой. а раз так, можно вообще убрать это из параметров. и рожать Select при необходимости в самом методе. и это всего в трех методах, трех классов. уверен что в остальном коде подобных вещей тоже хватает. вроде мелочи, а в итоге это накапливается и выливается в некорректную и непродуманную архитектуру, которая конечно ведет себя нестабильно. это(и многое другое) тебе и пытались сказать тут в топике. но ты отвергаешь все, твердя что твой код идеален, а то что он крешится - виноваты пятна на солнце и инопланетяне. удалось код подлатать - молодец, хотя почемуто скрываешь что именно было сделано.. может как раз то что советовали?)) вообще в "интернетах" принято так, решил проблему - отпишись как именно. комуто позже это поможет в аналогичной ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 08:04 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
r u, :) Как тут любит писать Скаря: "ты сделал мой четверг"... разберёшься - пиши ещё. Дабы не уподобляться цитируемому автору, отвечу по сабжу :) : 1. Класс Base - и так абстракный, мне нужно было показать пример... "чистота кода", писанного второпях и по памяти - повеселили. Там даже программер чистые ошибки нашел... :) 2. ...так и пиши... да вот "так и пишу"... "чукча не читатель", поскольку уже было сказано "Yii наоборот". В его рекламе как раз писано: все исключительно на ООП... даже специально для нечитателей дополнял: "ООП используется ТОЛЬКО там где без него никак"... повеселили. :) 3. конечно можно решить разными способами с разным результатом... тоже писал, что как и зачем решается. :) 4. решение то, которое приведено. Прямо указать квалификатор класса - нельзя, объект $this - непонятно какого класса... вызывать статику через -> ... можно конечно, но не нужно вводить интерпретатор и остальных читателей в ступор, когда есть нормальные и явные способы... а "нужно" именно так как написано... так и не поняли нифига. :) 5. не только "хочется" но и "можется", и даже "имеется". А ещё хочется не строчить прямые запросы.. и даже получается... (а вы продолжайте заниматься ананизмом с прямыми запросами и объектными ОРМ) :) 6. просветление про "бессмысленную передачу new Select", думаю наступит ох как нескоро... :) 7. Да, соглашусь... вроде всё мелочи, и даже Прогаммер в трех классах смог разобраться, хотя честно писал о себе (думаю просто скромно - нормальный программер похоже)... а выливается всё в полное непонимание примера и его неприятие (от непонимания видимо)... 8. Да. удалось разобраться и код подлатать и PHP вкупе с ним (отписал кому надо)... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 13:11 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Если не уважаете собеседника, то уважайте хотя бы русский язык. Например, всеми любимое слово ананизм пишется через О ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 13:20 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
phpz, орфография автора - сохранена. :) уважать можно тех, кто уважает других. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 13:22 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, писец. замкнутый круг. ему об одном он о другом. отписки из паралельной вселенной. особенно Arhat109объект $this - непонятно какого класса.далее даже говорить неочем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 13:51 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Arhat109, А ошибка хоть на каком уровне была? Неверный код. Настройки сервера (как изначально считалось)? Исправили участок из предоставленного кода или где-то в другом месте было не то? Интересно же всё-таки. Тем более, раз я до таких проблем не дорос ещё, так хоть объясните. :) Я же тут не просто сижу стараясь 5 копеек. Тоже ведь вырасти стараюсь профессионально (как и многие). P.S. Не по теме, но зря обижаетесь. Скарю игнорируем (странно что модераторы ещё не забанили, но это их личное дело), а остальные помочь хотят, каждый по своему. Мне ведь тоже слова "даже Програмёр" должны быть обидны, но форум - это не место для обид, а вот какраз для разумных советов и критики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 14:17 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
Програмёр, да собственно, ничего что могло бы сказаться на типовой работе. e-accelerator у PHP глючит на хороших нагрузках и таком коде. Отрубили, да разрабам отписался. В результате ещё и выиграли по памяти в 2 раза на thread apache, и по скорости процентов 10 тоже. Потеряли только на загрузке главной. Теперь вместо 91мсек, отдается за 182мсек. Происходит примерно следующее: в getData() идёт косвенный(!) вызов статического метода класса. А сам класс может и не нужен вовсе... объекты не создаются, методы не вызываются (Zend Auto Loader класс не грузит)... вот сильно похоже (и воспроизводилось), что e-accelerator при нехватке места вытесняет класс из кеша, а потом не знает куды ему обращаться... и лезет в пустоту с соответствующим результатом. В моем понимании как-то так. Отрубил нафиг - всё прошло и стало даже чуть быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 16:02 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
авторОтрубил нафиг - всё прошло и стало даже чуть быстрее. жжошь! Модератор: Скаря , хватит уже. Либо по делу пишите, либо воздержитесь от флуда. Либо бан на следующем подобного рода высказывании. Выбирайте. -- vkle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 16:06 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
ScareCrow, для начинающих, общие положения: кешатор хорош только И только тогда, когда кешируемая величина требуется более ОПРЕДЕЛЕННОГО количества раз. В противном случае - это только ДОПОЛНИТЕЛЬНЫЕ расходы. Особенно по занимаемому месту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 17:06 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
apapacyВозникают такие мысли 1) Зачем статические методы если вызываются из экземпляря всегда. Заменить на методы экземпляра Вызов метода из строки решение явно нерациональное. Предполагаю что engine может пытаться закешировать их и переполняется . 2) Собственно query - не получается ли где-то супербольшой выборки. 3) Ну и реккурсия... авторчто e-accelerator при нехватке места вытесняет класс из кеша , а потом не знает куды ему обращаться... и лезет в пустоту с соответствующим результатом. Ну и чем это отличается от решения Вашей проблемы. И за ststic:: Вы не знали То есть не я не помог Вым решить проблему, а Вы не смогли прочитать что я Вам написал. За акселератор Вы ничего не писали, но я преддполагал что-то в Этом роде. (Думал что-тотипа Зенд кэша работает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2013, 19:58 |
|
||
|
PHP: Вызов static метода из метода объекта. Баг или фича?
|
|||
|---|---|---|---|
|
#18+
apapacy, ну, положим что "чукча не читатель" не только к вам относится... не заметил тогда. :) ... на тот момент я тоже считал, что у нас Zend_Cache вовсю пашет (всего объема корпоративного кода - я не знаю до сих пор, его около 30Гб)... а оказалось его ещё ДО меня отрубили. Про акселератор - даже не думалось, думалось (по убыванию) на: косяк в коде (проблема вылезла сразу после сырого АПа), memcache, php, apache, nginx... тем более, что описание такого поведения - не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2013, 08:29 |
|
||
|
|

start [/forum/topic.php?all=1&fid=23&tid=1463734]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
32ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 357ms |

| 0 / 0 |
