Керівництво по PHP7


php7-tutorial.com

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

Від перекладача

Всім привіт, з вами Максим Іванов, і сьогодні ми поговоримо про нововведення 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, щоб перейти до наступного вправі

<?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. Основні причини, чому пропустили шосту версію і перейшли до сьомої
2. Оператор виводу рядка на екран
3. Тернарний (умовний) оператор
4. Що таке мажорна і мінорна версії?

Вправа 2. Замініть неправильний тег

<?%
echo "Next step !";

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

Рішення
<?php
echo "Next step !";

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



До прочитання:
1. Які альтернативні PHP-теги були видалені, а які залишені?

Вправа 3. Функція ereg_replace є застарілою, замініть її на preg_replace

<?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. Застарілі розширення
2. Регулярні вирази в PHP
3. Пошук і заміна по регулярному виразу
4. Шаблони
5. Продуктивність

Вправа 4. PHP4 конструктори визнані застарілими, використовуйте __construct

<?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. Застарілий конструктор
2. Конструктор (об'єктно-орієнтоване програмування)
3. Для чого потрібні класи?
4. Навіщо потрібен ООП?
5. Объектно-орієнтоване програмування
6. Основи ООП в PHP
7. Перестаньте писати класи
8. Плюси і мінуси об'єктно-орієнтованого програмування

Вправа 5. Множинні конструкції за замовчуванням в операторі switch тепер заборонені, видалите перший

<?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?
2. Оператор switch

Вправа 6. Використовуйте spaceship-оператор (<=>) для сортування масиву по першому символу

<?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. Новий оператор
2. Що це за оператор shaceship <=>?
3. usort — сортує масив за значенням, використовуючи власну функцію для порівняння елементів
4. Внутрішній покажчик

Вправа 7. Використовуйте оператор об'єднання зі значенням NULL (??)

<?php
echo $_GET['query'] ? $_GET['query'] : "Next step !";

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

Рішення
<?php
echo $_GET['query'] ?? "Next step !";

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



До прочитання:
1. Новий оператор
2. Null coalescing operator
3. Simple PHP ісеть test
4. isset() vs empty() vs is_null()

Вправа 8. Оператор об'єднання зі значенням NULL (??) не перевіряє значення в певних випадках, змінити правий операнд в умові

<?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. Приватний випадок

Вправа 9. Оператор об'єднання зі значенням NULL (??) не перевіряє значення в певних випадках, змініть значення $b

<?php
$b = false;

echo $a ?? $b ?? "Next step !";

// результат

Рішення
<?php
$b = null;
echo $a ?? $b ?? "Next step !";

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



До прочитання:
1. Приклад роботи оператора

Вправа 10. Можна згрупувати простору імен з однаковим префіксом. Згрупуйте їх у прикладі.

<?php
use Foo\Bar\Email;
use Foo\Bar\Phone;
use Foo\Bar\Address\Code;
use Foo\Bar\Address\Number;

echo "Next step !";

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

Рішення
<?php 
use Foo\Bar\{
Email,
Phone,
Address\Code,
Address\Number
};

echo "Next step !";

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



До прочитання:
1. Простір імен (програмування)
2. Огляд просторів імен
3. Простору імен в PHP, роз'яснення
4. Простору імен в PHP
5. Коротке введення в PHP Простору імен

Вправа 11. Деякі ключові слова тепер дозволено використовувати у назвах методів (list, foreach, new, ..)

<?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. Ключові слова

Вправа 12. Використовуйте більш безпечні функції для генерації випадкових чисел

<?php 
$randomInt = mt_rand(0, 42);
echo $randomInt;

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

Рішення
<?php
$randomInt = random_int(0, 42);
echo $randomInt;

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



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

Вправа 13. Використовуйте нову функцію preg_replace_callback_array

<?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. Пошук по регулярному виразу і заміна з використанням функції зворотного виклику
2. Робота з preg_replace_callback_array

Вправа 14. Тепер можна створювати анонімні класи. Використовувати анонімний клас замість MyMessage

<?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. Інтерфейси об'єктів
2. У чому сенс інтерфейсів в PHP?
3. Абстрактні класи
4. Абстрактні класи та інтерфейси у PHP

Вправа 15. Додайте тип int до аргументів функції add

<?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. Тип даних
2. Введення в типи даних PHP
3. На сьогоднішній день, використання скалярних і змішаних типів даних в PHP7 не підвищує продуктивності

Вправа 16. За замовчуванням PHP відливає значення очікуваного типу. Модифікуйте правий операнд умови

<?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

Вправа 17. Використовуйте суворий режим, якщо хочете перехоплювати помилки, у випадку, коли функція отримує не той тип, який чекає. Виправте на float.

<?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. Маніпуляції з типами даних
2. Установка директив
3. Контроль типу
4. Вбудовані директиви

Вправа 18. Використовуйте суворий режим для вбудованих функцій

<?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. Довідник стандартних функцій
2. Вбудовані функції PHP
3. Вбудовані розширення PHP
4. Стандартна бібліотека PHP (SPL)

Вправа 19. Директива strict_types повинна йти першим рядком

<?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 використовується для установки директив для виконання блоку коду

Вправу 20. Тепер можна вказати тип значення, що повертається у функції або методу. Вкажіть тип значення, що повертається у функції

<?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. Повернення значень
2. Яка різниця між її обчислене і не її обчислене значення в PHP?
3. Виграємо ми в продуктивності, якщо підказуємо функції очікуваний тип в PHP?
4. чи Існують правила для повертається у користувача булевской функції?

Вправа 21. За замовчуванням, PHP викине очікуваний тип. Виправте повертається тип у функції

<?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. Повернення за посиланням
2. Керівництво по роботі з посиланнями

Вправа 22. Визначення успадкованого класу має повертати один і той же тип свого батька

<?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. Трохи про спадкування і про перевизначенні методів, ніж про поліморфізм
2. Що таке поліморфізм насправді. В PHP він теж існує
2. Коли підтип перекриває батьківський метод, то тип повертаного дочірнього методу повинен точно відповідати батьківського
4. Чудовий освітній курс з вивчення ООП на PHP

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

<?php

// Модифікуйте лівий операнд
if("\?{26C4}" === ") {
echo "Next step !";
}

// результат

Рішення
<?php

// Modify the left operand.
if("\u{26C4}" === ") {
echo "Next step !";
}

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



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

Вправа 24. Була додана нова опція в стандартну функцію unserialize(), тепер дозволяється вказувати класи. Вкажіть клас у функції unserialize()

<?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
2. Як використовувати PHP serialize() і unserialize( )?
3. Оператор перевірки типу

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

<?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. Підтримка генераторів і сопрограмм: суть генератора в тому, що це функція, що повертає не просто одне значення, а послідовність значень
2. Генератори в дії
3. Економимо пам'ять з допомогою генераторів
4. Делегування генераторів
5. Про витік ресурсів в генераторах PHP

Вправа 26. Ви можете використовувати замикання у функцій. Новий інтерпретатор працює зліва направо

<?php

function foo()
{
return function() { echo "Next step !"; };
}

// Скористайтесь замиканням функції foo у цій рядку

// результат

Рішення
<?php

function foo()
{
return function() { echo "Next step !"; };
}

// або: $foo = foo(); $foo();
foo()();
// результат
Next step !



До прочитання:
1. Анонімна функція (лямбда-функція)
2. Анонімні функції (замикання) в PHP: не варто плутати з замиканнями в JavaScript
3. Застосування замикань в PHP

Вправа 27. Виправте синтаксис, щоб викликати змінну $c $a

<?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. Універсальний синтаксис

Вправа 28. Тепер, щоб зловити виняток необхідно використовувати клас Error

<?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. Обробка винятків
2. Навіщо потрібна обробка винятків?
3. Винятки в PHP
4. Throwable exception і помилки в php7

Вправа 29. Можна використовувати також клас TypeError для обробки винятків

<?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

Вправа 30. Використовуйте Throwable, щоб відловлювати виключення і помилки (загальний інтерфейс Errors, Exceptions)

<?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. Виняток != помилка
2. Використання Throwable
3. Приклад ділення на нуль

Вправа 31. Використовуйте DivisionByZeroError при діленні на нуль

<?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

Вправа 32. Не використовуйте шістнадцяткові числа в рядках

<?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 == табурет про двох ніжках?
2. Приведення типу
3. Видалена підтримка шістнадцяткових чисел у рядках

Вправа 33. Явний повернення фінального значення генератора дозволяє обробляти значення безпосередньо в коді, що викликає генератор

<?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. Повернення фінального значення

Вправа 34. Неможливо отримати фінальне значення, якщо внутрішній вказівник не вказує на нього

<?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???

Вправа 35. Ви не можете використовувати однакові назви аргументів в прототипі функції

<?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. Аргументи функції

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

<?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. Константи
2. «Чарівні» константи
3. define() vs const
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.