powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вызов static метода из метода объекта. Баг или фича?
25 сообщений из 66, страница 1 из 3
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38281972
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.
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.
// Класс подготовки sql выражения и параметров к запросу:
class Select {
    protected $parts = array( 'from'=>array(), 'select'=>array(), 'where'=>array() /*, и другие запчасти выражения...*/ );
    protected $bindData = array();

    public function From($table, $alias)
    {
        $this->parts['from'][$alias] = $table;
    }
    public function Where($col, $data)
    {
        $this->parts['where'][$col] = '?';
        $this->bindData[$col] = $data;
    }
    // ... и другие методы сброки запчастей запроса и параметров к нему... не суть важно как.

    public function toString()
    {
        // формирует из массива строку запроса, тоже не вопрос.
    }
}

// вот предмет вопроса:
// класс определяющий статический, наследуемый метод для подготовки выражения запроса
// и метод объекта, который отдает данные вызывая статикой подготовку запроса
class Base
{
    protected $db = null;

    // собственно заглушка. Наверное можно сделать даже abstract, не пробовал.
    static public function getSql( Select $sql, array $params ) { return false; }

    // конструктор объекта, формирует подключение объекта к БД... спосбо не важен.
    function __construct( ) {
        $this->db = // ... здесь генерируется соединения с базой тем или иным способом
    }

    // метод объекта, отдает данные из БД, похоже в нём и проблема:
    public function getData(array $params) {
        $className = get_class($this);

        // получаем строку запроса тем способом, который определен в дочернем классе, подсовывая ему новый объект выражения:
        $sql = call_user_func($className.'::getSql', new Select, $params);

        // отдаем данные через объект подключения к БД дочернего объекта:
        return $this->db->query( $sql->toString(), $sql->bindData );
    }
}

// дочерний класс А - реализует свой способ доступа к данным (часть запроса):
class A extends Base {
    static function getSql( Select $sql, array $params)
    {
        $sql->From('table1', 'a');
        if( isset($params['col1']) ) { $sql->Where('col1', $params['col1']); }
        return $sql->toString();
    }
}

// дочерний класс В -- имеет в подчинении объекты класса А и вызывает явно его статический метод для "досборки запроса"
class B extends Base {
    static function getSql( Select $sql, array $params)
    {
        $sql->From(A::getSql(new Select, $params['A']), 'b');
        $sql->Where('col2', $params['col2']);
        return $sql->toString();
    }
}

$object = new B;

$rows = $object->getData(array('A'=> array('col1'=>1), 'col2' => 'test'));



Это кусок моего фреймворка для работы с объектами БД как сущностями и позволяющий "не заморачиваться" каким способом соединять таблицы зависимых сущностей БД промеж себя, дабы выбрать нужную конфигурацию данных. Пример сильно упрощен, дабы показать проблему.

А проблема в следующем: обнаруживается утечка памяти при таком способе работы с наследованием, а именно:

дочерние классы не имеют метода объекта выборки данных. Метод выборки - один и находится в базовом классе. Каждый дочерний класс переопределяет собственный статический метод формирования запроса (или его части), который окончательно собирается уже в базовом методе выборки данных: Base->getData().

Проблема в том, что "память медленно течёт". PHP 5.2.17.

Кто-нибудь сталкивался с таким или я делаю что-то запрещенное?
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282138
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор// собственно заглушка. Наверное можно сделать даже abstract, не пробовал.
static public function getSql( Select $sql, array $params ) { return false; }

не пишите своё. возьмите уже существующий фреймворк.
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282231
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

а по существу вопроса - ответов/советов не будет? Дело в том, что все проверки, воткнутые в код - отрабатывают "как надо". Апач работает в среднем часов 6 и потом валится по 502, сообщая "canary mismatch on efree() heap overflow ..." на вызове одного и того же метода, который достает данные из БД таким способом.
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282238
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

Какой "существующий" фреймворк посоветуете, для решения следующих задач:

1. Выборка данных из БД сложной архитектуры (сущности распределены в среднем по 10-12 подчиненным таблицам) в 3-4НФ + EAV + Иерархическое хранение сущностей, произвольной переменной вложенности.

То есть запрос к БД надо формировать динамически, желательно оптимального построения из простых массивов/наборов условий, типа:

"отдай мне все заявки по регионам таким-то, кроме города такого-то, которые прошли по фирмам имеющим в своем прайсе товары, у которых свойство "длина" не более 4м из товарных подразделов содержащих вид товара "доска", кроме такого раздела И которые (фирмы) отвечали на заявку не позднее 1 часа от момента отправки заявки."

Формулируется и собирается крайне просто, в виде сложного массива типа
Код: php
1.
2.
3.
4.
5.
6.
7.
array(
    'regionTable'  => array('with' => array(id1, id2, id3), withOr=>true, 'withOut'=>array(id4))
    , 'cityTable'   => array('withOut'=>id5)
    , 'pricesTable' => array('with'=>array('goods_paramsTable'=>array('name'=>'длина', 'condition'=>'<4')))
    , 'rubricTable' => array('anyierarchyName'=>array('good'=>'доска'), 'withOut'=>id6)
    , 'mailTable'   => array('where'=>array('sended_at' => '<NOW() INTERVAL -1 HOUR'))
);



, и чтобы мне было достаточно прописать некий базовый метод(ы) к той или иной сущности (региону, городу, мылам и т.д.) КАК она участвует в запросах ... и больше не парить моск КАК составить очередной запрос... и какие там джойны, подзапросы, сортировки и группировки или даже объединения используются - по барабану.

2. Чтобы к выборке/запросу автоматически добавлялись проверки по ключам доступа данного юзверя, блокировкам данных по например наличию некоторого события в системе или его отсутствия или до его истечения... например "данные не проверены модератором портала"

3. Чтобы при модификации данных автоматически добавлялась инфа об авторе сего действа и моменте модификации... куда-то и как-то (мне все равно)

4. Чтобы при модификации данных автоматически велась история для "исторических" данных.

5. Чтобы при наличии иерархии сущностей автоматически вставлялись в запрос джойны к структуре иерархий.

6. Чтобы система была "легко расширяема" в части добавления новых сущностей. Тут - достаточно отнаследовать новый клас для новой таблички и прописать одно сложное место: статический метод getSql(), который собственно и парсит набор допустимых для сущности параметров.

Ваше предложение?
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282240
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

Да, ещё: полнота методов модификации данных, а именно возможность использования ВСЕХ форм оператора insert, в том числе и массивом данных одним запросом.
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282310
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282388
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

и? думаете не читал и не смотрел? наивняк. По сабжу, насколько понимаю ответов нет. Жаль.

не по теме:

покажите КАК в доктрине будет создан запрос по указанному набору условий... брошу всё и перейду на Доктрину ... или куда ещё.

у меня это выглядит так, как в конце примера, последней строчкой... тока массивчик "заменить" на приведенный далее. :)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282441
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты по русски скажи что те надо.
пока только могу послать в доку
http://doctrine-orm.readthedocs.org/en/2.0.x/reference/query-builder.html
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282516
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowты по русски скажи что те надо.
пока только могу послать в доку
http://doctrine-orm.readthedocs.org/en/2.0.x/reference/query-builder.html

Понятно. То есть вы - теоретик, и ни по вопросу ответить, ни по фреймворкам подсказать...

Подскажите тогда, чем ЭТО(по ссылке на доку) отличается от ZF?

"внезапно", УЖЕ сказано "чё надо", причем буквально парой постов выше 14378610 , все 7 пунктов (с последующим постом).

Даже пример приведен "в чисто словах" (для тех кто понимает по-русски)
... и в виде массива набора условий (для программистов).

Кстати, по теме. Вопрос, похоже закрыт. Разобрался.
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282539
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

если разобрался, расскажи пожалуйста в чём дело то было. Мало ли, на такое же кто-нить нарвётся. Что бы знать хотя бы чего остерегаться :)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282610
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрArhat109,

если разобрался, расскажи пожалуйста в чём дело то было. Мало ли, на такое же кто-нить нарвётся. Что бы знать хотя бы чего остерегаться :)
Сухошин
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38282656
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр,

Банальщина... сисадмин при "обновлении" сервака воткнул в него бажную версию PHP 5.2.6 ... заменили. :)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38283138
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> 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...
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38283139
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apapacy,

пасибки. Это всё известно. Но пока крутится 5.2.17 (он и стоял... нафига админ переставлял - не знаю)... переход на последний stable release поставлен планы. :)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38283142
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apapacy,

ещё. Там не просто стоит вызов статического метода из метода объекта... вы же заметили: вызов статического метода, того дочернего класса, чей объект обратился к методу объекта... который НЕ перекрывается в дочернем классе (он финальный, есть только в базовом классе - родителе).. не был уверен, что PHP способен на такой "выверт"... :)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38283217
арарацу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,
Обратите внимание на использование parent:: (not self::)
Доступно с версии 5.3
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38283588
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry not parent:: - static::
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38283904
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

1. могу предположить что в пхп наследование статических методов лучше не стоит юзать. К примеру никогда не пытались написать: abstract static ? Сразу ошибку получите.

2. все что вы описаи есть как вам уже все посоветовали (ScareCrow==doctrine) лучше юзать готовые фреймворки и ормы.К примеру :
Код: php
1.
2.
3.
4.
5.
6.
7.
array(
    'regionTable'  => array('with' => array(id1, id2, id3), withOr=>true, 'withOut'=>array(id4))
    , 'cityTable'   => array('withOut'=>id5)
    , 'pricesTable' => array('with'=>array('goods_paramsTable'=>array('name'=>'длина', 'condition'=>'<4')))
    , 'rubricTable' => array('anyierarchyName'=>array('good'=>'доска'), 'withOut'=>id6)
    , 'mailTable'   => array('where'=>array('sended_at' => '<NOW() INTERVAL -1 HOUR'))
);


это чуть ли не копия relations у yii.

автор2. Чтобы к выборке/запросу автоматически добавлялись проверки по ключам доступа данного юзверя, блокировкам данных по например наличию некоторого события в системе или его отсутствия или до его истечения... например "данные не проверены модератором портала"
defaultScope вам поможет дополнительно фильтровать

автор3. Чтобы при модификации данных автоматически добавлялась инфа об авторе сего действа и моменте модификации... куда-то и как-то (мне все равно)
init()

автор4. Чтобы при модификации данных автоматически велась история для "исторических" данных.
behaviors (те же самые тригеры)

автор5. Чтобы при наличии иерархии сущностей автоматически вставлялись в запрос джойны к структуре иерархий.
with
автор6. Чтобы система была "легко расширяема" в части добавления новых сущностей. Тут - достаточно отнаследовать новый клас для новой таблички и прописать одно сложное место: статический метод getSql(), который собственно и парсит набор допустимых для сущности параметров.

эот не понял

зы. как видите все это уже умеют современые фреймворки, зачем тратить время на написание ооного вручную?
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284253
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ренат,

пасибки, в имеющихся фреймворках (по крайней мере тех, что смотрел и юзал) - задачи решаются или по отдельности или через ..опу. Собственно решение - как раз и есть результат опыта писания на фреймворках..

Сейчас, холиварить нет никакого желания и времени, поскольку сабж о другом.

Я был наивен, ошибка осталась. Идей пока больше нет, требуется помощь.

Итого:

Стоит 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.
function getModeSelector(array $list = null, array $params = array(... набор условий по умолчанию...) )
{
    if( !isset($list)) ) {
        $modeModel = new Model();
        $params['modelTable'] = array('cols'=>array(), 'where'=>'..', ..);
        $list = $modeModel->getData($params);
    }
    $result = array();
    foreach( $list as $num => $item) {
         $result[] = .. преобразование по набору условий из второго параметра $params;
    }
    return $result;
}



Вот здесь $modeModel->getData() -- как раз обращение к единому базовому методу выборки данных... используется в куче мест (около 50 классов моделей отнаследовано). Лог ошибки heap overflow указывает только на этот вызов. Сервер валится с 502 ошибкой.

3. Причем сегодня обнаружил такой момент: вставляешь в файл просто пробел в комментариях к чему-либо: и какое-то время оно работает... может полчаса, может 5 минут... может несколько часов. После чего опять валится с тем же переполнением.

Это-то КАКИМ БОКОМ может происходить?!?
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284265
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
array $list = null


жжошь! жгт еще!
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284274
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСтоит nginx, apache2, PHP 5.2.17
и ты таки зажёг! ты сделал мой скучный поденельник.
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284276
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow, а по-подробней, чего не понравилось?
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284286
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

или только троллить есть настроение?
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284289
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
late static bindings тебе ничего не говорит?
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284291
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

В данном контексте - нет.
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 1 из 3
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вызов static метода из метода объекта. Баг или фича?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]