Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Новые возможности в PHP 5.5
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Приветствую,
Вчера, 20 июня, вышел релиз php 5.5
Эта версия, как и 5.4 в своё время, добавила некоторые важные возможности, некоторые из которых я опишу здесь. Конечно, всё это есть в руководстве в том или ином виде, да и на том же habrahabr при желании можно найти статьи. Но всё же опишу то, что актуально в новой версии.
Итак, в PHP 5.5: Появилась возможность разыменовывать строковые литералы и массивы напрямую
- в принципе, ничего полезного этим не добавлено ввиду наличия константы __CLASS__
Добавлен блок finally
Этот синтаксис позволяет определить блок кода, который будет исполнен независимо от того, возникало ли исключение. Полезно, если, например, нужно в конечном итоге всегда закрыть соединение/файл:
Любопытно, но на момент написания этого комментария слово finally ещё не распознаётся подсветкой кода на самом php.net
Yield (генераторы)
Это не совсем очевидная вещь - но на деле очень простая. Генератор - это функция-итератор, которая по сути повторяет интерфейс Iterator. Вместо того, чтобы возвращать значение, такая функция генерирует его для текущего итератора. В мануале есть хороший пример для функции range. Преимущество генератора в том, что в памяти хранится лишь текущее значение, но не весь массив. Я модифицировал пример из мануала, чтобы показать, что происходит внутри генератора:
- то есть я просто добавил вывод переменной перед её "генерацией". Ключевое слово yield здесь заменяет return и сообщает, что мы хотим генерировать значение как функция-итератор, но не возвращать его. Результат будет таким:
- как видно, функция-генератор не исполняет цикл внутри себя, а использует его для генерации следующего значения. Откуда же берётся "следующее"? (То есть как функция понимает, какое текущее и, соответственно как генерировать это самое следующее)? Ответ очевиден - из блока, в котором содержится yield. Именно там мы указали, что именно мы желаем "yield" (сгенерировать). А сгенерировать мы желаем $i - именно это и будет счётчиком. А управляет им foreach, указанный при использовании генератора.
Это пока всё, с чем я успел поэкспериментировать, если возникнут вопросы или дополнения (в том числе и по тем нововведениям, что я не затронул) - предлагаю обсудить в этой теме.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DlTA
Отправлено: 21 Июня, 2013 - 12:15:29
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
интересно а будет ли когда нить добавлен для итераторов индексный доступ, как к массиву
$item = new newIteraor();
$item[10];
$item[5];
$item[20];
а то foreach это хорошо но как то мало
EuGen
Отправлено: 21 Июня, 2013 - 12:29:36
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
DlTA пишет:
интересно а будет ли когда нить добавлен для итераторов индексный доступ, как к массиву
Вопрос интересный, но неоднозначный. Дело тут в том, что легко спутать понятие "индекс массива" и "индекс итератора". Первое - есть по сути просто именованный указатель, тогда как второе - это порядковый номер последовательности, и, значит, должен быть натуральным числом (возможно, нулём). Поэтому обращение к итератору через индекс не до конца корректно - ведь индексом можно указать и строку, содержащую что угодно. Вероятно, это можно отслеживать, но на первый взгляд это создаёт больше проблем, чем решает. К тому же для вычисления N-го члена последовательности нужно выполнить генератор N раз (ведь он не хранит данные, а генерирует их), что, в случае сложного устройства последнего, может привести к медленной работе.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DelphinPRO
Отправлено: 21 Июня, 2013 - 12:57:49
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
EuGen пишет:
Определение имени класса через ::class
- позволяет определять полный путь с учётом пространств имён, через слово class.
...
- в принципе, ничего полезного этим не добавлено ввиду наличия константы __CLASS__
Константа __CLASS__ содержит в себе имя класса в котором она прописана. А если нам нужно получить имя унаследованного класса приходится использовать функцию get_class();
а как ведет себя ::class в этом случае?
пример
could not extract the package.xml file from "/tmp/pear/download/ssh2-0.12.tgz"
Download of "pecl/ssh2" succeeded, but it is not a valid package archive
Error: cannot download "pecl/ssh2"
Download failed
install failed
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
caballero
Отправлено: 25 Июня, 2013 - 12:55:28
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
finally как я понял добавили
в других языках вещь необходимая но в PHP где контекст страницы все равно разрушается по окончании обработки оной - полезность тоже сомнительная
И посмотрите, что загрузилось. Похоже, что-то не то там.
----- PostgreSQL DBA
EuGen
Отправлено: 25 Июня, 2013 - 15:42:17
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Мелкий
Собрать - не проблема. Через phpize и ручную сборку всё в порядке (то есть скачать напрямую и потом собрать). Почему стандартный способ сборки отказывает - вот в чём вопрос. Вы пробовали собрать командой по-умолчанию? Скачалось, распаковалось, установилось?
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Мелкий
Отправлено: 25 Июня, 2013 - 15:46:11
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Не уточнил, да - это стандартным pecl'ом и ставил:
Running on: Linux debiansid 3.2.0-4-686-pae #1 SMP Debian 3.2.46-1 i686
----- PostgreSQL DBA
EuGen
Отправлено: 25 Июня, 2013 - 17:22:15
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Мелкий
Не очень понял, каким образом должно помочь pecl download (это именно работающая часть). Собственно, скачать удаётся, однако же установка не происходит. На bugs.php.net существует скудная информация - по поводу такой проблемы в альфа-версии 5.5
В любом случае - благодарю за тест, так стало ясно, что проблема не на pecl-репозитории в целом.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Мелкий
Отправлено: 25 Июня, 2013 - 17:35:42
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
EuGen пишет:
Не очень понял, каким образом должно помочь pecl download (это именно работающая часть).
Посмотреть, что именно скачалось, распаковывается ли, что в xml'ке.
Проблема-то на уровне распаковки и валидации описания пакета.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.