Доброго времени. У меня вопрос собственно по PHP скорее, который намедни я взялся подтянуть. Вроде бы разобрал документацию, основные вопросы, по крайней мере, однако в коде drupal 7 (см. ниже) наткнулся на непонятный для меня элемент.
Сложности с пониманием возникли вот с этим куском кода из файла includes\actions.inc (привожу всю функцию)
<?phpfunction actions_save($function, $type, $params, $label, $aid = NULL) {
// aid is the callback for singleton actions so we need to keep a separate
// table for numeric aids.
if (!$aid) {
$aid = db_next_id();
}
db_merge('actions')
->key(array('aid' => $aid))
->fields(array(
'callback' => $function,
'type' => $type,
'parameters' => serialize($params),
'label' => $label,
))
->execute();
watchdog('actions', 'Action %action saved.', array('%action' => $label));
return $aid;
}?>
А конкретнее меня интересуют db_merge. Уж не знаю, как его назвать: по всем признаком это метод какого-то объекта. Но как я понимаю, при использовании метода нужно плясать от имени объекта или класса (в случае static). То есть вся конструкция должна начинаться с имени объекта: $name_obj->db_merge('actions')
->key(array('aid' => $aid))
-> ...
В общем для меня настал момент, когда я понял что ничего нихрена не понял(( В дебри API не нужно меня погружать – вопрос о PHP. Подскажите пожалуйста, что есть db_merge как это работает или в какую сторону копать?
Комментарии
db_merge, да - это метод Друпаловской абстракции над PDO. Он позволяет сравнить есть ли значение, и если есть - обновить его, а если нет - добавит.
Вот тут неплохо поясняют.
Полный список доступных методов: https://api.drupal.org/api/drupal/includes%21database%21database.inc/7.x
Да уже читал это. В общем-то я понимаю как это работает в drupal, но меня интересует как это работает в php. Спасибо за наводку, попробую еще перечитать руководство по PDO, пропустил как-раз.
https://api.drupal.org/api/drupal/includes!database!database.inc/functio...
"function db_merge" "Returns a new MergeQuery object for the active database."
По документации - это функция, которая возвращает объект. Ну а далее уже по цепочке вызываются методы класса MergeQuery для возвращенного функцией объекта.
На редактирование комментария даётся определенное время
Ну да функция, только странно она как-то вызывается
Этот код можно переписать по-другому, так должно быть понятнее
<?php
$merge_query = db_merge('actions');
$merge_query->key(array('aid' => $aid));
$merge_query->fields(array(
'callback' => $function,
'type' => $type,
'parameters' => serialize($params),
'label' => $label,
));
$merge_query->execute();
?>
С этим всё ясно, но всё равно спасибо - навели на нужную мысль. Разобрался, просто раньше не знал что к функции возвращающей объект можно применять объектный оператор ->, чтобы запустить метод объекта. Яля вот так f_return_obj()->getText();
Я решил обернуть класс упомянутый в комментарии в ссылку на документацию через пару минут после публикации - теперь только создавать новый коммент? Issue увидел, но зачем так резко и быстро убирать возможность отредактировать комментарий?
@mbaev, напомни сколько ты ставил времени на редактирование постов и коментов?
Тут есть.
Проглядел, извини
Ничего страшного.
Функция возвращает объект, а далее по цепочке вызываются методы этого объекта.