Вот чего мне в 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 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 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 во всех случаях). Можно, конечно, анализировать код функции, которой передаем ссылку, но видимо, сделать это правильно не так просто.
no subject
Date: Thursday, March 25th, 2010 08:27 am (UTC)