Непонятная конструкция php

Главные вкладки

Аватар пользователя Глот с планеты Катрук Глот с планеты ... 25 января 2018 в 19:53

Доброго времени. У меня вопрос собственно по 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 как это работает или в какую сторону копать?

Комментарии

Аватар пользователя bumble bumble 25 января 2018 в 20:27
1

db_merge, да - это метод Друпаловской абстракции над PDO. Он позволяет сравнить есть ли значение, и если есть - обновить его, а если нет - добавит.

Вот тут неплохо поясняют.

Полный список доступных методов: https://api.drupal.org/api/drupal/includes%21database%21database.inc/7.x

Аватар пользователя Глот с планеты Катрук Глот с планеты ... 25 января 2018 в 23:01

Да уже читал это. В общем-то я понимаю как это работает в drupal, но меня интересует как это работает в php. Спасибо за наводку, попробую еще перечитать руководство по PDO, пропустил как-раз.

Аватар пользователя negociant negociant 25 января 2018 в 20:42
1

Глот с планеты Катрук wrote:

А конкретнее меня интересуют db_merge. Уж не знаю, как его назвать: по всем признаком это метод какого-то объекта.

https://api.drupal.org/api/drupal/includes!database!database.inc/functio...
"function db_merge" "Returns a new MergeQuery object for the active database."
По документации - это функция, которая возвращает объект. Ну а далее уже по цепочке вызываются методы класса MergeQuery для возвращенного функцией объекта.

Аватар пользователя negociant negociant 26 января 2018 в 0:43

Этот код можно переписать по-другому, так должно быть понятнее

<?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();
?>
Аватар пользователя Глот с планеты Катрук Глот с планеты ... 26 января 2018 в 15:23

С этим всё ясно, но всё равно спасибо - навели на нужную мысль. Разобрался, просто раньше не знал что к функции возвращающей объект можно применять объектный оператор ->, чтобы запустить метод объекта. Яля вот так f_return_obj()->getText();

Аватар пользователя negociant negociant 25 января 2018 в 21:15

itcrowd72 wrote:

На редактирование комментария даётся определенное время


Я решил обернуть класс упомянутый в комментарии в ссылку на документацию через пару минут после публикации - теперь только создавать новый коммент? Issue увидел, но зачем так резко и быстро убирать возможность отредактировать комментарий?