Комментарии 22
Печально, что не взялись за нативные аннотации в php7.
Имхо аннотации в docblock это дико даже для php :)
Имхо аннотации в docblock это дико даже для php :)
Чувак, спасибо тебе и респект за работу!
Кажется еще не было
mgdm.net/weblog/php-at-the-speed-of-c/
как мужик код расчета мандельброта ускорял в 2100% раз, пересобрав его phpшной либо в «развернутый» php код, а потом собрав его в виде расширения
mgdm.net/weblog/php-at-the-speed-of-c/
как мужик код расчета мандельброта ускорял в 2100% раз, пересобрав его phpшной либо в «развернутый» php код, а потом собрав его в виде расширения
Да да, было в прошлом выпуске habrahabr.ru/company/zfort/blog/253135/
Спасибо за выпуск!
Ребята, кто в теме, такой вопрос. А какие реальные минусы у PHP 7? Ну, по сравнению с PHP 5. Сам на PHP не пишу, но стараюсь быть в курсе событий :)
Ребята, кто в теме, такой вопрос. А какие реальные минусы у PHP 7? Ну, по сравнению с PHP 5. Сам на PHP не пишу, но стараюсь быть в курсе событий :)
Минусы? Нет минусов, это же один и тот же язык, а не альтернатива. Для некоторых обрезание устаревшей функциональности может быть проблемой (она была объявлена устаревшей заранее), но любой нормальный код с 5.5/5.6 на 7 запустится без проблем.
Return Type Hints реализованы ужасно, и их использовать в таком виде пагубно для кода. Основные вещи:
1. Нет Nullable при возврате:
Приведет к Fatal Error (хотя в нормальных языках возврат null нормальное явление)
2. Нет «уточнения»
Это также Fatal Error
3. Переопределение класса и возврат this также не дает указать что мы возвращаем объект насследника, мы указываем тип предка, то-есть автодополнение будет считать что это предок.
В общем в текущем виде Return Type Hints вообще неюзабельны для классов, но могут нормально использоваться только для скаляров. Пара примеров еще: делал для доклада о HACK vs PHP 7
1. Нет Nullable при возврате:
public function find($id):User {
return null;
}
Приведет к Fatal Error (хотя в нормальных языках возврат null нормальное явление)
2. Нет «уточнения»
interface EntityInterface {}
interface EntiryRepositoryInterface {
public function find($id):EntityInterface;
}
class User implements EntityInterface {}
class UserRepository implements EntityRepositoryInterface {
public function find($id):User {
}
}
Это также Fatal Error
3. Переопределение класса и возврат this также не дает указать что мы возвращаем объект насследника, мы указываем тип предка, то-есть автодополнение будет считать что это предок.
В общем в текущем виде Return Type Hints вообще неюзабельны для классов, но могут нормально использоваться только для скаляров. Пара примеров еще: делал для доклада о HACK vs PHP 7
Благодарю за ответ.
Всё это будет исправлено в следующих минорных релизах, как и возврат void
Ну я могу сказать по каждому из пунктов:
1. RFC про Nullable зарегистрирован очень давно, но в обсуждении решили что эта вещь почему-то не нужна, и предложили выкидывать Exception'ы, хотя обещали подумать.
2. От этого отказались после первого варианта RFC где это было возможно, из-за того, что поведение не похоже на поведение входящих переменных (там тоже нет «уточнения»), и также падение производительности.
3. Также как и с пунктом 2.
Но вообще в Hack это есть, и они даже добавили статический анализатор типов для strict режима, который висит как демон, и hhvm просто обращается к нему: есть ошибки? нет, значит пусть приложение работает, если что в любой момент можно Exception выкинуть. И это дает реальный прирост производительности, потому что strict файлы отлично проверены как в Java. К примеру:
Сразу выкинет ошибки:
1. protected int $id — не задается в конструкторе и не имеет значение по умолчанию, поэтому нужно пометить как nullable:
2. метод getId — может возвращать null, нужно пометить что он nullable, то-есть:
3. Выход из getIdentifier() может иметь null, нужно пометить.
И он очень хорошо просматривает то, какие типы должны использоваться, он в strict режиме запрещает использовать обычные массивы, рекомендует использовать Map, Vector, etc в указанием типа. И большинство ошибок сразу же всплывают во время сохранения файла.
1. RFC про Nullable зарегистрирован очень давно, но в обсуждении решили что эта вещь почему-то не нужна, и предложили выкидывать Exception'ы, хотя обещали подумать.
2. От этого отказались после первого варианта RFC где это было возможно, из-за того, что поведение не похоже на поведение входящих переменных (там тоже нет «уточнения»), и также падение производительности.
3. Также как и с пунктом 2.
Но вообще в Hack это есть, и они даже добавили статический анализатор типов для strict режима, который висит как демон, и hhvm просто обращается к нему: есть ошибки? нет, значит пусть приложение работает, если что в любой момент можно Exception выкинуть. И это дает реальный прирост производительности, потому что strict файлы отлично проверены как в Java. К примеру:
<?hh //strict
class User {
protected int $id;
public function getId():int {
return $this->id;
}
}
class UserManager {
public function getIdentifier(User $user):int {
return $user->getId();
}
}
Сразу выкинет ошибки:
1. protected int $id — не задается в конструкторе и не имеет значение по умолчанию, поэтому нужно пометить как nullable:
protected ?int $id;
2. метод getId — может возвращать null, нужно пометить что он nullable, то-есть:
public function getId():?int{}
3. Выход из getIdentifier() может иметь null, нужно пометить.
И он очень хорошо просматривает то, какие типы должны использоваться, он в strict режиме запрещает использовать обычные массивы, рекомендует использовать Map, Vector, etc в указанием типа. И большинство ошибок сразу же всплывают во время сохранения файла.
Считаю не совсем правильным сравнивать типизацию в hack и php: в первом это необходимость, во втором — дополнение.
А что касается rfc, никто пока не знает и до конца не понимает, в каком направлении всё это будет развиваться. Надо сначала поиграться с тем, что есть, потом будут какие-то изменения, основанные на практическом применении
А что касается rfc, никто пока не знает и до конца не понимает, в каком направлении всё это будет развиваться. Надо сначала поиграться с тем, что есть, потом будут какие-то изменения, основанные на практическом применении
Я так смотрю, то о чем я писал про phar ещё в 2012, а использовал даже раньше начало доходить даже до Symfony. Может, вам сделать ещё раздел в дайджесте типа «habrahabr PHP flashback»?)
phar использовали для дистрибьюции Silex еще раньше. Лично мне это кажется не удобным. Да и вообще у меня Docker головного мозга…
Docker это да, тоже пользуюсь.
Там немного иначе, Silex как фреймворк подключается, я же больше об альтернативе zip, когда файл имеет какой-то графический или консольный интерфейс, и используется не в виде подключаемого phar, а позволяет развернуть сконфигурированное приложение готовое к работе. Вот опять банально если бы WP вместо zip предлагал скачать phar.
Там немного иначе, Silex как фреймворк подключается, я же больше об альтернативе zip, когда файл имеет какой-то графический или консольный интерфейс, и используется не в виде подключаемого phar, а позволяет развернуть сконфигурированное приложение готовое к работе. Вот опять банально если бы WP вместо zip предлагал скачать phar.
>> function foo(int $abc): int
эмм… значения вида '123' пройдут или фатал эррор вызовут?
эмм… значения вида '123' пройдут или фатал эррор вызовут?
Спасибо, прочитал с удовольствием. С нетерпением жду php7!
Scalar Type Hints — Будет интересно!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
PHP-Дайджест № 59 – интересные новости, материалы и инструменты (16 – 29 марта 2015)