- PVSM.RU - https://www.pvsm.ru -

Цель этого сайта [1] помочь вам обнаружить нововведения в PHP7. Это руководство представляет из себя набор простых упражнений, в которых вам будет предложено что-либо решить, либо исправить ошибку. Каждое упражнение соответствует стандарту RFC [2] (набор технической спецификации и стандартов) и сопровождается кратким пояснениями.
Всем привет, с вами Максим Иванов, и сегодня мы поговорим о нововведениях PHP7, о которых более подробно поведает нам Гийом Девар [3] (Guillaume Dievart) в своем руководстве, сделанном в форме упражнений. Но прежде чем начинать, я хочу отметить один момент. Я не буду приводить полное руководство по данному языку программирования в этом обзоре, просто оставлю здесь ссылку [4] на самую свежую и достоверную информацию. Джош Локхарт [5] (автор гайдлайна «PHP: правильный путь», разработчик Slim Framework), написал данную книгу с целью помочь новичкам, по его словам: «В последнее время существует много дискуссий о том, что PHP сообществу и, в целом, программистам не хватает достоверной информации по языку PHP, поэтому мое руководство призвано решить эту проблему». Чем именно? Вы знаете, что по интернету разбросано огромное количество материла по PHP, но многое уже устарело или не приводит к написанию качественного кода. В этой книге присутствуют основные актуальные сведения с ссылками на проверенные ресурсы. Если кому интересно, такое есть и по JavaScript [6]. А теперь вернемся к упражнениям и приступим.
Если вы хотите протестировать некоторые примеры, воспользуйтесь онлайн-интерпретатором [43].
<?php
$phpVersion = 6;
echo PHP_MAJOR_VERSION === $phpVersion ? "Next step !" : "No !";
// результат
No !
<?php
$phpVersion = 7;
echo PHP_MAJOR_VERSION === $phpVersion ? "Next step !" : "No !";
// результат
Next step !
1. Основные причины, почему пропустили шестую версию и перешли к седьмой [44]
2. Оператор вывода строки на экран [45]
3. Тернарный (условный) оператор [46]
4. Что такое мажорная и минорная версии? [47]
<?%
echo "Next step !";
// результат
syntax error, unexpected '%', expecting end of file on line 1
<?php
echo "Next step !";
// результат
Next step !
1. Какие альтернативные PHP-теги были удалены, а какие оставлены? [48]
<?php
if (ereg_replace("PHP([3-6])", "PHP7", "PHP6")) {
echo "Next step !";
}
// результат
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
<?php
if (preg_replace("/PHP([3-6])/", "PHP7", "PHP6")) {
echo "Next step !";
}
// результат
Next step !
1. Устаревшие расширения [49]
2. Регулярные выражения в PHP [50]
3. Поиск и замена по регулярному выражению [51]
4. Шаблоны [52]
5. Производительность [53]
<?php
class Foo
{
public function foo()
{
}
}
echo "Next step !";
// результат
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
<?php
class Foo
{
public function __construct()
{
}
}
echo "Next step !";
// результат
Next step !
1. Устаревший конструктор [54]
2. Конструктор (объектно-ориентированное программирование) [55]
3. Для чего нужны классы? [56]
4. Зачем нужен ООП? [57]
5. Объектно-ориентированное программирование [58]
6. Основы ООП в PHP [59]
7. Перестаньте писать классы [60]
8. Плюсы и минусы объектно-ориентированного программирования [61]
<?php
switch ('') {
default:
echo "Doesn't pass here ...";
break;
default:
echo "Next step !";
}
// результат
Switch statements may only contain one default clause on line 7
<?php
switch ('') {
default:
echo "Next step !";
}
// результат
Next step !
1. Почему возникает синтаксическая ошибка в определении нескольких случаев по умолчанию в операторе switch? [62]
2. Оператор switch [63]
<?php
$users = ['Pierre', 'Paul', 'Next step !'];
usort($users, function ($a, $b) {
});
echo current($users);
// результат
Pierre
<?php
$users = ['Pierre', 'Paul', 'Next step !'];
usort($users, function ($a, $b) {
return $a <=> $b;
});
echo current($users);
// результат
Next step !
1. Новый оператор [64]
2. Что это за оператор shaceship <=>? [65]
3. usort — сортирует массив по значениям, используя пользовательскую функцию для сравнения элементов [66]
4. Внутренний указатель [67]
<?php
echo $_GET['query'] ? $_GET['query'] : "Next step !";
// результат
Undefined index: query on line 3
<?php
echo $_GET['query'] ?? "Next step !";
// результат
Next step !
1. Новый оператор [68]
2. Null coalescing operator [69]
3. Simple PHP isset test [70]
4. isset() vs empty() vs is_null() [71]
<?php
$_GET['title'] = false; // если убрать эту строчку, тогда условие сработает
$query = $_GET['title'] ?? '*'; // true
// вам необходимо модифицировать условие
if($query === '*') {
echo "Next step !";
}
// результат
<?php
$_GET['title'] = false;
$query = $_GET['title'] ?? '*';
if($query === false) {
echo "Next step !";
}
// результат
Next step !
1. Частный случай [72]
<?php
$b = false;
echo $a ?? $b ?? "Next step !";
// результат
<?php
$b = null;
echo $a ?? $b ?? "Next step !";
// результат
Next step !
1. Пример работы оператора [73]
<?php
use FooBarEmail;
use FooBarPhone;
use FooBarAddressCode;
use FooBarAddressNumber;
echo "Next step !";
// результат
Next step !
<?php
use FooBar{
Email,
Phone,
AddressCode,
AddressNumber
};
echo "Next step !";
// результат
Next step !
1. Пространство имён (программирование) [74]
2. Обзор пространств имен [75]
3. Пространства имен в PHP, разъяснение [76]
4. Пространства имен в PHP [77]
5. Краткое введение в PHP Пространства имен [78]
<?php
class Foo
{
// Переименуйте метод
public function getList()
{
return "Next step !";
}
}
echo (new Foo)->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
<?php
class Foo
{
public function list()
{
return "Next step !";
}
}
echo (new Foo)->list();
// результат
Next step !
1. Ключевые слова [79]
<?php
$randomInt = mt_rand(0, 42);
echo $randomInt;
// результат
5
<?php
$randomInt = random_int(0, 42);
echo $randomInt;
// результат
1
1. Криптографически безопасная функция для получения псевдослучайных целых чисел [80]
2. В чем недостаток mt_rand? [81]
3. Разница между mt_rand() и rand() [82]
<?php
// Use preg_replace_callback_array instead of preg_replace_callback
echo preg_replace_callback(
array(
"/PHP6/",
"/PHP7/"
),
function($matches) {
if(strpos($matches[0], 'PHP6') === 0) {
return 'Ko !';
} else {
return "Next step !";
}
},
'PHP7'
);
// результат
Next step !
<?php
// preg_replace_callback_array вместо preg_replace_callback
echo preg_replace_callback_array(
array(
"/PHP6/" => function() { return "Ko !"; },
"/PHP7/" => function() { return "Next step !"; },
),
'PHP7'
);
// результат
Next step !
1. Поиск по регулярному выражению и замена с использованием функции обратного вызова [83]
2. Работа с preg_replace_callback_array [84]
<?php
class Logger
{
public static function write(Message $message)
{
echo $message->getText();
}
}
interface Message
{
public function getText();
}
class MyMessage implements Message
{
public function getText() { return "Next step !"; }
}
Logger::write(new MyMessage());
// результат
Next step !
<?php
class Logger
{
public static function write(Message $message)
{
echo $message->getText();
}
}
interface Message
{
public function getText();
}
$message = (new class() implements Message {
public function getText() { return "Next step !"; }
});
Logger::write($message);
// результат
Next step !
1. Интерфейсы объектов [85]
2. В чем смысл интерфейсов в PHP? [83]
3. Абстрактные классы [86]
4. Абстрактные классы и интерфейсы в PHP [87]
<?php
function add($a, $b)
{
return $a + $b;
}
if(add(5.5, 5) === 10) {
echo "Next step !";
}
// результат
<?php
function add(int $a, int $b)
{
return $a + $b;
}
if(add(5.5, 5) === 10) {
echo "Next step !";
}
// результат
Next step !
1. Тип данных [88]
2. Введение в типы данных PHP [89]
3. На сегодняшний день, использование скалярных и смешанных типов данных в PHP7 не повышает производительности [83]
<?php
function add(int $a, int $b)
{
return $a + $b;
}
// Модифицируйте правый операнд
if(add(5.5, 5.5) === 11) {
echo "Next step !";
}
// результат
<?php
function add(int $a, int $b)
{
return $a + $b;
}
if(add(5.5, 5.5) === 10) {
echo "Next step !";
}
// результат
Next step !
1. Инициализация скалярных типов в PHP7 [90]
<?php
declare(strict_types = 1);
function add(int $a, int $b)
{
return (int)($a + $b);
}
if(add(5.5, 5.5) === 11) {
echo "Next step !";
}
// результат
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
<?php
declare(strict_types = 1);
function add(float $a, float $b)
{
return (int)($a + $b);
}
if(add(5.5, 5.5) === 11) {
echo "Next step !";
}
// результат
Next step !
1. Манипуляции с типами данных [91]
2. Установка директив [92]
3. Контроль типа [93]
4. Встроенные директивы [93]
<?php
declare(strict_types = 1);
strlen(42);
echo "Next step !";
// результат
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
<?php
declare(strict_types = 1);
strlen('42');
echo "Next step !";
// результат
Next step !
1. Справочник стандартных функций [94]
2. Встроенные функции в PHP [95]
3. Встроенные расширения PHP [96]
4. Стандартная библиотека PHP (SPL) [97]
<?php
echo "Next step !";
declare(strict_types = 1);
// результат
strict_types declaration must be the very first statement in the script on line 5
<?php
declare(strict_types = 1);
echo "Next step !";
// результат
Next step !
1. declare используется для установки директив исполнения для блока кода [98]
<?php
function reverse(string $string): type
{
return strrev($string);
}
echo reverse("! pets txeN");
// результат
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
<?php
function reverse(string $string): string
{
return strrev($string);
}
echo reverse("! pets txeN");
echo "Next step !";
// результат
Next step !
1. Возврат значений [99]
2. Какая разница между возвращаемым и не возвращаемым значением в PHP? [100]
3. Выигрываем ли мы в производительности, если подсказываем функции ожидаемый тип в PHP? [101]
4. Существуют ли правила для возвращаемого значения у пользовательской булевской функции? [102]
<?php
// Пример: function foo(): int { return 5.5; } echo foo(); // 5
function add(float $a, float $b): int
{
return $a + $b;
}
// Модифицируйте правый операнд
if(add(5.3, 5.3) === 10.6) {
echo 'Next step !';
}
// результат
<?php
function add(float $a, float $b): int
{
return $a + $b;
}
// Modify the right operand.
if(add(5.3, 5.3) === 10) {
echo 'Next step !';
}
// результат
Next step !
1. Возвращение по ссылке [103]
2. Руководство по работе со ссылками [104]
<?php
class Child {}
class ChildB extends Child {}
abstract class A
{
abstract public function foo(): Child;
}
class B extends A
{
public function foo(): ChildB
{
return new ChildB;
}
}
echo "Next step !";
// результат
Declaration of B::foo(): ChildB must be compatible with A::foo(): Child on line 17
<?php
class Child {}
class ChildB extends Child {}
abstract class A
{
abstract public function foo(): Child;
}
class B extends A
{
public function foo(): Child
{
return new ChildB;
}
}
echo "Next step !";
// результат
Next step !
1. Немного о наследовании и о переопределении методов, чем о полиморфизме [105]
2. Что такое полиморфизм на самом деле. В PHP он тоже существует [106]
2. Когда подтип перекрывает родительский метод, то тип возвращаемого дочернего метода должен точно соответствовать родительскому [107]
4. Отличный образовательный курс по изучению ООП на PHP [108]
<?php
// Модифицируйте левый операнд
if("?{26C4}" === '') {
echo "Next step !";
}
// результат
<?php
// Modify the left operand.
if("u{26C4}" === '') {
echo "Next step !";
}
// результат
Next step !
1. Юникод [109]
2. Символов Unicode в PHP строке [110]
3. Поддержка юникод управляющих (escape-) последовательностей [111]
<?php
class MyClass { }
$myClassSerialized = serialize(new MyClass());
$myClass = unserialize(
$myClassSerialized,
["allowed_classes" => ['']]
);
if($myClass instanceOf MyCLass) {
echo "Next step !";
}
// результат
<?php
class MyClass { }
$myClassSerialized = serialize(new MyClass());
$myClass = unserialize(
$myClassSerialized,
["allowed_classes" => ['MyClass']]
);
if($myClass instanceOf MyCLass) {
echo "Next step !";
}
// результат
Next step !
1. unserialize [112]
2. Как использовать в PHP serialize() и unserialize( )? [113]
3. Оператор проверки типа [114]
<?php
function generator()
{
yield 1; // 'yield' означает «вернуть значение и продолжить с этого места при следующем вызове функции
yield 2;
// включите в генератор другой генератор
}
function subGenerator()
{
yield 3;
yield 4;
yield "Next step !";
}
$generator = generator();
foreach($generator as $value) {
echo $value.PHP_EOL;
}
// результат
1 2
<?php
function generator()
{
yield 1;
yield 2;
yield from subGenerator();
}
function subGenerator()
{
yield 3;
yield 4;
yield "Next step !";
}
$generator = generator();
foreach($generator as $value) {
echo $value.PHP_EOL;
}
// результат
1 2 3 4 Next step !
1. Поддержка генераторов и сопрограмм: суть генератора в том, что это функция, которая возвращает не просто одно значение, а последовательность значений [113]
2. Генераторы в действии [115]
3. Экономим память с помощью генераторов [116]
4. Делегирование генераторов [117]
5. Про утечку ресурсов в генераторах PHP [118]
<?php
function foo()
{
return function() { echo "Next step !"; };
}
// Воспользуйтесь замыканием функции foo в этой строке
// результат
<?php
function foo()
{
return function() { echo "Next step !"; };
}
// или: $foo = foo(); $foo();
foo()();
// результат
Next step !
1. Анонимная функция (лямбда-функция) [119]
2. Анонимные функции (замыкания) в PHP: не стоит путать с замыканиями в JavaScript [120]
3. Применение замыканий в PHP [121]
<?php
$a = ['b' => 'c'];
$c = 'Next step !';
// Этот код выведет Next step ! в PHP5
echo $$a['b'];
// результат
Undefined variable: Array on line 7
<?php
$a = ['b' => 'c'];
$c = 'Next step !';
echo ${$a['b']};
// результат
Next step !
1. Универсальный синтаксис [122]
<?php
try { // Принудительно вызываем ошибку
undefinedFunction();
} catch(Exception $e) {
echo "Next step !";
}
// результат
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
<?php
try {
undefinedFunction();
} catch(Error $e) {
echo "Next step !";
}
// результат
Next step !
1. Обработка исключений [123]
2. Зачем нужна обработка исключений? [124]
3. Исключения в PHP [125]
4. Throwable exception и ошибки в php7 [126]
<?php
declare(strict_types = 1);
function add(int $a, int $b): int
{
return $a + $b;
}
// Catch the TypeError
try {
echo add('1', '1');
} catch(Exception $e) {
echo "Next step !";
}
// результат
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
<?php
declare(strict_types = 1);
function add(int $a, int $b): int
{
return $a + $b;
}
// Catch the TypeError
try {
echo add('1', '1');
} catch(TypeError $e) {
echo "Next step !";
}
// результат
Next step !
1. Виды исключений в PHP [127]
<?php
// исправьте неверный класс CallErrorAndException
try {
if(random_int(0, 1) === 1) {
throw new Exception('');
}
undefined();
} catch(CallErrorAndException $e) {
echo "Next step !";
}
// результат
Undefined offset: -1 on line 55
<?php
try {
if(random_int(0, 1) === 1) {
throw new Exception('');
}
undefined();
} catch(Throwable $e) {
echo "Next step !";
}
// результат
Next step !
1. Исключение != ошибка [128]
2. Использование Throwable [129]
3. Пример деления на ноль [130]
<?php
try {
10 % 0;
} catch(CatchError $e) {
echo "Next step !";
}
// результат
Uncaught DivisionByZeroError: Modulo by zero in /tmp/__hoa_46SBwZ:5
Stack trace:
#0 /tmp/__hoa_UQ8f3n(52): require()
#1 {main}
thrown on line 5
<?php
try {
10 % 0;
} catch(DivisionByZeroError $e) {
echo "Next step !";
}
// результат
Next step !
1. DivisionByZeroError [131]
<?php
// var_dump(12 == "0xC"); // true в PHP5
// var_dump(12 == "0xC"); // false в PHP7
// Исправьте левый операнд
if('0x2A' == 42) {
echo "Next step !";
}
// результат
<?php
if(0x2A == 42) {
echo "Next step !";
}
// результат
Next step !
1. Приведение типов в PHP == табурет о двух ножках? [132]
2. Приведение типа [133]
3. Удалена поддержка шестнадцатеричных чисел в строках [134]
<?php
// используйте Generator::getReturn() для возврата финального значения
function generator()
{
yield 21;
yield 21;
return true;
}
$generator = generator();
foreach($generator as $number) { }
if($generator->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
<?php
function generator()
{
yield 21;
yield 21;
return true;
}
$generator = generator();
foreach($generator as $number) { }
if($generator->getReturn() === true) {
echo "Next step !";
}
// результат
Next step !
1. Возврат финального значения [135]
<?php
function generator()
{
yield 21;
yield 21;
return "Next step !";
}
$generator = generator();
$generator->next();
echo $generator->getReturn();
// результат
// caught: Cannot get return value of a generator that hasn't returned
<?php
function generator()
{
yield 21;
yield 21;
return "Next step !";
}
$generator = generator();
$generator->next();
$generator->next();
echo $generator->getReturn();
// результат
Next step !
1. Как сказать по-русски слово yield??? [136]
<?php
function foo($a, $a)
{
return $a;
}
echo foo("Next ", "step !"); // В PHP5: step !
// результат
Redefinition of parameter $a on line 4
<?php
function foo($a, $b)
{
return $a . $b;
}
echo foo("Next ", "step !");
// результат
Next step !
1. Аргументы функции [137]
<?php
$conf = [
'user' => 'root',
'password' => 'my_password',
'step' => 'Next step !'
];
// определите CONFIGURATION как константу
echo CONFIGURATION['step'];
// результат
/*
* <br />
* <b>Warning</b>: Illegal string offset 'step' in <b>/tmp/__hoa_dBF385</b> on line <b>11</b><br />
*/
<?php
$conf = [
'user' => 'root',
'password' => 'my_password',
'step' => 'Next step !'
];
define('CONFIGURATION', $conf);
echo CONFIGURATION['step'];
// результат
Next step !
1. Константы [138]
2. «Волшебные» константы [139]
3. define() vs const [140]
Автор: splincodewd
Источник [141]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/tutorial/130779
Ссылки в тексте:
[1] сайта: http://php7-tutorial.com/
[2] RFC : https://ru.wikipedia.org/wiki/RFC
[3] Гийом Девар: https://twitter.com/guillaumDievart
[4] ссылку: http://www.phptherightway.com/
[5] Джош Локхарт: https://twitter.com/codeguy
[6] JavaScript: http://jstherightway.org/
[7] Упражнение 1. Измените значение переменной $phpVersion: #s1
[8] Упражнение 2. Замените недопустимый тег: #s2
[9] Упражнение 3. Замените устаревшую функцию: #s3
[10] Упражнение 4. Используйте только __construct(): #s4
[11] Упражнение 5. Удалите лишние конструкции по умолчанию в switch: #s5
[12] Упражнение 6. Используйте spaceship-оператор для сортировки массива: #s6
[13] Упражнение 7. Используйте оператор объединения: #s7
[14] Упражнение 8. Необходимо модифицировать условие после оператора объединения: #s8
[15] Упражнение 9. Измените значение $b для правильной работы оператора объединения: #s9
[16] Упражнение 10. Сгруппируйте пространства имен с одинаковым префиксом: #s10
[17] Упражнение 11. Переименуйте метод, используя новый набор разрешенных ключевых слов: #s11
[18] Упражнение 12. Используйте более безопасные функции для генерации случайных чисел: #s12
[19] Упражнение 13. Используйте новую функцию preg_replace_callback_array: #s13
[20] Упражнение 14. Использовать анонимный класс: #s14
[21] Упражнение 15. Укажите тип в аргументах функции: #s15
[22] Упражнение 16. Модифицируйте правый операнд условия, чтобы поймать значение ожидаемого типа: #s16
[23] Упражнение 17. Используйте строгий режим, чтобы перехватывать ошибки, когда функция получает не тот тип: #s17
[24] Упражнение 18. Используйте строгий режим для встроенных функций: #s18
[25] Упражнение 19. Директива strict_types должна идти первой строкой: #s19
[26] Упражнение 20. Укажите тип возвращаемого значения у функции: #s20
[27] Упражнение 21. Исправьте возвращаемый тип у функции, чтобы поймать значение ожидаемого типа: #s21
[28] Упражнение 22. Определение унаследованного класса должно возвращать один и тот же тип своего родителя: #s22
[29] Упражнение 23. Используйте новую юникод-последовательность для описания символов: #s23
[30] Упражнение 24. Разрешается передавать объекты в функцию unserialize(): #s24
[31] Упражнение 25. Включите в генератор другой генератор: #s25
[32] Упражнение 26. Воспользуйтесь замыканием функции: #s26
[33] Упражнение 27. Вызовите переменную $c из $a: #s27
[34] Упражнение 28. Используйте класс Error для обработки ошибок: #s28
[35] Упражнение 29. Используйте класс TypeError для обработки ошибок: #s29
[36] Упражнение 30. Используйте класс Throwable для обработки ошибок: #s30
[37] Упражнение 31. Используйте класс DivisionByZeroError для обработки ошибок: #s31
[38] Упражнение 32. Не используйте шестнадцатеричные числа в строках: #s32
[39] Упражнение 33. Получите финальное значение генератора №1: #s33
[40] Упражнение 34. Получите финальное значение генератора №2: #s34
[41] Упражнение 35. Исправьте прототип (интерфейс) функции: #s35
[42] Упражнение 36. Создайте группу констант: #s36
[43] онлайн-интерпретатором: http://phptester.net/
[44] Основные причины, почему пропустили шестую версию и перешли к седьмой: https://wiki.php.net/rfc/php6#strong_reasons_of_why_we_actually_should_skip_version_6_into_7
[45] Оператор вывода строки на экран: http://php.net/manual/ru/function.echo.php
[46] Тернарный (условный) оператор: http://php720.com/lesson/19
[47] Что такое мажорная и минорная версии?: http://red-book-cms.ru/poleznosti/chto-takoe-mazhornaya-i-minornaya-versii-programmnogo-obespecheniya.html
[48] Какие альтернативные PHP-теги были удалены, а какие оставлены?: https://wiki.php.net/rfc/remove_alternative_php_tags#proposal
[49] Устаревшие расширения: https://wiki.php.net/rfc/removal_of_dead_sapis_and_exts#introduction
[50] Регулярные выражения в PHP: http://phpfaq.ru/tech/regexp
[51] Поиск и замена по регулярному выражению: http://php.net/manual/ru/function.preg-replace.php
[52] Шаблоны: http://www.php.su/articles/?cat=regexp&page=008
[53] Производительность: http://php.net/manual/ru/regexp.reference.performance.php
[54] Устаревший конструктор: https://wiki.php.net/rfc/remove_php4_constructors#proposal
[55] Конструктор (объектно-ориентированное программирование): https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
[56] Для чего нужны классы?: http://ru.stackoverflow.com/questions/170336/%D0%94%D0%BB%D1%8F-%D1%87%D0%B5%D0%B3%D0%BE-%D0%BD%D1%83%D0%B6%D0%BD%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B
[57] Зачем нужен ООП?: https://toster.ru/q/185949
[58] Объектно-ориентированное программирование: https://ru.wikibooks.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
[59] Основы ООП в PHP: http://php.net/manual/ru/language.oop5.basic.php
[60] Перестаньте писать классы: https://habrahabr.ru/post/140581/
[61] Плюсы и минусы объектно-ориентированного программирования: http://www.uni-vologda.ac.ru/oberon/infoart/plus&min.htm
[62] Почему возникает синтаксическая ошибка в определении нескольких случаев по умолчанию в операторе switch?: https://wiki.php.net/rfc/switch.default.multiple#introduction
[63] Оператор switch: http://php.net/manual/ru/control-structures.switch.php
[64] Новый оператор: https://wiki.php.net/rfc/combined-comparison-operator#proposal
[65] Что это за оператор shaceship <=>?: http://stackoverflow.com/questions/30365346/what-is-the-spaceship-operator-in-php-7
[66] usort — сортирует массив по значениям, используя пользовательскую функцию для сравнения элементов: http://php.net/manual/ru/function.usort.php
[67] Внутренний указатель: http://php.net/manual/ru/function.current.php
[68] Новый оператор: https://wiki.php.net/rfc/isset_ternary#proposal
[69] Null coalescing operator: https://en.wikipedia.org/wiki/Null_coalescing_operator#PHP
[70] Simple PHP isset test: http://stackoverflow.com/questions/1248864/simple-php-isset-test
[71] isset() vs empty() vs is_null(): https://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/
[72] Частный случай: https://josephscott.org/archives/2015/06/php-null-coalescing-operator/
[73] Пример работы оператора: https://3v4l.org/kqgib#version=7.0.7
[74] Пространство имён (программирование): https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%B8%D0%BC%D1%91%D0%BD_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
[75] Обзор пространств имен: http://php.net/manual/ru/language.namespaces.rationale.php
[76] Пространства имен в PHP, разъяснение: https://habrahabr.ru/post/212773/
[77] Пространства имен в PHP: https://habrahabr.ru/post/245893/
[78] Краткое введение в PHP Пространства имен: https://mattstauffer.co/blog/a-brief-introduction-to-php-namespacing
[79] Ключевые слова: https://wiki.php.net/rfc/context_sensitive_lexer#proposal
[80] Криптографически безопасная функция для получения псевдослучайных целых чисел: http://php.net/manual/ru/function.random-int.php
[81] В чем недостаток mt_rand?: http://stackoverflow.com/questions/7808021/whats-the-disadvantage-of-mt-rand
[82] Разница между mt_rand() и rand(): http://stackoverflow.com/questions/28760650/difference-between-mt-rand-and-rand
[83] Поиск по регулярному выражению и замена с использованием функции обратного вызова: http://php.net/manual/ru/function.preg-replace-callback-array.php
[84] Работа с preg_replace_callback_array: https://www.youtube.com/watch?v=tTMn1dOs2-E
[85] Интерфейсы объектов: http://php.net/manual/ru/language.oop5.interfaces.php
[86] Абстрактные классы: http://php.net/Abstract
[87] Абстрактные классы и интерфейсы в PHP : http://www.techflirt.com/tutorials/oop-in-php/abstract-classes-interface.html
[88] Тип данных: https://ru.wikipedia.org/wiki/%D0%A2%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85
[89] Введение в типы данных PHP: http://php.net/manual/ru/language.types.intro.php
[90] Инициализация скалярных типов в PHP7: http://www.techflirt.com/scalar-type-declarations-in-php-7
[91] Манипуляции с типами данных: http://php.net/manual/ru/language.types.type-juggling.php
[92] Установка директив: http://php.net/manual/ru/control-structures.declare.php
[93] Контроль типа: http://php.net/manual/ru/language.oop5.typehinting.php
[94] Справочник стандартных функций: http://php.net/manual/ru/funcref.php
[95] Встроенные функции в PHP: https://www.youtube.com/watch?v=iM5Ku3ZCMD4
[96] Встроенные расширения PHP: http://php.net/manual/ru/extensions.alphabetical.php
[97] Стандартная библиотека PHP (SPL): http://php.net/manual/ru/book.spl.php
[98] declare используется для установки директив исполнения для блока кода: http://php.net/manual/en/control-structures.declare.php
[99] Возврат значений: http://php.net/manual/ru/functions.returning-values.php
[100] Какая разница между возвращаемым и не возвращаемым значением в PHP?: http://stackoverflow.com/questions/6018463/whats-the-difference-between-return-and-no-return
[101] Выигрываем ли мы в производительности, если подсказываем функции ожидаемый тип в PHP?: http://stackoverflow.com/questions/23371432/what-is-the-performance-overhead-of-type-hinting-in-php
[102] Существуют ли правила для возвращаемого значения у пользовательской булевской функции?: http://stackoverflow.com/questions/12834666/convention-of-setting-return-type-in-php-boolean-functions
[103] Возвращение по ссылке: https://wiki.php.net/rfc/return_types#returning_by_reference
[104] Руководство по работе со ссылками: http://php.net/manual/ru/language.references.php
[105] Немного о наследовании и о переопределении методов, чем о полиморфизме: https://habrahabr.ru/post/37576/
[106] Что такое полиморфизм на самом деле. В PHP он тоже существует: https://habrahabr.ru/post/37610/
[107] Когда подтип перекрывает родительский метод, то тип возвращаемого дочернего метода должен точно соответствовать родительскому: https://wiki.php.net/rfc/return_types#variance_and_signature_validation
[108] Отличный образовательный курс по изучению ООП на PHP: http://phpenthusiast.com/object-oriented-php-tutorials
[109] Юникод: https://habrahabr.ru/post/135913/
[110] Символов Unicode в PHP строке: http://stackoverflow.com/questions/6058394/unicode-character-in-php-string
[111] Поддержка юникод управляющих (escape-) последовательностей: https://wiki.php.net/rfc/unicode_escape#introduction
[112] unserialize: https://wiki.php.net/rfc/secure_unserialize#proposal
[113] Как использовать в PHP serialize() и unserialize( )?: http://stackoverflow.com/questions/8641889/how-to-use-php-serialize-and-unserialize
[114] Оператор проверки типа: http://php.net/manual/ru/language.operators.type.php
[115] Генераторы в действии: https://habrahabr.ru/post/189796/
[116] Экономим память с помощью генераторов: http://ruseller.com/lessons.php?rub=37&id=2690
[117] Делегирование генераторов: https://wiki.php.net/rfc/generator-delegation#formally
[118] Про утечку ресурсов в генераторах PHP: http://ru-php.livejournal.com/1566325.html
[119] Анонимная функция (лямбда-функция): https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F
[120] Анонимные функции (замыкания) в PHP: не стоит путать с замыканиями в JavaScript: http://webnotes.by/docs/php/240
[121] Применение замыканий в PHP: https://habrahabr.ru/post/147620/
[122] Универсальный синтаксис: https://wiki.php.net/rfc/uniform_variable_syntax#introduction
[123] Обработка исключений: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B9
[124] Зачем нужна обработка исключений?: http://ru.stackoverflow.com/questions/140546/%D0%97%D0%B0%D1%87%D0%B5%D0%BC-%D0%BD%D1%83%D0%B6%D0%BD%D0%B0-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B9
[125] Исключения в PHP: http://php.net/manual/ru/language.exceptions.php
[126] Throwable exception и ошибки в php7: https://habrahabr.ru/post/261451/
[127] Виды исключений в PHP: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
[128] Исключение != ошибка: https://habrahabr.ru/post/130597/
[129] Использование Throwable: https://mofsy.ru/349-isklyucheniya-v-php-7.html
[130] Пример деления на ноль: https://3v4l.org/ORXUi#version=7.0.7
[131] DivisionByZeroError: http://php.net/manual/en/class.divisionbyzeroerror.php
[132] Приведение типов в PHP == табурет о двух ножках?: https://habrahabr.ru/post/259497/
[133] Приведение типа: https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%B0
[134] Удалена поддержка шестнадцатеричных чисел в строках: https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings#introduction
[135] Возврат финального значения: https://wiki.php.net/rfc/generator-return-expressions#proposal
[136] Как сказать по-русски слово yield???: https://toster.ru/q/247672
[137] Аргументы функции: http://php.net/manual/ru/functions.arguments.php
[138] Константы: http://php.net/manual/ru/language.constants.php
[139] «Волшебные» константы: http://php.net/manual/ru/language.constants.predefined.php
[140] define() vs const: http://stackoverflow.com/questions/2447791/define-vs-const
[141] Источник: https://habrahabr.ru/post/302942/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.