ФорумПрограммированиеPHP для идиотов → call_user_func_array by reference

call_user_func_array by reference

  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 19:30

    Есть функция, принимающая произвольное количество аргументов по ссылке и записывающая в них какие-то значения.

    Вопрос: как вызвать её с заданным количеством аргументов и получить их итоговые значения?

    Ответ: Блядь! Вот так:

    $count = 5; // количество аргументов
    $args1 = array();
    $args2 = array();
    for ($i = 0; $i < $count; $i++) {
    $args1[$i] = null;
    $args2[$i] = &$args1[$i];
    }

    call_user_func_array('func', $args1);


    Кто сможет внятно объяснить механизм считается молодец.
    Кто проверит работоспособность на PHP < 5.3, тому плюс.
    Кто предложит вариант лучше, тот молодец и тому плюс.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 19:40, спустя 9 минут 17 секунд

    vasa_c, ну у вас и методы … ))))))))))))

    а в чем проблема то? объявляется нулл в ячейку и ставится ссылка на нее, ячейка перезаписывается, ссылка соотстветнно меняет исходный дублирующий массив. получается в args1 массив который вернула бы функция. args2 видимо уже никуда не возвращается раз васяц ругается))

    а чо на пыхе ниже 5.3 не будет работать? ссылки были и там и тут … должно работать 99%
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 3 октября 2010 г. 20:09, спустя 29 минут 15 секунд

    <?php
    function foo(&$a) {$a++;}
    $c = 1;
    echo $c, PHP_EOL;
    $b = array();
    $b[] =& $c;
    call_user_func_array('foo', $b);
    echo $c, PHP_EOL;


    вообще я как думал: если мы в описании ф-ции сказали, что аргумент по ссылке получаем - при вызове не нужно еще раз это указывать
    Спустя 75 сек.
    и я как бы прав:
    foo(&$c);


    E:\>php file1.php
    PHP Deprecated: Call-time pass-by-reference has been deprecated in E:\file1.php on line 8

    Deprecated: Call-time pass-by-reference has been deprecated in E:\file1.php on line 8


    какие-то двойные стандарты получаются
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 20:12, спустя 3 минуты 1 секунду

    что аргумент по ссылке получаем - при вызове не нужно еще раз это указывать

    :)

    ну а можно указать явно аргумент ссылкой и при работе с ним внутрях нессылочной функции произойдут изменения ссылочные
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 3 октября 2010 г. 20:15, спустя 3 минуты 1 секунду

    кинется варнинг
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 20:16, спустя 1 минуту 20 секунд


    кинется варнинг
    реальни? :) почему?
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 3 октября 2010 г. 20:21, спустя 5 минут 12 секунд

    похоже я хуйню сказал. В этом случае тоже депрекейтед кинется, только текст более расширенный

    PHP Deprecated:  Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the
    declaration of foo().  If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_referen
    ce to true in your INI file in E:\file.php on line 4
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 20:24, спустя 2 минуты 56 секунд

    Абырвалг, ага. ругнется чуток, но это нестрашно если функцию повторять - пиздец дело большое)
    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 20:40, спустя 15 минут 36 секунд

    а в чем проблема то? объявляется нулл в ячейку и ставится ссылка на нее, ячейка перезаписывается,

    Так а схуя она перезаписывается?

    Почему так не работает?

    for ($i = 0; $i < $count; $i++) {
    $args1[$i] = null;
    $x = &$args1[$i];
    $args2[$i] = $x;
    }
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 3 октября 2010 г. 20:44, спустя 4 минуты 29 секунд

    я че-то не понял, так а чем плохо
    $b = array();
    $b[] =& $c;

    ?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 20:45, спустя 54 секунды

    Почему так не работает?

    потмоу что ты еще ссылку пропустил)

    $args2[$i] = $x;

    &$x надо)
    Спустя 7 сек.
    имхо конечно, не проверял
    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 20:46, спустя 58 секунд

    Абырвалг, объясни механизм.
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 3 октября 2010 г. 20:50, спустя 4 минуты 5 секунд

    Кто предложит вариант лучше, тот молодец и тому плюс

    по идее по другом никак. Я это понял, когда делал bind_result в mysqli:
    	/**
    * @param mysqli_stmt $Stmt
    */
    public function __construct($Stmt)
    {
    $this->_Stmt = $Stmt;
    $this->_Rows = array();
    $this->_Row  = array();
    $Meta = $this->_Stmt->result_metadata();
    while($Field = $Meta->fetch_field()){
    $this->_Row[$Field->name] = &$ar[$Field->name]; //массив можно и не объявлять  - просто создаётся ссылка
    }
    call_user_func_array(array($this->_Stmt, 'bind_result'), $this->_Row);
    $this->_CurrIndex = 0;
    $this->_Revinded = FALSE;
    }

    Кстати call_user_func_array по разному работают в 5.3 и 5.2 ….
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 20:58, спустя 7 минут 41 секунду

    Да, блядь, ёбаный bind_result! :)
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 3 октября 2010 г. 21:00, спустя 1 минуту 51 секунду


    Да, блядь, ёбаный bind_result! :)
    godb модифицируешь?)))))))))))))))
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!