За последние 24 часа нас посетили 15733 программиста и 1623 робота. Сейчас ищут 1084 программиста ...

Хочу такую языковую конструкцию

Тема в разделе "Прочее", создана пользователем armadillo, 25 авг 2009.

  1. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Круто. Я и не знал про такую штуку. А как она работает? Передает ссылку на null?
     
  2. kostyl

    kostyl Guest

    Все круто, просто unset($a) и $a = NULL разные вещи...
    Kreker
    создает ссылку
     
  3. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Если я не ошибаюсь, то при обращении к несуществующей переменной, на её создание выделяется память, а значение приравнивается к null. Так на него и ссылка. Или я не прав?
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Kreker
    В документации же написано:
    =)
     
  5. kostyl

    kostyl Guest

    я каждый раз как открою один файлик - просто кайфую от кода:
    PHP:
    1.     <?php
    2.      /**
    3.      * @param mysqli_stmt $Stmt
    4.      */
    5.     public function __construct($Stmt)
    6.     {
    7.         $this->_Stmt = $Stmt;
    8.         $this->_Rows = array();
    9.         $this->_Row  = array();
    10.         $Meta = $this->_Stmt->result_metadata();
    11.         while($Field = $Meta->fetch_field()){
    12.             $this->_Row[$Field->name] = &$ar[$Field->name];
    13.         }
    14.         call_user_func_array(array($this->_Stmt, 'bind_result'), $this->_Row);
    15.         $this->_CurrIndex = 0;
    16.         $this->_Revinded = FALSE;
    17.     }
    18.  
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    function my(&$var) {
    var_dump($var); //NULL
    }
    my($lol);

    Все верно.
     
  7. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Kreker, kostyl — прав.
    PHP:
    1. <?php
    2.     error_reporting (E_ALL | E_STRICT);
    3.     function def (&$var, $default) {
    4.         return (isset($var)) ? $var : $default;
    5.     }
    6.     var_dump($_GET); // array(0) {}
    7.     def($_GET['a'], 3);
    8.     var_dump($_GET); // array(1) { ["a"] => NULL }
    9. ?>
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    кстати, именно по этой же причине не выскакивает Notice у конструкций а-ля
    PHP:
    1. <?php
    2. $pattern = "/(\d)+/";
    3. $subject = "abc-123";
    4. preg_match ($pattern, $subject, &$matches);
    5. ?>
    отсюда этот хак мне в голову и пришёл.
     
  9. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Я, кстати, придумал еще одно приминение этой фичи. Идея в том, что переменная $Y нигде раньше не объявляется и нигде далее не используется)
    PHP:
    1. <?
    2. function toogle ($var1, $var2, &$x) {
    3.     return ($x = !$x) ? $var1 : $var2;
    4. }
    5. ?>
    6. <ul>
    7. <? foreach ($elements as $e) { ?>
    8.     <li class="<? echo toogle('first', 'second', $Y); ?>">
    9.         <? echo $e; ?>
    10.     </li>
    11. <? } ?>
    12. </ul>
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Я кажется понял, почему при передаче ссылки не выскакивает нотис - переменная не создается.
    Вполне ожидаемы результат:
    PHP:
    1. <?php
    2. $a = &$_GET['a'];
    3. echo is_null($_GET['a']); // 1
    4. echo key_exists('a', $_GET); // 1
    5. ?>
    Неожиданный результат:
    PHP:
    1. <?php
    2. $a = &$_GET['a'];
    3. echo is_null($_GET['a']); //1
    4. echo isset($_GET['a']); //0
    5. ?>
    Всё разрешается так:
    PHP:
    1. <?php
    2. $a = &$_GET['a'];
    3. var_dump($_GET); // ["a"] => &NULL
    4. ?>
    $_GET['a'] содержит (!) ссылку на NULL. Получается, что несуществующей переменной неявно присваивается NULL при создании ссылки, а не при использовании переменной, вследствии чего ошибки не возникает.
     
  11. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    хорошее применение!
     
  12. kostyl

    kostyl Guest

    не вижу неожиданного ничего. Создается ссылка на NULL точка.
     
  13. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Оно и так присваивается, просто без ссылки нотис выскакивает.


    TheShock
    Класс!
     
  14. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Программирование по-русски - как бы автогеном через жопу извернуться так, что бы нотис не сработал? Или по-индусски?
    Писец какой-то.. понапишем "идеи", а потом после читаешь такой код и думаешь - индус писал или нормальный человек просто забыл переменную объявить.
     
  15. kostyl

    kostyl Guest

    MiksIr
    причем тут нотис? посмотри мой пример....
     
  16. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    MiksIr
    зависит от задачи. У меня часто списки, в которых важен сам факт наличия элемента.
     
  17. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    armadillo - там где хорошие манеры впитаны в утробе еще - от задачи не зависит. А когда прочли "хороший тон за 15 минут"... ну вполне возможно. =)
    kostyl какой именно пример и чего? Не понял, сори.
     
  18. kostyl

    kostyl Guest

    MiksIr
    в этой теме, там где я пишу про то что
    . Пример с заполнением филдов.
    (ps может я тебя не сильно понял)
     
  19. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    А что такое $ar и откуда он взялся?
     
  20. kostyl

    kostyl Guest

    ну в этом вся и соль, что неоткуда. Ссылка создается "на лету".
     
  21. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Вот именно про это я и говорил.
     
  22. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Знаете, думаю нужно каждому начинать учиться с перла... да так, что бы возвращаться к своему коду каждые пол-года...
    Есть в нем такая гибкость.... развращающая, которая позволяет писать "ах как красиво", а уж какие регекспы там можно навернуть... Но вот понять написанное собой когда-то когда пытаешься - осознание необходимости хорошого тона быстро приходит само. Потом, правда, сложно этому следовать, но зато уже понимаешь ради чего это делаешь.
     
  23. kostyl

    kostyl Guest

    MiksIr
    И ты думаешь я бы написал там написал по другому если бы знал пёрл? Я, например, не знаю как иначе...
     
  24. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    MiksIr, ты просто создаешь проблему из ничего. Просто захотел понудить и нашёл повод (есть у программистов некоторых такая проблема). Для тебя же не возникает никаких сомнений в адекватности программиста, когда он пишет:
    PHP:
    1. <?php
    2.   preg_match ($regexp, $string, $match);
    3. ?>
    У тебя ж не возникает, что программист — мудак из-за того, что он не объявил $match до этого.
    А знаешь, почему так? А потому что такая философия языка. И ты смотришь на код, видишь там
    <? echo toogle ('first', 'second', $Y); ?>
    Нажимаешь ctrl, щёлкаешь по toogle (в своей IDE) и знаешь, что в функции toogle, как и в функции preg_match третий параметр передается по ссылке. Читаешь описание и все для тебя понятно.
     
  25. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    А вы объясните что хотели. Двумерный массив с налами по диогонали?