powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вызов static метода из метода объекта. Баг или фича?
66 сообщений из 66, показаны все 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
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284298
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

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

1. Тут
Код: 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;
}



приведен вызывающий код. Который никаких объектов не создает и НЕ содержит. Обынкавенная PHP функция с двмя параметрами, имеющими каки-то значения "по умолчанию".

2. В коде стоит проверка входного параметра на наличие, и вот если его нет (null) , то только тогда создается объект класса Model, через метод которой получаются данные для второй части функции. Всё.

3. Метод объекта ->getData() описан в самом начале, в примере. Он отсутствует у класса Model, но есть в родительском классе. Совершенно нормально должен вызываться как и любой наследуемый метод.

4. Метод ->getData() внутри себя, через get_class() обращается к статическому методу но уже дочернего класса Model... опять же не вижу проблем, поскольку объект класса уже создан и метод объекта, вполне способен вызвать дочерний статический метод...

5. Метод возвращает массив результата, который замещает собой пустой параметр... в PHP нельзя присваивать значение параметру локально внутри функции???

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

больше помочь - некому?
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284360
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я думал проблема решена уже переустановкой ПЫХа. Как Вы и написали в предыдущих сообщениях.
Мне этото вопрос понравился так как не так часто приходится наблюдать завал сервака пыховским скриптом.
Но Вы уверены что ошибка локализована именно в той части кода которую Вы нам предоставили?
Я так думаю что пора дать полный архив и тогда можно и поговорить по сабжу - где может идти утечка?

Позднее связывание у Вас все равно не получится так как ПЫХ 5.2 а нужен 5.3. Непонятно почему необходимость устанавливать и даже переустанавливать именно 5.2, когда на дворе уже 5.4?
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284371
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apapacy, да, я тоже так думал. Однако ошибался. :(

Дело в том, что сервак пашет "какое-то" время... при этом отдает всё как надо. Потом "внезапно" (и не знаю как локализовать момент), он в лог пишет ошибку "canary mismatch ... efree heap overflow... " , там указывается файл PHP который вызвал ошибку и строку.

Вот там и нашел, что ссылка из всех мест идёт именно в эту функцию. Она вызывается, конкретно на этой строке. Всего есть 5 мест где она используется. В трех местах одинапково - и именно они и фигуряют в ошибках "кучи". Код самой функции, за исключением содержимого второй части (цикла foreach) - тут.

Ещё сегодня обнаружил такую "странность" и никак не могу понять КАК такое возможно: после отвала сервера (уже выдает 502), если просто пересохранить файл с этой функцией - восстанавливает работоспособность... но опять же "на произвольное время"... ваще бред какой-то... КАК это может происходить? Стоит Zend Framework 1.7.8 (и вот покинуть его - возможности нет и ещё до меня наколбасили)... собственно классы догружаются через Zend Loader...
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284373
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насчет "позднего связывания" - его там и нет. Базовый метод вызывает статические методы (см. первый пост) через классическую функцию get_class и calc_user_func()... "всё в лоб". :)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284376
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собственно "мой фреймворк" - это попытка заменить работающий ZF.
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284387
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Вы рабочий код написали то? Спустя 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.
// Класс подготовки sql выражения и параметров к запросу:
class Select {

    ...

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

class Base
{
...
    static public function getSql( Select $sql, array $params ) { return false; }

    ...

    public function getData(array $params) {
        $className = get_class($this);

        $sql = call_user_func($className.'::getSql', new Select, $params); //Как написано далее, тут на выходе строка или false

        return $this->db->query($sql->toString(), $sql->bindData ); // А тут вызываем метод toString у строки или у boolean
        // (по сути тут код должен завалиться). Почему не падает? там точно так написано?
    }
}

class A extends Base {
    static function getSql( Select $sql, array $params)
    {
        ...
        return $sql->toString();  //ОБРАЩАЕМ ВНИМАНИЕ <<< ТУТ МЫ ПОЛУЧАЕМ СТРОКУ
    }
}

class B extends Base {
    static function getSql( Select $sql, array $params)
    {
        ...
        return $sql->toString();  //И ТУТ ТОЖЕ ПОЛУЧАЕМ СТРОКУ
    }
}





Насколько я помню, вызов несуществующего метода должен или обвалить скрипт, или просто вернуть null (если данная ошибка игнорируется).

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

в первом посту - конечно "пример", писанный для показу идеи, да ещё и "на скорую руку", а не полностью рабочий код.

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

стандартно для ZF: index.php грузит кучу его классов, в т.ч. и автолоадер и диспетчер запросов, который разбирает урл и создает объект класса "контроллер", вызывая его метод обработки запроса и передавая ему парамтеры запроса... уплощенно.

Вот эти самые методы обработки запросов (действия в терминах ZF) и вызывают эту функцию для подготовки данных к показу. Функция "всего лишь" формирует текстовку <option ..>..</option> для селекторов, в виде массива. Просто, она "умеет" формировать как простые селекторы, так и группированные, так и иерархически группированные с формированием текста опции из нескольких указанных полей выборки, соединяя их по заданному правилу.

Когда основные данные уже выбраны - она получает их, а когда их ещё нет или они не нужны - запрашивает самостоятельно по расширенному набору правил (часть к ней приходит и "так" из действия контроллера - по ним, всё одно текстовки формировать, а стало быть из БД брать - надо).
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284401
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникают такие мысли
1) Зачем статические методы если вызываются из экземпляря всегда. Заменить на методы экземпляра
Вызов метода из строки решение явно нерациональное. Предполагаю что engine может пытаться закешировать их и переполняется.
2) Собственно query - не получается ли где-то супербольшой выборки.
3) Ну и реккурсия...
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284434
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторопять же не вижу проблем, поскольку о бъект класса уже создан и метод объекта, вполне способен вызвать дочерний статический метод...
чем дальше тем понедельник всё удачней и удачней. жги еще, пока он не кончился!

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

Хм. Ответ на вопрос то я получил, но не тот который нужен был. Ладно, тогда первые возможные соображения:
1. Скрипт запускается пользователем - ответ приходит? Сайт грузится? Скорее всего попадаете в цикл/рекурсию, в котором выделяется огромное количество ресурсов.
2. Скрипт запускается по крону - скорее всего зацикливание или бесконечная рекурсия. То есть один процесс не завершается, а второй уже запускается. Спустя некоторое время не достаточно памяти.
3. Скрипт висит в фоне - любое нерациональное использование ресурсов.

Из вышесказанного следует, что первым делом надо проверить все циклы и вызовы. Помню на yii получил бесконечную рекурсию, когда случайно вызвал одну функцию из другой, а в первой был вызов второй. Может и у Вас так же?

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

Кстати. По поводу фреймворка. Не знаю как в zend (думаю так же. Помню читал, что yii писали на основе zend), но в yii запрос, который Вы предложили несложно создаётся с помощью связей и критерий. Меня например он мало в чём ограничивает и чем дальше, тем больше убеждаюсь, что из-за недостаточного его познания мной.

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

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

как известно, "сила дурака - в молчании". Продолжайте, только НЕ мешайте решать проблему... , а то все подумают что Вы - знаете решение, а это не так. (посмотрев ваши прошлую трепню - в этом УЖЕ уверен)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284612
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.
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.
// Класс подготовки 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);

        // получаем строку запроса тем способом, который определен в дочернем(!) классе, подсовывая ему новый объект выражения:
        // в PHP 5.3 можно вызывать напрямую через переменную - квалификатор класса. У меня 5.2.17 - приходится так:
        $funcName = $className . '::getSql';
        $sql = call_user_func($funcName, new Select, $params);

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

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

// дочерний класс В -- имеет в подчинении объекты класса А и вызывает явно его статический метод для "досборки запроса"
// это и есть причина, почему метод сборки запроса - статический: он может вызываться напрямую у тех классов
// , которые "знают" что есть зависимые от них сущности... или от которых они зависят (reference map в ZF или где ещё)
// Поскольку не создается куча зависимых объектов "прочих классов", такой подход - значительно экононмнее и шустрее:
class B extends Base {
    static function getSql( Select $sql, array $params)
    {
        $subSelect = ( A::getSql(new Select, $params['A']) )->toString();
        $sql->From($subSelect, 'b');
        $sql->Where('col2', $params['B']['col2']);
        return $sql;
    }
}

// включил в общее описание примере и вызов КАк оно используется там, где валится:
class ModeModel {
    public static function getModeSelector(array $list = null, array $params = array(... набор условий по умолчанию...) )
    {
        if( !isset($list)) ) {
            $modeModel = new B();
            $params['B'] = array('col1'=>'this_const_string', 'limit'=>array('count'=>50, 'offset'=>0)); // $params['col2'] - как приходит, так и передается дальше.
            $list = $modeModel->getData($params);
        }
        $result = array();
        foreach( $list as $num => $item) {
             $result[] = .. преобразование по набору условий из второго параметра $params;
        }
        return $result;
    }
}

// Действие контроллера ZF, которое вызывает эту функцию
// (создается объект класса и вызывается его метод в диспетчере запросов ZF)
//, который сам вызывается из index.php, на который перенаправлены все урлы в .htaccess
//
class SomeController extends Zend_Controller_Action {

    // @params $_GET['id'], .. and other params from user request...
    public function someAction() {
       // ... валидация пришедших параметров урла запроса
       // ...
       $this->view->modeOptions = ModeModel::getModeSelector(
            array( 'A' => array(
                'col2' => (int)$_GET['id']
            ))
        );
    }
}



Это полный пример использования такого подхода. Достоинства и недостатки - тут обсуждать не намерен. Тут хочется понять проблему и её решить.

В частности, обращаю внимание на этот факт (вопроизводится 100%):

при любом изменении даты файла класса ModeModel.php -- апач начинает работать, произвольное время. Потом все одно - валится.

Как это может происходить?!?

P.S. очень большая просьба писать по делу: "не пишите мне какой фреймворк НАДО использовать, и я не пошлю вас туда, где он у меня УЖЕ лежит". :)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38284615
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

блин, все равно с параметрами в массивах накосячил... надо было в редакторе писать, а не тут править... :)

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

Дополню ещё по ситуации:
0. Рекурсий там нет. Есть примерно та вложенность, которая описана в примере... Есть и больше, но там "всё работает".

1. Скрипт запускается, отдает ответы, всё нормально... какое-то время.

2. Потом (непонятно когда) происходит выдача апачем ошибки "canary mismatch .. efree() heap overflow .." в которой указавается в том числе и строка действия контроллера, которая вызывает именно такую функцию.

3. Есть ещё более 50 классов, куча действий, работающих на этой же модели доступа к БД и гораздо сложнее: запросы по 70 строк по 80 символов - генерятся полностью через этот подход... однако работают нормально и устойчиво... и крайне шустро.

4. После того как выпала 502 ошибка, далее такие страницы (их много) все отдаются только с 502.

5. Достаточно перезаписать файл с этой функцией (ModeModel.php в примере, например добавить/убрать пробел в комментах)... апач начинает отдавать страницы верно... и даже БЕЗ перезагрузок (кеш?!? где?!?)... но опять произвольное время...

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

это бесполезно. он все равно не понимает. ссылку на нормальный ORM ему давали в самом начале. потом выяснилось что ORM то у него уже есть.

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

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

для тех, кто в танке, ещё раз: для вызова статических методов экземпляр класса создавать НЕ надо... собственно не удивительно.

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

для тех, кто в танке, ещё раз: для вызова статических методов экземпляр класса создавать НЕ надо... собственно не удивительно.


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

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

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

а зачем? Если тут никто так и не понял, что и как делает этот код... и "потроллить" оказалось важнее чем помочь. Спросите "Скарю" - он же точно знает... :)

По-поводу "велосипеда": то что делается - ближе всего к Yii "наоборот". Фреймворк с минимальной ООП схемой (только там, где никак), и соответственно для особо высоких нагрузок (без различной "универсальной дури для идиотов").
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38286140
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109а зачем? Если тут никто так и не понял, что и как делает этот код...
мы то поняли, ждали когда дойдет до автора, но видно несудьба)

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

Да, пасибки. Делайте "как надо", а у меня и так всё работает. Тему можно закрывать.
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38287633
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ваще. Задали вапрос - Вам немного разобрали код Ваш - я например. Открыл Вам великое открытие за static::
А теперь илите все на бан? У меня все хорошо.
Это мне напоминает недавно решил немного изучить Harbour (типа xBase). Проект не очень популяпен и прмеров мало. Пошарился по форумам и три мужика задают вопрос с примером говнокода на три экрана. И в каждую строчку внесли по умышленной ошибке.
Блин ну ваще спрашивают вапрос а я еще должен был 10 минут исправлять их обфускацию кода типа
Код: sql
1.
2.
if a b == 
endi



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

Возможно. Но единственный кто тут пытался реально помочь - это "программер". То что вы писали, к делу не относилось (перечитайте и мои ответы тоже). А так, скажите спасибо Скаре.
Больше, у меня нет никакого желания делится чем-то с таким сообществом. Программёр, пока ещё до проблем PHP такого уровня - ещё не вырос... незачем.

Проблема протестирована и решена. По коду ещё раз: нет там никакого позднего связывания, впрочем как и "фатальных" ошибок. Так (или почти так) писать - вполне можно и даже на 5.2... как раз чёткое понимание того что писано и как (в отличии от "тут" и "как надо") позволяет свободно пользовать такие решения, в т.ч. и для ускорения и улучшения кода.

Этот ещё (недо-)фреймворк (через Zend_Db_Adpater!) в профилировании показывает примерно в 10 раз большую скорость чем предыдущие решения на Zend или Yii с меньшим потреблением памяти... примерно раз 20. Как раз потому, что в нём применяется РАНЕЕ и по большей части статическое связывание, а не позднее и объектно-динамическое.

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

ты сам себе противоречишь. пишешь о статическом связывании, в коде при этом у тебя фигурирует СОЗДАНИЕ объектов в методах которых идет обращение к статике... ЗАЧЕМ?

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

-либо если уж создал объект, так и работай с ним как с объектом. статические методы тут каким боком?

твою примитивную задачу можно решить и просто функциями, и статическим ООП и динамикой. что быстрее будет незнаю, зависит от реализации, но ты говоришь одно а делаешь другое. нелогично, как минимум.

качество кода тоже под вопросом, хоть и не критично, но уровень автора показывает(лови критику):

-класс Base у тебя нигде не создается, работа ведется только с его потомками, да и вообще по логике, его создание не имеет смысла - следовательно - делай его абстрактным!

-не у всех методов указаны модификаторы доступа, getSql вызывается внутри getData, тогда должен быть protected

- читаем твой комментарий к getData() - "получаем строку запроса тем способом, который определен в дочернем(!) классе":
а решение то очень простое $this->getSql(); никакой статики тут ненужно. чистый полиморфизм. наследник имеет свою реализацию метода, и объект ИМЕННО этот метод и будет использовать. это как раз придумали чтобы не заниматься "ананизмом" - получать ИМЯ текущего объекта и вызывать его метод через жопустатику. да так тоже можно, но это не значит что так нужно в данном случае.

-хочется высокой производительности? нах тогда тут ОРМ, хоть и простейший. в данном контексте он нифига не даст. странно в общем. проще тогда уж строчить запросы чистые. хоть экономия будет на сборке-парсинге-разборке запросов.

- про бессмысленную и постоянную передачу в методы new Select, я уже писал. для того чтоб передать готовый и модифицировать его, но ты этим не пользуешься, везде передается new Select, т.е. пустой. а раз так, можно вообще убрать это из параметров. и рожать Select при необходимости в самом методе.

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

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

:) Как тут любит писать Скаря: "ты сделал мой четверг"... разберёшься - пиши ещё.

Дабы не уподобляться цитируемому автору, отвечу по сабжу :) :

1. Класс Base - и так абстракный, мне нужно было показать пример... "чистота кода", писанного второпях и по памяти - повеселили. Там даже программер чистые ошибки нашел... :)

2. ...так и пиши... да вот "так и пишу"... "чукча не читатель", поскольку уже было сказано "Yii наоборот". В его рекламе как раз писано: все исключительно на ООП... даже специально для нечитателей дополнял: "ООП используется ТОЛЬКО там где без него никак"... повеселили. :)

3. конечно можно решить разными способами с разным результатом... тоже писал, что как и зачем решается. :)

4. решение то, которое приведено. Прямо указать квалификатор класса - нельзя, объект $this - непонятно какого класса... вызывать статику через -> ... можно конечно, но не нужно вводить интерпретатор и остальных читателей в ступор, когда есть нормальные и явные способы... а "нужно" именно так как написано... так и не поняли нифига. :)

5. не только "хочется" но и "можется", и даже "имеется". А ещё хочется не строчить прямые запросы.. и даже получается... (а вы продолжайте заниматься ананизмом с прямыми запросами и объектными ОРМ) :)

6. просветление про "бессмысленную передачу new Select", думаю наступит ох как нескоро... :)

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

8. Да. удалось разобраться и код подлатать и PHP вкупе с ним (отписал кому надо)... :)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38288238
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не уважаете собеседника, то уважайте хотя бы русский язык. Например, всеми любимое слово ананизм пишется через О
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38288248
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
phpz,

орфография автора - сохранена. :)

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

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

А ошибка хоть на каком уровне была? Неверный код. Настройки сервера (как изначально считалось)? Исправили участок из предоставленного кода или где-то в другом месте было не то?

Интересно же всё-таки. Тем более, раз я до таких проблем не дорос ещё, так хоть объясните. :) Я же тут не просто сижу стараясь 5 копеек. Тоже ведь вырасти стараюсь профессионально (как и многие).

P.S. Не по теме, но зря обижаетесь. Скарю игнорируем (странно что модераторы ещё не забанили, но это их личное дело), а остальные помочь хотят, каждый по своему. Мне ведь тоже слова "даже Програмёр" должны быть обидны, но форум - это не место для обид, а вот какраз для разумных советов и критики.
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38288616
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр, да собственно, ничего что могло бы сказаться на типовой работе. e-accelerator у PHP глючит на хороших нагрузках и таком коде. Отрубили, да разрабам отписался. В результате ещё и выиграли по памяти в 2 раза на thread apache, и по скорости процентов 10 тоже. Потеряли только на загрузке главной. Теперь вместо 91мсек, отдается за 182мсек.

Происходит примерно следующее: в getData() идёт косвенный(!) вызов статического метода класса. А сам класс может и не нужен вовсе... объекты не создаются, методы не вызываются (Zend Auto Loader класс не грузит)... вот сильно похоже (и воспроизводилось), что e-accelerator при нехватке места вытесняет класс из кеша, а потом не знает куды ему обращаться... и лезет в пустоту с соответствующим результатом.

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

для начинающих, общие положения: кешатор хорош только И только тогда, когда кешируемая величина требуется более ОПРЕДЕЛЕННОГО количества раз. В противном случае - это только ДОПОЛНИТЕЛЬНЫЕ расходы. Особенно по занимаемому месту.
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38289004
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apapacyВозникают такие мысли
1) Зачем статические методы если вызываются из экземпляря всегда. Заменить на методы экземпляра
Вызов метода из строки решение явно нерациональное. Предполагаю что engine может пытаться закешировать их и переполняется .
2) Собственно query - не получается ли где-то супербольшой выборки.
3) Ну и реккурсия...

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


Ну и чем это отличается от решения Вашей проблемы.
И за ststic:: Вы не знали
То есть не я не помог Вым решить проблему, а Вы не смогли прочитать что я Вам написал.
За акселератор Вы ничего не писали, но я преддполагал что-то в Этом роде. (Думал что-тотипа Зенд кэша работает)
...
Рейтинг: 0 / 0
PHP: Вызов static метода из метода объекта. Баг или фича?
    #38289426
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apapacy,

ну, положим что "чукча не читатель" не только к вам относится... не заметил тогда. :)

... на тот момент я тоже считал, что у нас Zend_Cache вовсю пашет (всего объема корпоративного кода - я не знаю до сих пор, его около 30Гб)... а оказалось его ещё ДО меня отрубили. Про акселератор - даже не думалось, думалось (по убыванию) на: косяк в коде (проблема вылезла сразу после сырого АПа), memcache, php, apache, nginx... тем более, что описание такого поведения - не нашел.
...
Рейтинг: 0 / 0
66 сообщений из 66, показаны все 3 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вызов static метода из метода объекта. Баг или фича?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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