Руководство по PHP7

03afbdd222c64049a7de58f587ebfc92.png

php7-tutorial.com


Цель этого сайта помочь вам обнаружить нововведения в PHP7. Это руководство представляет из себя набор простых упражнений, в которых вам будет предложено что-либо решить, либо исправить ошибку. Каждое упражнение соответствует стандарту RFC (набор технической спецификации и стандартов) и сопровождается кратким пояснениями.

От переводчика


7118e9c6ceee49bd9b364be7f75bf00a.pngВсем привет, с вами Максим Иванов, и сегодня мы поговорим о нововведениях PHP7, о которых более подробно поведает нам Гийом Девар (Guillaume Dievart) в своем руководстве, сделанном в форме упражнений. Но прежде чем начинать, я хочу отметить один момент. Я не буду приводить полное руководство по данному языку программирования в этом обзоре, просто оставлю здесь ссылку на самую свежую и достоверную информацию. Джош Локхарт (автор гайдлайна «PHP: правильный путь», разработчик Slim Framework), написал данную книгу с целью помочь новичкам, по его словам: «В последнее время существует много дискуссий о том, что PHP сообществу и, в целом, программистам не хватает достоверной информации по языку PHP, поэтому мое руководство призвано решить эту проблему». Чем именно? Вы знаете, что по интернету разбросано огромное количество материла по PHP, но многое уже устарело или не приводит к написанию качественного кода. В этой книге присутствуют основные актуальные сведения с ссылками на проверенные ресурсы. Если кому интересно, такое есть и по JavaScript. А теперь вернемся к упражнениям и приступим.

Содержание


  1. Упражнение 1. Измените значение переменной $phpVersion
  2. Упражнение 2. Замените недопустимый тег
  3. Упражнение 3. Замените устаревшую функцию
  4. Упражнение 4. Используйте только __construct ()
  5. Упражнение 5. Удалите лишние конструкции по умолчанию в switch
  6. Упражнение 6. Используйте spaceship-оператор для сортировки массива
  7. Упражнение 7. Используйте оператор объединения
  8. Упражнение 8. Необходимо модифицировать условие после оператора объединения
  9. Упражнение 9. Измените значение $b для правильной работы оператора объединения
  10. Упражнение 10. Сгруппируйте пространства имен с одинаковым префиксом
  11. Упражнение 11. Переименуйте метод, используя новый набор разрешенных ключевых слов
  12. Упражнение 12. Используйте более безопасные функции для генерации случайных чисел
  13. Упражнение 13. Используйте новую функцию preg_replace_callback_array
  14. Упражнение 14. Использовать анонимный класс
  15. Упражнение 15. Укажите тип в аргументах функции
  16. Упражнение 16. Модифицируйте правый операнд условия, чтобы поймать значение ожидаемого типа
  17. Упражнение 17. Используйте строгий режим, чтобы перехватывать ошибки, когда функция получает не тот тип
  18. Упражнение 18. Используйте строгий режим для встроенных функций
  19. Упражнение 19. Директива strict_types должна идти первой строкой
  20. Упражнение 20. Укажите тип возвращаемого значения у функции
  21. Упражнение 21. Исправьте возвращаемый тип у функции, чтобы поймать значение ожидаемого типа
  22. Упражнение 22. Определение унаследованного класса должно возвращать один и тот же тип своего родителя
  23. Упражнение 23. Используйте новую юникод-последовательность для описания символов
  24. Упражнение 24. Разрешается передавать объекты в функцию unserialize ()
  25. Упражнение 25. Включите в генератор другой генератор
  26. Упражнение 26. Воспользуйтесь замыканием функции
  27. Упражнение 27. Вызовите переменную $c из $a
  28. Упражнение 28. Используйте класс Error для обработки ошибок
  29. Упражнение 29. Используйте класс TypeError для обработки ошибок
  30. Упражнение 30. Используйте класс Throwable для обработки ошибок
  31. Упражнение 31. Используйте класс DivisionByZeroError для обработки ошибок
  32. Упражнение 32. Не используйте шестнадцатеричные числа в строках
  33. Упражнение 33. Получите финальное значение генератора №1
  34. Упражнение 34. Получите финальное значение генератора №2
  35. Упражнение 35. Исправьте прототип (интерфейс) функции
  36. Упражнение 36. Создайте группу констант

Песочница


Если вы хотите протестировать некоторые примеры, воспользуйтесь онлайн-интерпретатором.

Упражнение 1. Измените значение переменной $phpVersion, чтобы перейти к следующему упражнению


// результат
No !


Решение


К прочтению:
1. Основные причины, почему пропустили шестую версию и перешли к седьмой
2. Оператор вывода строки на экран
3. Тернарный (условный) оператор
4. Что такое мажорная и минорная версии?

Упражнение 2. Замените недопустимый тег


// результат
syntax error, unexpected '%', expecting end of file on line 1


Решение


К прочтению:
1. Какие альтернативные PHP-теги были удалены, а какие оставлены?

Упражнение 3. Функция ereg_replace является устаревшей, замените ее на preg_replace


// результат
Uncaught Error: Call to undefined function ereg_replace() in /tmp/__hoa_6b3Hmf:3
Stack trace:
#0 /tmp/__hoa_f8PIGz(52): require()
#1 {main}
  thrown on line 3


Решение


К прочтению:
1. Устаревшие расширения
2. Регулярные выражения в PHP
3. Поиск и замена по регулярному выражению
4. Шаблоны
5. Производительность

Упражнение 4. PHP4 конструкторы признаны устаревшими, используйте __construct


// результат
Methods with the same name as their class will not be constructors in a future version of PHP; Foo has a deprecated constructor on line 3


Решение


К прочтению:
1. Устаревший конструктор
2. Конструктор (объектно-ориентированное программирование)
3. Для чего нужны классы?
4. Зачем нужен ООП?
5. Объектно-ориентированное программирование
6. Основы ООП в PHP
7. Перестаньте писать классы
8. Плюсы и минусы объектно-ориентированного программирования

Упражнение 5. Множественные конструкции по умолчанию в операторе switch теперь запрещены, удалите первый


// результат
Switch statements may only contain one default clause on line 7


Решение


К прочтению:
1. Почему возникает синтаксическая ошибка в определении нескольких случаев по умолчанию в операторе switch?
2. Оператор switch

Упражнение 6. Используйте spaceship-оператор (<=>) для сортировки массива по первому символу


// результат
Pierre


Решение
 $b;
});

echo current($users);

// результат
Next step !


К прочтению:
1. Новый оператор
2. Что это за оператор shaceship <=>?
3. usort — сортирует массив по значениям, используя пользовательскую функцию для сравнения элементов
4. Внутренний указатель

Упражнение 7. Используйте оператор объединения со значением NULL (?)


// результат
Undefined index: query on line 3


Решение


К прочтению:
1. Новый оператор
2. Null coalescing operator
3. Simple PHP isset test
4. isset () vs empty () vs is_null ()

Упражнение 8. Оператор объединения со значением NULL (?) не проверяет значение в определенных случаях, измените правый операнд в условии


// результат


Решение


К прочтению:
1. Частный случай

Упражнение 9. Оператор объединения со значением NULL (?) не проверяет значение в определенных случаях, измените значение $b


// результат


Решение


К прочтению:
1. Пример работы оператора

Упражнение 10. Можно сгруппировать пространства имен с одинаковым префиксом. Сгруппируйте их в примере.


// результат
Next step !


Решение


К прочтению:
1. Пространство имён (программирование)
2. Обзор пространств имен
3. Пространства имен в PHP, разъяснение
4. Пространства имен в PHP
5. Краткое введение в PHP Пространства имен

Упражнение 11. Некоторые ключевые слова разрешено теперь использовать в названиях методов (list, foreach, new, …)

list();

// результат
Uncaught Error: Call to undefined method Foo::list() in /tmp/__hoa_FmqgZ0:12
Stack trace:
#0 /tmp/__hoa_LbZpe8(52): require()
#1 {main}
  thrown on line 12


Решение
list();

// результат
Next step !


К прочтению:
1. Ключевые слова

Упражнение 12. Используйте более безопасные функции для генерации случайных чисел


// результат
5


Решение


К прочтению:
1. Криптографически безопасная функция для получения псевдослучайных целых чисел
2. В чем недостаток mt_rand?
3. Разница между mt_rand () и rand ()

Упражнение 13. Используйте новую функцию preg_replace_callback_array


// результат
Next step !


Решение
 function() { return "Ko !"; },
        "/PHP7/" => function() { return "Next step !"; },
    ),
    'PHP7'
);


// результат
Next step !


К прочтению:
1. Поиск по регулярному выражению и замена с использованием функции обратного вызова
2. Работа с preg_replace_callback_array

Упражнение 14. Теперь можно создавать анонимные классы. Использовать анонимный класс вместо MyMessage

getText();
    }
}

interface Message
{
    public function getText();
}

class MyMessage implements Message
{
    public function getText() { return "Next step !"; }
}

Logger::write(new MyMessage());


// результат
Next step !


Решение
getText();
    }
}

interface Message
{
    public function getText();
}

$message = (new class() implements Message {
    public function getText() { return "Next step !"; }
});

Logger::write($message);


// результат
Next step !


К прочтению:
1. Интерфейсы объектов
2. В чем смысл интерфейсов в PHP?
3. Абстрактные классы
4. Абстрактные классы и интерфейсы в PHP

Упражнение 15. Добавьте тип int к аргументам функции add


// результат


Решение


К прочтению:
1. Тип данных
2. Введение в типы данных PHP
3. На сегодняшний день, использование скалярных и смешанных типов данных в PHP7 не повышает производительности

Упражнение 16. По умолчанию PHP отливает значение ожидаемого типа. Модифицируйте правый операнд условия


// результат


Решение


К прочтению:
1. Инициализация скалярных типов в PHP7

Упражнение 17. Используйте строгий режим, если хотите перехватывать ошибки, в случае когда функция получает не тот тип, который ожидает. Исправьте на float.


// результат
Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given, called in /tmp/__hoa_FKwVHc on line 10 and defined in /tmp/__hoa_FKwVHc:5
Stack trace:
#0 /tmp/__hoa_FKwVHc(10): add(5.5, 5.5)
#1 /tmp/__hoa_rejBtd(52): require('/tmp/__hoa_FKwV...')
#2 {main}
  thrown on line 5


Решение


К прочтению:
1. Манипуляции с типами данных
2. Установка директив
3. Контроль типа
4. Встроенные директивы

Упражнение 18. Используйте строгий режим для встроенных функций


// результат
Uncaught TypeError: strlen() expects parameter 1 to be string, integer given in /tmp/__hoa_0HYwi9:3
Stack trace:
#0 /tmp/__hoa_CjotyX(52): require()
#1 {main}
  thrown on line 3


Решение


К прочтению:
1. Справочник стандартных функций
2. Встроенные функции в PHP
3. Встроенные расширения PHP
4. Стандартная библиотека PHP (SPL)

Упражнение 19. Директива strict_types должна идти первой строкой


// результат
strict_types declaration must be the very first statement in the script on line 5


Решение


К прочтению:
1. declare используется для установки директив исполнения для блока кода

Упражнение 20. Теперь можно указать тип возвращаемого значения у функции или метода. Укажите тип возвращаемого значения у функции


// результат
Uncaught TypeError: Return value of reverse() must be an instance of type, string returned in /tmp/__hoa_ZcQkYd:5
Stack trace:
#0 /tmp/__hoa_ZcQkYd(8): reverse('! pets txeN')
#1 /tmp/__hoa_7JLJ4t(52): require('/tmp/__hoa_ZcQk...')
#2 {main}
  thrown on line 5


Решение


К прочтению:
1. Возврат значений
2. Какая разница между возвращаемым и не возвращаемым значением в PHP?
3. Выигрываем ли мы в производительности, если подсказываем функции ожидаемый тип в PHP?
4. Существуют ли правила для возвращаемого значения у пользовательской булевской функции?

Упражнение 21. По умолчанию, PHP выбросит ожидаемый тип. Исправьте возвращаемый тип у функции


// результат


Решение


К прочтению:
1. Возвращение по ссылке
2. Руководство по работе со ссылками

Упражнение 22. Определение унаследованного класса должно возвращать один и тот же тип своего родителя


// результат
Declaration of B::foo(): ChildB must be compatible with A::foo(): Child on line 17


Решение


К прочтению:
1. Немного о наследовании и о переопределении методов, чем о полиморфизме
2. Что такое полиморфизм на самом деле. В PHP он тоже существует
2. Когда подтип перекрывает родительский метод, то тип возвращаемого дочернего метода должен точно соответствовать родительскому
4. Отличный образовательный курс по изучению ООП на PHP

Упражнение 23. Теперь можно использовать юникод-последовательность для описания символов


// результат


Решение


К прочтению:
1. Юникод
2. Символов Unicode в PHP строке
3. Поддержка юникод управляющих (escape-) последовательностей

Упражнение 24. Была добавлена новая опция в стандартную функцию unserialize (), теперь разрешается указывать классы. Укажите класс в функции unserialize ()

 ['']]
);

if($myClass instanceOf MyCLass) {
    echo "Next step !";
}

// результат


Решение
 ['MyClass']]
);

if($myClass instanceOf MyCLass) {
    echo "Next step !";
}

// результат
Next step !


К прочтению:
1. unserialize
2. Как использовать в PHP serialize () и unserialize ()?
3. Оператор проверки типа

Упражнение 25. Делегирование генераторов позволяет вернуть другую итерабельную структуру — будь то объект, массив, итератор или другой генератор. Включите в генератор другой генератор


// результат
1 2


Решение


К прочтению:
1. Поддержка генераторов и сопрограмм: суть генератора в том, что это функция, которая возвращает не просто одно значение, а последовательность значений
2. Генераторы в действии
3. Экономим память с помощью генераторов
4. Делегирование генераторов
5. Про утечку ресурсов в генераторах PHP

Упражнение 26. Вы можете использовать замыкания у функций. Новый интерпретатор работает слева направо


// результат


Решение


К прочтению:
1. Анонимная функция (лямбда-функция)
2. Анонимные функции (замыкания) в PHP: не стоит путать с замыканиями в JavaScript
3. Применение замыканий в PHP

Упражнение 27. Исправьте синтаксис, чтобы вызвать переменную $c из $a

 'c'];
$c = 'Next step !';

// Этот код выведет Next step ! в PHP5
echo $$a['b'];


// результат
Undefined variable: Array on line 7


Решение
 'c'];
$c = 'Next step !';

echo ${$a['b']};
// результат
Next step !


К прочтению:
1. Универсальный синтаксис

Упражнение 28. Теперь, чтобы поймать исключение необходимо использовать класс Error


// результат
Uncaught Error: Call to undefined function undefinedFunction() in /tmp/__hoa_PaBzqc:4
Stack trace:
#0 /tmp/__hoa_SQZOZG(52): require()
#1 {main}
  thrown on line 4


Решение


К прочтению:
1. Обработка исключений
2. Зачем нужна обработка исключений?
3. Исключения в PHP
4. Throwable exception и ошибки в php7

Упражнение 29. Можно использовать также класс TypeError для обработки исключений


// результат
Uncaught TypeError: Argument 1 passed to add() must be of the type integer, string given, called in /tmp/__hoa_FvS6wW on line 12 and defined in /tmp/__hoa_FvS6wW:5
Stack trace:
#0 /tmp/__hoa_FvS6wW(12): add('1', '1')
#1 /tmp/__hoa_kfhSdT(52): require('/tmp/__hoa_FvS6...')
#2 {main}
  thrown on line 5


Решение


К прочтению:
1. Виды исключений в PHP

Упражнение 30. Используйте Throwable, чтобы отлавливать исключения и ошибки (общий интерфейс Errors, Exceptions)


// результат
Undefined offset: -1 on line 55


Решение


К прочтению:
1. Исключение!= ошибка
2. Использование Throwable
3. Пример деления на ноль

Упражнение 31. Используйте DivisionByZeroError при делении на ноль


// результат
Uncaught DivisionByZeroError: Modulo by zero in /tmp/__hoa_46SBwZ:5
Stack trace:
#0 /tmp/__hoa_UQ8f3n(52): require()
#1 {main}
  thrown on line 5


Решение


К прочтению:
1. DivisionByZeroError

Упражнение 32. Не используйте шестнадцатеричные числа в строках


// результат


Решение


К прочтению:
1. Приведение типов в PHP == табурет о двух ножках?
2. Приведение типа
3. Удалена поддержка шестнадцатеричных чисел в строках

Упражнение 33. Явный возврат финального значения генератора позволяет обрабатывать значение непосредственно в коде, вызывающем генератор

callReturn() === true) {
    echo "Next step !";
}


// результат
Uncaught Error: Call to undefined method Generator::callReturn() in /tmp/__hoa_eOhq2B:14
Stack trace:
#0 /tmp/__hoa_sa29ov(52): require()
#1 {main}
  thrown on line 14


Решение
getReturn() === true) {
    echo "Next step !";
}

// результат
Next step !


К прочтению:
1. Возврат финального значения

Упражнение 34. Невозможно получить финальное значение, если внутренний указатель не указывает на него

next();

echo $generator->getReturn();

// результат
// caught: Cannot get return value of a generator that hasn't returned


Решение
next();
$generator->next();

echo $generator->getReturn();

// результат
Next step !


К прочтению:
1. Как сказать по-русски слово yield???

Упражнение 35. Вы не можете использовать одинаковые названия аргументов в прототипе функции


// результат
Redefinition of parameter $a on line 4


Решение


К прочтению:
1. Аргументы функции

Упражнение 36. Теперь можно создать массив (группу) констант

 'root',
    'password' => 'my_password',
    'step' => 'Next step !'
];

// определите CONFIGURATION как константу

echo CONFIGURATION['step'];


// результат
/*
 * 
* Warning: Illegal string offset 'step' in /tmp/__hoa_dBF385 on line 11
*/


Решение
 'root',
    'password' => 'my_password',
    'step' => 'Next step !'
];

define('CONFIGURATION', $conf);

echo CONFIGURATION['step'];

// результат
Next step !


К прочтению:
1. Константы
2. «Волшебные» константы
3. define () vs const

© Habrahabr.ru