Pull to refresh

Что нового в PHP 5.4

PHP *
Sandbox
Всем привет! Судя по слухам, 19 января, в свет должен был выйти очередной RC PHP 5.4. Возможно даже, что он будет финальным. А это значит, что нужно скорее заняться изучением новых возможностей.

Я несколько лет профессионально занимаюсь веб-разработкой и в качестве основного серверного языка использую PHP. Так что узнав о выходе столь крупного обновления, я отправился собирать информацию. Под катом shortlist самых значимых нововведений.



Примеси


Ключевая новинка 5.4 — примеси. Они послужат в PHP заменой мультинаследования. Каждая примесь задается отдельным «классом» через ключевое слово trait. Внутри примеси могут быть определены методы, которые станут доступны в классе, к которому будут подключены примеси. Подключение примесей происходит с помощью языковой конструкции use. Имена примесей задаются через запятую и все их методы становятся доступны внутри класса.

Если имена методов класса и примесей совпадают, то приоритетным методом станет метод класса. К сожалению, в этом случае мы не получим даже Notice.

Примесь всегда имеет доступ к классу, к которому она подключена, через конструкцию parent.

class A {
  public function foo() {
    return 'foo';
  }
}

trait B {
  public function bar() {
    return parent::foo() . ' bar';
  }
}

class C extends A {
  use B;
}

$c = new C();
echo $c->foo(); // foo
echo $c->bar(); // foo bar


Нативная поддержка Юникода


Да-да. Больше не придется использовать расширения, вроде multibyte и ему подобных. Все строковые функции отлично понимают юникод.

Array dereferencing support


Данная возможность — краеугольный камень для многих PHP разработчиков. Как часто нам нужно дернуть нулевой индекс у метода, который возвращает массив? Насколько сильно бесит то, что эту вроде бы простую операцию приходится записывать в две строки, да еще и переменную создавать? Теперь страдать больше не придется:

function foo() {
  return array(1, 2, 3);
}

echo foo()[0]; // 1


Short syntax for arrays


В PHP 5.4 теперь доступна короткая запись массива, без ключевого слова array.

// Раньше приходилось писать так:
$array = array(1, 2, 3);

// Теперь можно так:
$array = [1, 2, 3];

// И даже так:
$array = ['first' => 1, 'second' => 2];


Встроенный веб-сервер


Отныне, вместе с дистрибутивом PHP будет поставляться встроенный веб-сервер, предназначенный исключительно для разработки. Его можно будет запустить из консоли и повесить на какой-нибудь порт:
php -S localhost:8000

Upload progress


Несмотря на то, что в HTML 5 File API реализован механизм отслеживания процесса загрузки файла на сервер (размер загруженной части отдает сам браузер), в PHP 5.4 появится дополнительный источник мониторинга состояния загрузки. Он будет храниться в сессии пользователя в ключе, например, upload_progress_myform и мы в любой момент сможем дернуть его Ajax'ом для захвата мира отрисовки прогресс-бара.

Вызов метода или свойства класса выражением


Еще одно приятное нововведение, которое поможет нам сэкономить строчку кода. Для того, чтобы вызвать свойство или метод класса, не нужно будет больше запоминать его в отдельную переменную.

class A {
  public static function foo_bar() {
    return '123';
  }
}

$foo = 'foo';
$bar = 'bar';

echo A::{$foo . '_' . $bar}(); // 123


Scalar type hints


PHP явно идет в сторону строгой типизации. Раньше для автоматической проверки типа в аргументах метода можно было указывать только массивы и имена классов. Теперь такая возможность распространяется на некоторые другие типы: int, float и boolean.

function foo(int $a, bool $b) {
  return true;
}


Улучшена производительность @


Оператор @ служит в PHP для отключения вывода ошибок на текущей строке кода. Раньше в высоко нагруженных приложениях использовать @ было невозможно из-за довольно ощутимых тормозов. Поэтому лично я ее больше не использую нигде.

В конце-концов приглушать ошибки — это странно. Ошибки нужно исправлять или ловить Exceptions.

Deleted


Кроме того из PHP наконец-то выпилены register_globals, long_arrays и прочие директивы, заждавшиеся удаления.

Использованная литература




Update: Исправил trail на trait, приношу свои извинения, спасибо DoctorChaos за наводку.
Update 2: Scalar type hints в PHP 5.4 не будет. Не смотря на это заявление, в SVN тэге 5.4 scalar type hints нет :( Спасибо Irker и sectus.
Tags: php5.4phprelease candidate
Hubs: PHP
Total votes 135: ↑123 and ↓12 +111
Comments 340
Comments Comments 340

Popular right now