Если я не ошибаюсь, то при обращении к несуществующей переменной, на её создание выделяется память, а значение приравнивается к null. Так на него и ссылка. Или я не прав?
я каждый раз как открою один файлик - просто кайфую от кода: PHP: <?php /** * @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; }
Kreker, kostyl — прав. PHP: <?php error_reporting (E_ALL | E_STRICT); function def (&$var, $default) { return (isset($var)) ? $var : $default; } var_dump($_GET); // array(0) {} def($_GET['a'], 3); var_dump($_GET); // array(1) { ["a"] => NULL } ?>
кстати, именно по этой же причине не выскакивает Notice у конструкций а-ля PHP: <?php $pattern = "/(\d)+/"; $subject = "abc-123"; preg_match ($pattern, $subject, &$matches); ?> отсюда этот хак мне в голову и пришёл.
Я, кстати, придумал еще одно приминение этой фичи. Идея в том, что переменная $Y нигде раньше не объявляется и нигде далее не используется) PHP: <? function toogle ($var1, $var2, &$x) { return ($x = !$x) ? $var1 : $var2; } ?> <ul> <? foreach ($elements as $e) { ?> <li class="<? echo toogle('first', 'second', $Y); ?>"> <? echo $e; ?> </li> <? } ?> </ul>
Я кажется понял, почему при передаче ссылки не выскакивает нотис - переменная не создается. Вполне ожидаемы результат: PHP: <?php $a = &$_GET['a']; echo is_null($_GET['a']); // 1 echo key_exists('a', $_GET); // 1 ?> Неожиданный результат: PHP: <?php $a = &$_GET['a']; echo is_null($_GET['a']); //1 echo isset($_GET['a']); //0 ?> Всё разрешается так: PHP: <?php $a = &$_GET['a']; var_dump($_GET); // ["a"] => &NULL ?> $_GET['a'] содержит (!) ссылку на NULL. Получается, что несуществующей переменной неявно присваивается NULL при создании ссылки, а не при использовании переменной, вследствии чего ошибки не возникает.
Программирование по-русски - как бы автогеном через жопу извернуться так, что бы нотис не сработал? Или по-индусски? Писец какой-то.. понапишем "идеи", а потом после читаешь такой код и думаешь - индус писал или нормальный человек просто забыл переменную объявить.
armadillo - там где хорошие манеры впитаны в утробе еще - от задачи не зависит. А когда прочли "хороший тон за 15 минут"... ну вполне возможно. =) kostyl какой именно пример и чего? Не понял, сори.
MiksIr в этой теме, там где я пишу про то что . Пример с заполнением филдов. (ps может я тебя не сильно понял)
Знаете, думаю нужно каждому начинать учиться с перла... да так, что бы возвращаться к своему коду каждые пол-года... Есть в нем такая гибкость.... развращающая, которая позволяет писать "ах как красиво", а уж какие регекспы там можно навернуть... Но вот понять написанное собой когда-то когда пытаешься - осознание необходимости хорошого тона быстро приходит само. Потом, правда, сложно этому следовать, но зато уже понимаешь ради чего это делаешь.
MiksIr И ты думаешь я бы написал там написал по другому если бы знал пёрл? Я, например, не знаю как иначе...
MiksIr, ты просто создаешь проблему из ничего. Просто захотел понудить и нашёл повод (есть у программистов некоторых такая проблема). Для тебя же не возникает никаких сомнений в адекватности программиста, когда он пишет: PHP: <?php preg_match ($regexp, $string, $match); ?> У тебя ж не возникает, что программист — мудак из-за того, что он не объявил $match до этого. А знаешь, почему так? А потому что такая философия языка. И ты смотришь на код, видишь там <? echo toogle ('first', 'second', $Y); ?> Нажимаешь ctrl, щёлкаешь по toogle (в своей IDE) и знаешь, что в функции toogle, как и в функции preg_match третий параметр передается по ссылке. Читаешь описание и все для тебя понятно.