kastaneda: (Default)
[personal profile] kastaneda
function opt(&$a$b) {
    return isset(
$a)? $a$b;
}

error_reporting(E_ALL);
echo 
$foo;                  // Notice: Undefined variable: foo
echo opt($foo'hello');    // No errors

Date: Wednesday, March 24th, 2010 06:18 am (UTC)
From: [identity profile] gul-kiev.livejournal.com
До сих пор так и не знаю php.
Там что, действительно нет аналога перлового defined() и sql-ного isnull()?
А если из sql читается NULL, чем оно становится в php - неужели пустой строкой?
Или я не понял суть поста?

Date: Wednesday, March 24th, 2010 08:29 am (UTC)
From: [identity profile] gul-kiev.livejournal.com
Понял, thx.

Date: Wednesday, March 24th, 2010 07:42 pm (UTC)
From: [identity profile] dimich-dmb.livejournal.com
Прикол в том, что несуществующую переменную можно передать by reference, и это не ошибка нифига.

Предполагаю, трудность состоит в том, что интерпретатор не знает, будет ли opt() читать и использовать значение переменной, либо будет только писать в нее, то есть по сути инициализировать.
В синтаксисе object pascal, например, существует директива "out", которая используется вместо "var", чтобы указать, что это output-аргумент. Как раз для того, чтобы компилятор не подозревал в использовании неинициализированных переменных, как например в случае с buffer в вызове типа ReadFile(file, buffer, size);

Date: Thursday, March 25th, 2010 10:22 am (UTC)
From: [identity profile] dimich-dmb.livejournal.com
Я имею ввиду способ передачи аргументов, по значению:
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 во всех случаях). Можно, конечно, анализировать код функции, которой передаем ссылку, но видимо, сделать это правильно не так просто.

September 2025

M T W T F S S
12345 67
891011121314
15161718192021
22232425262728
2930