ФорумПрограммированиеPHP для идиотов → Как узнать имя переменной, переданной в качестве аргумента ф-ии

Как узнать имя переменной, переданной в качестве аргумента ф-ии

  • Абырвалг

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

    Spritz 5 ноября 2009 г. 15:07, спустя 6 минут 29 секунд


    adw0rd, не хочу показаться хвастуном, но я сразу понял что для шаблонизатора))

    а чем тебе

    $tpl->users = $users->getAll();

    не нравится? имхо куда практичнее)

    ага. Я тоже догадался, так сам задавал подобный вопрос когда-то http://www.php.ru/forum/viewtopic.php?p=171659#171659
    Спустя 208 сек.
    через бектрейс в теории можно изврнуться, как тут:
    <?
    if (!function_exists('get_called_class')) {
    function get_called_class()
    {
    $bt = debug_backtrace();
    $l = 0;
    do {
    $l++;
    $lines = file($bt[$l]['file']);
    $callerLine = $lines[$bt[$l]['line'] - 1];
    preg_match('/([a-zA-Z0-9\_]+)::' . $bt[$l]['function'] . '/',
    $callerLine,
    $matches);

    if ($matches[1] == 'self') {
    $line = $bt[$l]['line'] - 1;
    while ($line > 0 && strpos($lines[$line], 'class') === false) {
    $line–;
    }
    preg_match('/class[\s]+(.+?)[\s]+/si', $lines[$line], $matches);
    }

    } while ($matches[1] == 'parent' && $matches[1]);

    return $matches[1];
    }
    }

    но только стоит ли игра свеч? парсить регуляркой весь исходник..
    Короче или забить на эту идею или __set использовать, как Дуд выше предложил.
  • adw0rd

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

    Spritz 5 ноября 2009 г. 15:09, спустя 1 минуту 32 секунды

    Ну там предлагают типа того:
    array_search($myLabel,$GLOBALS);
    Спустя 37 сек.
    Но как сказал серега, вроде как нету такой возможности
    По моему нет. Иначе можно было бы прикольно замутить передачу параметров в стиле пайтона.
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • adw0rd

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

    Spritz 5 ноября 2009 г. 15:20, спустя 11 минут 4 секунды

    Абырвалг, да, про парсинг сорца тоже думал и тоже решил что изврат )
    Спустя 78 сек.
    А в случае __set, мне просто охота сделать схожие конструкции с django, в этом вся и соль )
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • vasa_c

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

    Spritz 5 ноября 2009 г. 20:16, спустя 4 часа 56 минут 31 секунду

    Может тогда наоборот передавать вместо переменной имя, а значение тянуть из GLOBALS ?
  • Абырвалг

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

    Spritz 5 ноября 2009 г. 20:34, спустя 17 минут 39 секунд

    а если у нас не глобалс? Переменная в локальной области видимости
  • vasa_c

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

    Spritz 5 ноября 2009 г. 21:22, спустя 48 минут 10 секунд

    adw0rd, покажи, как подобное в джанго выглядит, чтобы знать к чему стремиться
  • adw0rd

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

    Spritz 5 ноября 2009 г. 22:02, спустя 40 минут 29 секунд

    На самом деле в жанго, в методе render_to_response можно передавать имя шаблона и словарь, так что так я именно и делаю на PHP
    А мне хотелось бы передавать только объект…

    В пайтоне есть *args и **kwargs, то есть позиционированные аргументы (1,2,3,'test') и именованные (pk=1, user=34, name='vasa_c'), вот где удобство )
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • vasa_c

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

    Spritz 5 ноября 2009 г. 22:06, спустя 3 минуты 28 секунд

    Да, удобство, но конкретно в твоём случае его не много.
    Всё равно два раза нужно писать: func(name=name)
  • Абырвалг

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

    Spritz 5 ноября 2009 г. 23:15, спустя 1 час 8 минут 55 секунд

    adw0rd, да знает васяц об именованных аргументах в пайтоне. Сам об этом же и писал http://blgo.ru/blog/2009/04/14/default/
  • krasun

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

    Spritz 6 ноября 2009 г. 0:05, спустя 50 минут 2 секунды


    Пример:


    function test ($name)
    {
       // тут надо получить 'thisName'
    }

    test($thisName);


    Рассматриваются любые варианты, типа Reflection, backtrace и т.д.

    зы. спасибо васяцу за [man]debug_backtrace[/man]





    function test($name)
    {
       $argName = '';
       foreach ($GLOBALS as $key => $value)
       {
           if ($name === $value) {
               $argName = $key;
           }
       }
       
       // prints: thisName
       echo $argName;
       
    }

    $thisName = 'asd';
    test($thisName);
  • adw0rd

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

    Spritz 6 ноября 2009 г. 0:07, спустя 2 минуты 21 секунду

    Абырвалг, да знаю я что васяц знает и что у него на уме ))
    Спустя 52 сек.
    krasun, спасибо, про глобалс уже обсудили пару страниц назад, но я не использую глобалс
    Спустя 17 сек.
    И ваще, я уже забил и юзаю словарь
    Спустя 36 сек.

    Да, удобство, но конкретно в твоём случае его не много.
    Всё равно два раза нужно писать: func(name=name)
    согласен
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Trej Gun

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

    Spritz 9 ноября 2009 г. 18:15, спустя 3 дня 18 часов 7 минут

    array_search($myLabel,$GLOBALS);

    я тоже сразу об этом подумал но если ты делаешь

    test ($obj->name)

    то фигня выходит



  • tserj

    Сообщения: 2 Репутация: N Группа: Кто попало

    Spritz 16 марта 2010 г. 9:28, спустя 126 дней 15 часов 12 минут

     
     $SOME_PREFIX_1 = "test1";
       $SOME_PREFIX_2 = "test2";
       
       $arr = get_defined_vars();
       foreach($arr as $key => $value) {
           if (strstr($key, 'SOME_PREFIX_')) {
               echo("переменная: $key - значение: $value\n");
           }
       }    


    при желании SOME_PREFIX_ можно исключить.
    при мусоре (для TC), если пихать в функцию поиск "ага-ага" - ничего не выдаст - можно обработать.

    собственно ко всем нужным переменным можно добавить префикс в начале:

     
      // исходные данные
       $test_1 = "test1";
       $test_2 = "test2";
       $prefix = "SOME_PREFIX_";
     
       // где-то в коде - добавляем префикс для точного поиска
       ${$prefix.$test_1} = $test_1;
       ${$prefix.$test_2} = $test_2;
       
       // поиск
       $arr = get_defined_vars();
       foreach($arr as $key => $value) {
           if (strstr($key, 'SOME_PREFIX_')) {
               echo("переменная: $key - значение: $value\n");
           }
       }    


    подходит?

  • tserj

    Сообщения: 2 Репутация: N Группа: Кто попало

    Spritz 16 марта 2010 г. 2:30, спустя 17 часов 2 минуты 14 секунд

    для конфигураций курим: get_cfg_var – Gets the value of a PHP configuration option

    для полей классов: get_object_vars – Returns an associative array of object properties

  • phpdude

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

    Spritz 16 марта 2010 г. 9:29, спустя 6 часов 59 минут 1 секунду

    tserj, че куришь? продай, а?
    Спустя 43 сек.
    tserj, выучи тег
    Сапожник без сапог

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