- Перевод
PHP 5.4 был опубликован четыре месяца назад, так что, вероятно, слишком рано смотреть на новую версию PHP. Тем не менее я бы хотел сделать для всех, кто не подписан на внутренний список рассылок , небольшой предварительный обзор того, как может выглядеть PHP 5.5.
Однако необходимо понять: PHP 5.5 еще на ранней стадии развития, поэтому никто не знает, как он будет выглядеть в итоге. Все, о чем здесь написано это только предложения. Я уверен, что не все это будет в PHP 5.5, или будет, но не в таком виде.
Так что не стоит слишком возбуждаться.
Теперь, без лишних церемоний, список фич, над которыми ведется работа в PHP 5.5:
Обратная совместимость
Начнем с двух изменений, которые уже попали в master и влияют на обратную совместимость (по крайней мере в некоторой степени):Отказ от поддержки Windows XP и 2003
Статус: landed; Ответственный: Pierre JoyePHP 5.5 больше не поддерживает Windows XP и 2003. Этим системам около десяти лет, поэтому PHP отказалось от них.
Модификатор /e признан устаревшим
Новые функции и классы
Далее мы рассмотрим некоторые запланированные новые функции и классы:boolval()
Статус: landed; Ответственный: Jille TimmermansВ PHP уже реализованы функции strval , intval и floatval . Для согласованности добавлена функция boolval . Она делает то же самое, что и приведение (bool) , но может быть использована в качестве аргумента для другой функции.
hash_pbkdf2()
Статус: landed; Ответственный: Anthony FerraraДобавления в расширении intl
Статус: landed; Ответственный: Gustavo André dos Santos LopesБудет много улучшений в расширение intl. Например, появятся новые классы IntlCalendar , IntlGregorianCalendar , IntlTimeZone , IntlBreakIterator , IntlRuleBasedBreakIterator , IntlCodePointBreakIterator . Я к сожалению не много знаю о расширении intl, так что, если вы хотите узнать больше, я рекоммендую ознакомиться с анонсами в список рассылки для Calendar и BreakIterator .
array_column()
Статус: proposed; Ответственный: Ben RamseyИзменения в языке
Теперь перейдем к действительно интересным вещам: новые возможности и усовершенствования языка.Разыменование массивов
Статус: landed; Ответственный: Xinchen HuiРазыменование массивов означает, что операции для массивов могут быть применены к строке или непосредственно к массиву. Вот два примера:
Я не думаю, что эта функция очень полезна на практике, но это делает язык согласованнее. См. также RFC .
empty() работает с вызовами функций и другими выражениями
Статус: landed; Ответственный: Nikita PopovВ настоящее время конструкция языка empty() может быть использована только с переменными, но не с выражениями. Например, код empty($this->getFriends()) выдаст ошибку. В PHP 5.5 это будет валидный код. Для получения дополнительной информации см. RFC .
Получение полного имени класса
Статус: proposed; Ответственный: Ralph SchindlerВ PHP 5.3 представили пространства имен с возможностью назначать классам и пространствам имен более короткие псевдонимы. Это не распространяется на строку с именем класса:
В качестве решения предложен новый синтаксис FooBar::class , который возвращает полное имя класса:
Больше примеров в RFC .
Пропуск параметров
Статус: proposed; Ответственный: Stas MalyshevЕсли у вас есть функция, которая принимает несколько необязательных параметров в настоящее время нет способа изменить только последний, оставив все другие по умолчанию.
Function create_query($where, $order_by, $join_type="", $execute = false, $report_errors = true) { ... }
Нет никакого способа установить $report_errors = false без повторения двух других значений по умолчанию. Для решения этой проблемы предлагается использовать пропуск параметров:
Create_query("deleted=0", "name", default, default, false);
Лично мне не особенно нравится это предложение. На мой взгляд код, в котором это нововведение необходимо, является плохо продуманным. Функции не должны иметь 12 дополнительных параметров.
Контроль типа для скалярных значений
Статус: proposed; Ответственный: Anthony FerraraКонтроль типа для скалярных значений изначально планировался в 5.4, но его не сделали из-за отсутствия консенсуса. Для получения дополнительной информации о том, почему его еще не сделали в PHP, см.: Scalar typehints are harder than you think .
В PHP 5.5 обсуждения возобновились, и я думаю, появилось довольно приличное предложение для контроля типа скалярных значений используя преобразования типов .
Оно будет работать, приводя входящее значение в указанный тип, но только если приведение может происходить без потери данных. Например 123 , 123.0 , "123" будут действительны для int параметров, но "привет мир" не будет. Это соответствует поведению внутренних функций.
Function foo(int $i) { ... } foo(1); // $i = 1 foo(1.0); // $i = 1 foo("1"); // $i = 1 foo("1abc"); // пока не ясно, может быть $i = 1 с выводом notice foo(1.5); // пока не ясно, может быть $i = 1 с выводом notice foo(); // ошибка foo("abc"); // ошибка
Getters и setters
Статус: proposed; Ответственный: Clint PriestЕсли вы не поклонник писать все эти методы getXYZ() и setXYZ($value) , то это должно быть позитивным изменением для вас. Предложение добавляет новый синтаксис для определения того, что должно произойти, когда свойство пишут или читают:
seconds / 3600; }
set { $this->seconds = $value * 3600; }
}
}
$timePeriod = new TimePeriod;
$timePeriod->hours = 10;
var_dump($timePeriod->seconds); // int(36000)
var_dump($timePeriod->hours); // int(10)
Есть еще несколько нововведений, например read-only свойства. Если вы хотите узнать больше, посмотрите RFC .
Генераторы
В настоящее время итераторы используются редко, поскольку их реализация требует большого количества шаблонного кода. Генераторы должны решить эту проблему, предоставляя простой способ создания итераторов.
Например, вот как можно определить функцию range как итератор:
Приведенная выше функция xrange имеет такое же поведение, как встроенная функция range с одним отличием: вместо возвращения массива со всеми значениями, она возвращает итератор, который генерирует значения на лету.
Для более глубокого введения в тему можно посмотреть RFC .
Выделение списков и выражения-генераторы
Статус: proposed; Ответственный: Nikita PopovВыделение списков обеспечивают простой способ произвести операции над массивами:
$firstNames = ;
Выше приведенный код эквивалентен следующему:
$firstNames = ;
foreach ($users as $user) {
$firstNames = $user->firstName;
}
Также можно фильтровать массивы следующим образом:
$underageUsers = ;
Выражения-генераторы очень похожи, но возвращают не массив, а итератор, который генерирует значения на лету.
Заключение
Как вы видите, есть много удивительных вещей, над которыми ведется работа в PHP 5.5. Но, как я уже сказал, PHP 5.5 еще молод, поэтому мы не знаем наверняка, что будет в нем, а что нет.Если вы хотите оставаться в курсе новых возможностей или хотите помочь в обсуждении и/или развитии, не забудьте
Мой похож на jprofitt"s
но я разделил их на вершины и долины, поэтому я могу сделать еще кое-что с этим.
Я думаю, что его цикл намного чище, чем мой, но я просто хотел проверить его для себя.
Не судите меня
Этот сценарий просто отображает точки и выбирает пики и долины и дает им зеленый и красный соответственно. Смотрите на это как наглядное пособие. :П
$array[$i-1]; $more_than_next = $array[$i] > $array[$i+1]; $next_is_equal = $array[$i] == $array[$i+1]; if($next_is_equal) continue; if($i == 0){ if($more_than_next){ $peaks = $array[$i]; $peak_keys = $i; }else{ $valleys = $array[$i]; $valley_keys = $i; } }elseif($i == (count($array)-1)){ if($more_than_last){ $peaks = $array[$i]; $peak_keys = $i; }else{ $valleys = $array[$i]; $valley_keys = $i; } }else{ if($more_than_last && $more_than_next){ $peaks = $array[$i]; $peak_keys = $i; }elseif(!$more_than_last && !$more_than_next){ $valleys = $array[$i]; $valley_keys = $i; } } } return array("peaks" => $peaks, "valleys" => $valleys, "peak_keys" => $peak_keys, "valley_keys" => $valley_keys); } ?> "; foreach($plot as $key => $point){ $left = ($key*10); $top = 400 - ($point*10); if(in_array($key, $res["peak_keys"]) || in_array($key, $res["valley_keys"])){ $extreme = "