Profile

coolwolf0: (Default)
coolwolf0

July 2025

S M T W T F S
  123 45
6789101112
13141516171819
20212223242526
2728293031  

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