Вот чего мне в built-in ф-циях PHP недостаёт
Tuesday, March 23rd, 2010 19:56function opt(&$a, $b) {
return isset($a)? $a: $b;
}
error_reporting(E_ALL);
echo $foo; // Notice: Undefined variable: foo
echo opt($foo, 'hello'); // No errors
no subject
Date: Wednesday, March 24th, 2010 06:18 am (UTC)Там что, действительно нет аналога перлового defined() и sql-ного isnull()?
А если из sql читается NULL, чем оно становится в php - неужели пустой строкой?
Или я не понял суть поста?
no subject
Date: Wednesday, March 24th, 2010 08:11 am (UTC)Кроме традиционных string / float / integer, также существуют тип bool (со значениями, как и следует ожидать, true/false) и тип null (с единственным значением null). Обычное сравнение ($a==$b) выполняется с приведением типов; кроме этого, есть строгое сравнение без приведения типов ($a===$b, $a!==$b).
Переменная может существовать ($a=1, isset($a) возвращает true) и может не существовать (до того, как её начали использовать или после unset($a)). Обращение к несуществующей переменной — это небольшая ошибка (E_NOTICE) и дурной тон.
Если мы заранее не знаем, существует ли переменная, считается хорошим тоном писать как-то так:
echo isset($variable)? $variable: 'Default value';
Прикол в том, что несуществующую переменную можно передать by reference, и это не ошибка нифига.
no subject
Date: Wednesday, March 24th, 2010 08:29 am (UTC)no subject
Date: Wednesday, March 24th, 2010 07:42 pm (UTC)Предполагаю, трудность состоит в том, что интерпретатор не знает, будет ли opt() читать и использовать значение переменной, либо будет только писать в нее, то есть по сути инициализировать.
В синтаксисе object pascal, например, существует директива "out", которая используется вместо "var", чтобы указать, что это output-аргумент. Как раз для того, чтобы компилятор не подозревал в использовании неинициализированных переменных, как например в случае с buffer в вызове типа ReadFile(file, buffer, size);
no subject
Date: Thursday, March 25th, 2010 08:17 am (UTC)no subject
Date: Thursday, March 25th, 2010 08:27 am (UTC)no subject
Date: Thursday, March 25th, 2010 10:22 am (UTC)procedure foo(value: integer);или по ссылке:
procedure bar(var value: integer);Вот в какой-то версии object pascal (или к тому времени он уже был переименован в delphi?) появилась возможность писать
procedure read_value(out value: integer);чтобы компилятор не нервничал, когда в функцию, которая будет только писать по ссылке, передают ссылку на неинициализированную переменную.
Вообще беда с такими трюками, они не универсальны: http://pastie.org/886142
Видимо, какая-то специфика php-шной реализации объектов. Может быть члены класса каким-то образом инициализируются при создании экземпляра? Я в php не спец.
Но в общем случае, если нет средств указать, будет ли использоваться значение переменной, вариантов немного. Либо предупреждаем всегда, когда передаем ссылку на неинициализированную переменную (и получаем ложные предупреждения, если по ссылке только пишем), либо не предупреждаем никогда (и получаем No errors во всех случаях). Можно, конечно, анализировать код функции, которой передаем ссылку, но видимо, сделать это правильно не так просто.