Да, я учил программирование ещё в те самые времена, когда программу можно было подержать в руках (перфокарты, ленты, вот это всё). В те далёкие времена процесс передачи параметров в функцию был весьма хитровыпендренным, особенно в языках низкого уровня.
Времена поменялись, появились нормальные компилируемые процедурные языки, объектно-ориентированные прибамбасы, редакторы с подсветкой синтаксиса, интерактивные дебаггеры, скриптовые языки...
И чем же занимается ВПС в 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]); }
Читатели могут предложить свои варианты, но не думаю, что в этой консерватории можно что-то подправить.
И не говорите мне, что в Перле меня ждёт аналогичная засада. Не разрушайте иллюзий...