Profile

coolwolf0: (Default)
coolwolf0

March 2026

S M T W T F S
12 34567
8 91011121314
151617 181920 21
22232425262728
293031    

Custom Text

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

Времена поменялись, появились нормальные компилируемые процедурные языки, объектно-ориентированные прибамбасы, редакторы с подсветкой синтаксиса, интерактивные дебаггеры, скриптовые языки...

И чем же занимается ВПС в 2020-м годе от рождества Христова? Решаем проблемы передачи параметров в функцию. Только за окном другие времена, а на экране - сраный PHP (я уже подбирал разные эпитеты к этому недо-языку). Итак, задачка состояла в том, чтобы передать в функцию пары "название параметра" + "значение параметра". Проблема оказалась в том, что получив указатель на параметр, этот недо-язык не спешит извлечь его, а тупо хранит у себя внутри. И если не приведи боже это была переменная цикла, то он радостно скопирует N раз указатель на неё же, самодовольно лыбясь обезумевшему программисту в лицо: "ну вот, что передали, то и получили".

Фрагмент кода для неслабонервных.


$bind_vars = array( "host" => $host, "ip" => $ip, "mac" => $mac );
foreach ( $bind_vars as $name => $value ) {
  oci_bind_by_name($stid, ":$name", $value);
}


Всё, хлопчики, каждый вызов oci_bind_by_name приводит к передаче всё той же переменной цикла $value по адресу.
Исправить путём создания closure эту ситуацию нельзя - $value может быть разного типа: целое, строка, дата...
Приходится ... строить стек передачи параметров! Да, вы не ослышались, я создаю массив и набиваю его в цикле фактическими параметрами. И передаю этому грёбаному PHP указатель на верхушку стека!

$bind_vars = array( "host" => $host, "ip" => $ip, "mac" => $mac );
$bind_values = array();
foreach ( $bind_vars as $name => $value ) {
  $bind_values []= $bind_vars[$name];
  $index = sizeof($bind_values)-1;
  oci_bind_by_name($stid, ":$name", $bind_values[$index]);
}


Читатели могут предложить свои варианты, но не думаю, что в этой консерватории можно что-то подправить.
И не говорите мне, что в Перле меня ждёт аналогичная засада. Не разрушайте иллюзий...
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Expand Cut Tags

No cut tags

Style Credit