Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Наведение порядка в PHP (версия 5.5.0)

Нужно ещё похвалить авторов PHP за то, что они действительно стараются навести порядок в языке. С каждой версией он становится немного логичнее.

Например, теперь уже можно сделать вот так:

[
    POW => function($x) { return $x*$x; },
    SIN   => function($x) { return sin($x); },
][$selector]

Правда, всё ещё нельзя вызвать функцию сразу. В 5.5.0 будет работать вот такая вещь:

if (empty(somefunc())) { /* …  */}

Но то же самое нельзя сделать с isset, так как сложно сказать что это будет значить — в языке нет отдельного неопределённого значения переменной, она бывает только недекларированной; функция, конечно, может её вернуть, но на самом деле вернётся NULL, а isset от значения NULL — «ложь».

Появилась возможность использовать list внутри цикла следующим образом:

foreach ($somehash as list($key, $value)) { /* … */ }

И сделано ещё несколько мелочей, но работы впереди ещё много.

8 комментариев
BOLVERIN 2012

хорошо что отсрочили шестую версию и занялись доведением до ума пятой

Vereschagin Sergey 2012

2 ошибки:
«Например, теперь уже сделать вот так:»
«foreach ($somehash as list($key, $value) { /* … */ }»

Евгений Степанищев (bolknote.ru) 2012

Комментарий для Vereschagin Sergey:

Спасибо!

K!N6 2012

if (empty(somefunc()) { /* … */}
foreach ($somehash as list($key, $value) { /* … */ }

В обоих примерах не хватает закрывающих скобок? :)

По теме: не очень понятно, что должна делать такая конструкция if (isset(somefunc())) { /* … */} . isset проверяет на существование, а вот empty проверяет еще и нулевые значения, не? В таком случае всё правильно в т.ч. isset, либо я чего не то понял.

Евгений Степанищев (bolknote.ru) 2012

Комментарий для K!N6:

В обоих примерах не хватает закрывающих скобок? :)

Спасибо, поправил!

isset проверяет на существование, а вот empty проверяет еще и нулевые значения, не? В таком случае всё правильно в т.ч. isset, либо я чего не то понял.

Да. Что правильно? Я не понимаю что вы хотите сказать. Правильно что isset сейчас бессмысленно делать от функции? В текущем состоянии языка — да. Правильно это с точки зрения логики? Нет, неправильно. В JS есть undefined и его легко можно вернуть из функции, в том числе, попытавшись вернуть переменную, которой нет.

K!N6 2012

Фактически в php есть неопределенное значение для переменной, просто его сложно получить :) Как я понимаю, для этого нет какой то константы или типа того (как undefined в js).
Приведу пример неопределенной переменной:

class Foo {

public static $bar;

}
echo ’empty(Foo::$bar) = ’.(empty(Foo::$bar) ? ’true’ : ’false’).«\n»;;
echo ’isset(Foo::$bar) = ’.(isset(Foo::$bar) ? ’true’ : ’false’).«\n»;
$test = Foo::$bar;
echo ’empty($test) = ’.(empty($test) ? ’true’ : ’false’).«\n»;
echo ’isset($test) = ’.(isset($test) ? ’true’ : ’false’).«\n»;

у меня на php 5.4.8 выводит:

empty(Foo::$bar) = true
isset(Foo::$bar) = false
empty($test) = true
isset($test) = false

K!N6 2012

Комментарий для Евгения Степанищева:

Потестил еще, оказывается в Foo::$bar обычный null. Сразу не понял мысль в посте, теперь понял) Видимо разработчики php считают, что null и есть аналог undefined в js.

А что в «foreach ($somehash as list($key, $value)) { /* … */ }» необычного?

Евгений Степанищев (bolknote.ru) 2012

Комментарий для K!N6:

А что в «foreach ($somehash as list($key, $value)) { /* … */ }» необычного?

Ничего, за исключением того, что до 5.5 так не работало.