В статье будут рассмотрены темы: — Развитие синтаксиса PHP — Будет дан ответ на аксиому "почему только 5.3, не выше?" и что из нового синтаксиса можно. — Вопрос совместимости, "исторические хвосты"
Мы в данный момент работаем по версии 5.3. Ниже я описываю новые улучшения в 5.4 и 5.5. К сожалению, возможности из этих версий пока использовать НЕЛЬЗЯ. Можно использовать только возможности 5.3.
Важно! Пиши на PHP 5.3! Все вещи, которые доступны выше 5.3 необходимо решать путем создания промежуточных вспомогательных переменных!
Итак, чтобы рассмотреть эту аксиому подробнее, рассмотрим эволюцию синтаксиса PHP, что же появилось в новых версиях (будут рассмотрены не все улучшения, а только вопросы коротких разыменований, и важных в связи с выходом D7).
[spoiler]
PHP 5.3 — В PHP 5й версии появилась возможность возвращать из методов и функций объект. Это позволяет использовать цепочки вызовов.
Самое важное новшество в ZE 2.0 – это новая объектная модель. К примеру в Zend Engine 1.0 (PHP 4) нельзя было использовать статические поля классов, содержащие объекты. Да и вообще много чего было нельзя, включая цепочку вызовов методов $object->method()->method(). А если вспомнить PHP 3.0 (но лучше не надо ), то там вообще процедурный стиль, и объектов не было.
Кстати, именно в Zend Engine 2.0 появился новый синтаксис обращения к символам строки:
$str1 = $str2 = "";
$str1{0} = 'a';
$str2[0] = 'a'; // такой синтаксис для строк
// уже давно объявлен как устаревший
Это сделано для того, чтобы избежать ошибок. К примеру, в приведенном выше примере $str1 станет строкой "a", а $str2 станет массивом array( 0 => "a" )
— Не совсем по теме, но важное доступное улучшение: у тернарного оператора есть теперь сокращенный вид: ?:.
Начиная с версии PHP 5.3 также стало возможным не писать среднюю часть тернарного оператора. Выражение expr1 ?: expr3 возвращает expr1 если expr1 имеет значение TRUE, и expr3 в другом случае.
— Добавлена возможность разыменования массивов, возвращаемых функциями. Например:
foo()[0]
$foo->bar()[0]
— Добавлена возможность получения доступа к члену класса при создании экземпляра. Например:
(new Foo)->method()
(new Foo)->property
(new Foo)[0]
— Теперь поддерживается такой синтаксис: Class::{expr}().
class A {
static function foo() {
echo "Hello world!\n";
}
}
$x = "f";
$y = "o";
A::{$x.$y.$y}();
— Новый тип передаваемого параметра метода/функции Callable, такой аргумент должен быть вызываемым (т.е. удовлетворять условию is_callable($arg, false))
Например:
function foo(callable $do) {
}
foo("strcmp");
foo(function() {});
$o = new ArrayObject();
foo(array($o, "count");
Как видите, в 5.4 много интересного, но использовать это все пока нельзя. Для решения таких задач в 5.3 придется создавать вспомогательные переменные.
К сожалению, как показывает практика, повсеместное внедрение новых версий PHP на серверах в глобальном масштабе – процесс затяжной, и во многом зависит от крупных игроков рынка, таких, которым несомненно является компания Битрикс.
Итог . Мы в данный момент работаем по версии 5.3, не смотря на то, что на сервере я установил 5.4. Поэтому конструкции из 5.4 нужно знать, но использовать пока нельзя, т.к. на хостах в интернете почти везде пока 5.3!
И на последок пример из жизни :
Этот кусок кода работал у нас на сервере, т.к. у нас 5.4 (я установил эту версию, т.к. у нее значительно повышена производительность, порядка 30-40%, как говорил недавно Расмус Лердорф, плюс это и заметно). Тем не менее писать нужно на 5.3!
Итак следующий код не вызывал у нас проблем на ТЕСТОВОМ рабочем сервере (см. current($vendor)[ '...' ], это доступно с 5.4)
Если данный код сразу был бы написан с учетом 5.3 - проблему совместимости удалось бы избежать.
На самом деле совместимость – это краеугольный камень всех программных систем. Важность совместимости бесспорна, но на ее поддержание уходит не мало сил. Возьмите историю с браузером IE7-8, который в мучениях приходится поддерживать некоторым верстальщикам до сих пор. Либо возьмите историю битрикса, «исторические хвосты» которой из-за поддержания совместимости платформы не давали системе развиваться. Об этом прямо сказано в описании нового ядра D7 на сайте битрикса:
Принцип совместимости, от которого компания "1С-Битрикс" не имеет права отказаться, обязывал выполнять большой объём работ, не направленных непосредственно на развитие Bitrix Framework. Это прямо влияло на скорость и качество разработки самой платформы, и косвенно влияло на распространение продуктов компании на рынке.
UPD1. Мы для себя выбрали этот путь, пока повсеместность 5.4 не установится. Но когда она установится, все наши проекты, написанные на 5.3 будут работать и на 5.4. И тогда мы уже повысим минимальную планку до 5.4
Чебан Валерий, может я и перегибаю, но вы тогда много на себя берете (как разработчик). В задачи разработчика не входит предсказание будущего на проекта, а разработка функционала заявленного в тз.
Если там будет стоять пункт php 5.3 тогда без вопросов, а если нет, то для меня причины не использовать php 5.5 не понятны.
Тут я с вами категорически не согласен. Рассмотрим пример: вот вы напишите сайт с использованием конструкций PHP 5.5.
А далее отдадите его заказчику, и пусть он сам себе хостинг с 5.5 ищет?
А вы сначала сайт делаете, а потом хостинг ищите? В моей практике такого небыло, все заказчики уже имеют хостинг, ну или покупают на старте.
вот купил заказчик хостинг, там что, сразу 5.5 есть? либо если он купил vds, то кто, по-вашему, должен туда 5.5 установить? если не вы, то кто? и как вы узнаете, какая там версия будет?
к примеру, в веб окружении битрикса на данный момент php 5.3.*, т.е. чтобы использовать 5.5, быстрая установка битрикс-окружения тут не поможет. т.е. нужно отдельно обновлять PHP, либо самому сервер собирать. Кто это будет делать?
а тем временем заказчик ждет сайт...
А вы сначала сайт делаете, а потом хостинг ищите?
а почему нет? либо ждать покупки хостинга и далее выяснять версию PHP еще день?
Еще вот анекдот по теме:
Идут стрельбы. Дали автоматы, патроны, показали куда стрелять. Админ отстрелялся, подводят итоги. Мишень админа чистая. Командир: - ?. Админ, проверяя автомат: - С моей стороны пули вылетели. Проблемы у вас.
Kryachek Mikhail, это понятно. Тут речь о другом, почему не писать код в стиле PHP 5.3? Он ведь корректно работает и на 5.3, и на 5.4, и не возникает вопросов при переносе сайта. Причем трудности - писать в стиле 5.3 - тут нет никакой. А использовать на сайте можно уже будет хоть 5.4 (как у нас на рабочем), так и 5.5. Но при этом если возникнет вдруг необходимость использовать 5.3, то все будет работать как нужно, и переписывать код не придется в тех местах, где использовались "фишки" от верхних версий 5.4 и 5.5. Понимаете?
Т.е. я не призываю не обновлять софт сервера и остановиться на 5.3, я призывают писать в стиле 5.3, т.к. это более универсальный способ при размещении сайта в сети, плюс совместимость. Это нижняя планка, и при написании кода в стиле 5.3 появляется выбор, какую версию установить на сервер. Стоит начать писать в стиле 5.4 - то откатиться на сайте до версии 5.3 не выйдет.
Положа руку на орган, единственное что мне не хватает из плюшек 5.4 и 5.5, это $foo->bar()[0] все остальное прикольно, но пригождается не чаще чем constant('test'.$foo) (который реально пригодился мне раз)
Так что, как и сказал Михаил, важнее производительность, ради которой стоит переходить выше. Но познавательно, спасибо!
Поддержка PHP 5.3 давно прекращена, обновления безопасности не выпускаются. Поддержка PHP 5.5 будет прекращена через 2 месяца http://php.net/supported-versions.php Повод чтобы новая версия битрикса работала начиная с PHP 5.6 И заодно годность хостингов будет проверена.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».