Php подробное руководство

Последнее обновление: 21.12.2022

  1. Глава 1. Введение в PHP

    1. Общий обзор языка программирования PHP

    2. Установка PHP

    3. Установка веб-сервера Apache

    4. Установка веб-сервера Apache и PHP на Mac OS

    5. Первый сайт на PHP

  2. Глава 2. Основы PHP

    1. Основы синтаксиса

    2. Переменные

    3. Типы данных

    4. Операции в PHP

    5. Конструкция if..else и тернарная операция

    6. Конструкции switch и match

    7. Циклы

    8. Массивы

    9. Ассоциативные массивы

    10. Многомерные массивы

    11. Функции

    12. Параметры функции

    13. Возвращение значений и оператор return

    14. Анонимные функции

    15. Замыкания / Closure

    16. Стрелочные функции

    17. Генераторы

    18. Ссылки

    19. Область видимости переменной

    20. Константы

    21. Проверка существования переменной

    22. Получение и установка типа переменной. Преобразование типов

    23. Операции с массивами

  3. Глава 3. Отправка данных на сервер

    1. Получение данных из строки запроса. GET-запросы

    2. Отправка форм. POST-запросы

    3. Безопасность данных

    4. Отправка массивов

    5. Работа с полями ввода форм

    6. Пример обработки форм

    7. Отправка файлов на сервер

  4. Глава 4. Объектно-ориентированное программирование

    1. Объекты и классы

    2. Конструкторы и деструкторы

    3. Анонимные классы

    4. Наследование

    5. Модификаторы доступа

    6. Статические методы и свойства

    7. Интерфейсы

    8. Абстрактные классы и методы

    9. Traits

    10. Копирование объектов классов

    11. Свойства и классы для чтения

  5. Глава 5. Базовые возможности PHP

    1. Подключение внешних файлов

    2. Пространства имен

    3. Типизация данных

    4. Работа со строками

    5. Работа с cookie

    6. Сессии

  6. Глава 6. Обработка исключений

    1. Конструкция try catch finally

    2. Генерация исключений

  7. Глава 7. Работа с файловой системой

    1. Чтение и запись файлов

    2. Управление файлами и каталогами

    3. Блокировка файла. Функция flock

  • Глава 1. Введение в PHP
    • Общий обзор языка программирования PHP
    • Установка PHP
    • Установка веб-сервера Apache
    • Установка веб-сервера Apache и PHP на Mac OS
    • Первый сайт на PHP
  • Глава 2. Основы PHP
    • Основы синтаксиса
    • Переменные
    • Типы данных
    • Операции в PHP
    • Конструкция if..else и тернарная операция
    • Конструкции switch и match
    • Циклы
    • Массивы
    • Ассоциативные массивы
    • Многомерные массивы
    • Функции
    • Параметры функции
    • Возвращение значений и оператор return
    • Анонимные функции
    • Замыкания / Closure
    • Стрелочные функции
    • Генераторы
    • Ссылки
    • Область видимости переменной
    • Константы
    • Проверка существования переменной
    • Получение и установка типа переменной. Преобразование типов
    • Операции с массивами
  • Глава 3. Отправка данных на сервер
    • Получение данных из строки запроса. GET-запросы
    • Отправка форм. POST-запросы
    • Безопасность данных
    • Отправка массивов
    • Работа с полями ввода форм
    • Пример обработки форм
    • Отправка файлов на сервер
  • Глава 4. Объектно-ориентированное программирование
    • Объекты и классы
    • Конструкторы и деструкторы
    • Анонимные классы
    • Наследование
    • Модификаторы доступа
    • Статические методы и свойства
    • Интерфейсы
    • Абстрактные классы и методы
    • Traits
    • Копирование объектов классов
    • Свойства и классы для чтения
  • Глава 5. Базовые возможности PHP
    • Подключение внешних файлов
    • Пространства имен
    • Типизация данных
    • Работа со строками
    • Работа с cookie
    • Сессии
  • Глава 6. Обработка исключений
    • Конструкция try catch finally
    • Генерация исключений
  • Глава 7. Работа с файловой системой
    • Чтение и запись файлов
    • Управление файлами и каталогами
    • Блокировка файла. Функция flock

php7-tutorial.com

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

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

Всем привет, с вами Максим Иванов, и сегодня мы поговорим о нововведениях PHP 7, о которых более подробно поведает нам Гийом Девар (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 isset 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 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. Пространство имён (программирование)
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. Шаблон программирования «Текучий интерфейс» в PHP. Свежий взгляд
4. Абстрактные классы
5. Абстрактные классы и интерфейсы в PHP
6. Отличия абстрактного класса от интерфейса

Упражнение 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. На сегодняшний день, использование скалярных и смешанных типов данных в PHP 7 не повышает производительности

Упражнение 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. Инициализация скалярных типов в PHP 7

Упражнение 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. Поддержка юникод управляющих (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 и ошибки в PHP 7

Упражнение 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 в PHP 5
// var_dump(12 == "0xC"); // false в PHP 7

// Исправьте левый операнд
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

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Какую версию PHP вы использовали в своих последних проектах?

Проголосовали 157 пользователей.

Воздержались 32 пользователя.

PHP (от англ. препроцессор гипертекста) – язык программирования общего назначения, широко используемый в веб-разработке. Сценарии PHP можно внедрять непосредственно в код HTML. В этой статье мы пройдемся по основам программирования на PHP: синтаксису, объявлению переменных, массивам, условным операторам, циклам и функциям. Также запустим двумя способами веб-сервер на локальной машине и соберем страничку из нескольких файлов PHP и фреймворка Bootstrap. В конце статьи приведем список литературы и бесплатные курсы по PHP для новичков.

Редакторы кода

Для удобного кодинга нам понадобится редактор кода (IDE). Популярные:

  • PhpStorm (платный, пробная версия на 30 дней);
  • Atom (бесплатно);
  • Visual Studio Code (бесплатно);
  • Sublime Text (бесплатно).

Как запустить PHP в Atom

Устанавливать PHP на компьютер и запускать веб-сервер мы будем в конце статьи в разделе «Собираем HTML-страницу». А пока для запуска PHP-сценариев достаточно добавить плагин Script в редакторе Atom.

Установка IDE

Как установить Atom в Ubuntu и Windows читайте в нашем самоучителе по Python.

Чтобы запустить PHP-сценарий в Atom перейдем в закладку Packages ScriptRun Script, либо нажмем на клавиши Ctrl + Shift + B (рис. 1).

Рис. 1. Запуск php-скрипта в редакторе Atom

Рис. 1. Запуск php-скрипта в редакторе Atom

1. Синтаксис

Код в PHP заключается в открывающий <?php и закрывающий ?> теги. Согласно стандарту кодирования PSR-12, закрывающий тег должен быть опущен в файлах, содержащих только код PHP. В конце строки ставят разделитель строк – точку с запятой ;. Если забыть поставить разделитель, то следующая строка кода соединится с предыдущей и интерпретатор PHP выдаст ошибку.

Выведем на экран строку Hello World (заключена в кавычки) с помощью команды echo:

        <?php
echo 'Hello, World.'; // Hello, World.
    

через функцию print:

        <?php
print 'Hello, World.'; // Hello, World.
    

через функцию printf (выводит отформатированную строку):

        <?php
printf('Hello, World.'); // Hello, World.
    

или через функцию print_r(), выводящую информацию в удобочитаемом виде:

        <?php
print_r('Hello, World.'); // Hello, World.
    

Чтобы перенести строку используем символ n, который работает только в двойных кавычках:

        <?php
print_r("Hello, World.nHello, Coder.");

/*
Hello, World.
Hello, Coder.
*/
    

2. Объявление переменной

PHP – язык со слабой типизацией, то есть перед объявлением переменной не нужно задавать ее тип. Чтобы объявить переменную, перед ее именем ставят знак доллара $:

        $animal = 'Cat';
    

Здесь:

переменной animal присвоили значение Сat.

Выведем на экран переменную animal:

        <?php
$animal = 'Cat';
echo $animal; // Cat
    

Одно значение можно присвоить нескольким переменным:

        <?php
$first_animal = $second_animal = $third_animal = 'Cat';

echo "$first_animal"; // Cat
echo "$second_animal"; // Cat
echo "$third_animal"; // Cat
    

Комментарии

Однострочный комментарий начинается с двух слешей // или хеш-символа #, а многострочный заключается в /* */:

        <?php
// однострочный комментарий

# однострочный комментарий

/*
многострочный 
комментарий
 */
    

3. Типы данных

3.1. Строки

Строка – набор символов, заключенный в одиночные '' или двойные кавычки "":

        <?php
$first_animal = 'Cat';
$second_animal = "Dog";
    

Конкатенация строк

Оператор конкатенации точка . соединяет левый и правый аргументы:

        <?php
$first_animal = 'Cat';
$second_animal = 'Dog';
$animals = $first_animal . $second_animal;

echo "$animals"; // CatDog

    

Оператор присваивания с конкатенацией .= присоединяет правый аргумент к левому:

        <?php
$first_animal = 'Cat';
$second_animal = 'Dog';
$third_animal = 'Giraffe';
$animals = $first_animal;
$animals .= $second_animal;
$animals .= $third_animal;

echo "$animals"; // CatDogGiraffe
    

Чтобы перенести слово на новую строку воспользуемся символом переноса n, который работает только в двойных кавычках:

        <?php
$first_animal = "Catn";
$second_animal = "Dogn";
$third_animal = "Giraffe";
$animals = $first_animal;
$animals .= $second_animal;
$animals .= $third_animal;

echo "$animals";


/*
Cat
Dog
Giraffe
 */
    

3.2. Числа

Целое число (integer) не имеет дробной части:

        <?php
$number_one = 5678; // целое положительное число
$number_two = -5678; // целое отрицательное число

    

Число с плавающей точкой

Число с плавающей точкой имеет дробную часть и задается следующий образом:

        <?php
$number_one = 1.5678; // 1.5678 – положительное число с плавающей точкой
$number_two = -1.5678; // -1.5678 – отрицательное число с плавающей точкой
$number_three = 1.5678e0; // 1.5678 – положительное число с плавающей точкой
$number_four = 1.5678e2; //  156.78 – положительное число с плавающей точкой
$number_five = 1.5678E-2; // 0.015678 – положительное число с плавающей точкой
    

Чтобы узнать тип переменной воспользуемся функцией gettype(), а для преобразования числа с плавающей точкой в целое число функцией intval():

        <?php
$number_one = 1.5678; // 1.5678 – положительное число с плавающей точкой

echo gettype($number_one); // double
$number_one = intval($number_one);
echo $number_one; // 1
echo gettype($number_one); // integer

    

Арифметические операторы

Оператор Операция
+ Сложение
Вычитание
* Умножение
/ Деление
% Деление по модулю
** Возведение в степень

Таблица 1. Арифметические операторы

        <?php
echo 2 + 4; // 6
echo 2 / 4; // 0.5
echo 2 * 4; // 8
echo 2 - 4; // -2
echo 2 % 4; // 2
echo 2 ** 4; // 16
    

Мы можем сложить два числа через запись $number_one = $number_one + $number_two; или через сокращенную запись $number_one += $number_two;:

        <?php
// полная запись
$number_one = 1;
$number_two = 3;
$number_one =  $number_one + $number_two;
echo $number_one; // 4

// сокращенная запись запись
$number_one = 1;
$number_two = 3;
$number_one += $number_two;
echo $number_one; // 4
    

Операторы сравнения

Чтобы сравнить значения используют операторы сравнения, которые возвращают true или false:

        <?php
echo 4 > 0; // 1 – true
echo 4 <= 55; // 1 – true
echo 4 != 5; // 1 – true
echo 4 <=> 5; // -1
echo 4 <=> 4; // 0
echo 4 <=> 3; // 1

    

Если строка не содержит число, то интерпретатор PHP приводит значение строки к 0. Если в строке есть число и оно стоит после буквенных символов, то значение всей строки также приводится к 0. Если число стоит перед буквенными символами, то для сравнении берется только число.

        <?php
echo 0 == 'hello'; // true, так как 0 = 0
echo 0 == 'hello3555'; // true, так как 0 = 0
echo 0 == '3555hello'; // false, так как 0 не равно 3555
echo 3555 == '3555hello'; // true, так как 3555 равно 3555

    
Оператор Значение
$n == $m True, если $n равно $m
$n === $m True, если $n равно $m и имеют одинаковые типы
$n! = $m True, если $n не равна $m
$n <> $m True, если $n не равна $m
$n !== $m True, если отличаются тип или значение переменных
$n < $m True, если $n меньше $m
$n > $m True, если $n больше $m
$n <= $m True, если $n меньше или равна $m
$n >= $m True, если $n больше или равна $m
$n <=> $m Возвращает -1, если $n меньше $m, 0 в случае равенства и 1, если $n больше $m

Таблица 2. Операторы сравнения

Порядок операций

Сначала считается выражение в скобках:

        <?php
print_r((2 * 4) + 5); // 13
    

4. Условный оператор if-else

Рис. 2. Условный оператор if в PHP

Рис. 2. Условный оператор if в PHP

Оператор if выполняет код, если выполняется условие. В противном случае выполняется код после else, который переводится, как «иначе», «в другом случае».

Синтаксис оператора if-else
        if (условие) выполнить_код else выполнить_другой_код
    

Напишем несколько условий с оператором if и if-else:

        <?php
if (2 < 5) {
    echo 'true';
}
// true

if (2 > 5) {
    echo 'true';
} else {
    echo 'false';
}
// false
    

для проверки дополнительных условий используется оператор elseif:

        <?php
$number = 15;

if ($number < 3) {
    echo 'Число меньше трех.';
} elseif ($number > 4 && $number < 10) {
    echo 'Число в промежутке от 4 до 10.';
} else {
    echo 'Число больше 10.';
}
// Число больше 10
    

Здесь:

&& – логический оператор И. В нашем условии проверяемое число должно быть больше четырех и меньше десяти.

Оператор Значение Результат
$n and $m И true, если и $n, и $m true
$n or $m Или true, если или $n, или $m true
$n xor $m Исключающее Или true, если $n, или $m true
! $n Отрицание true, если $n не true
$n && $m И true, если и $n, и $m true
$n || $m Или true, если или $n, или $m true

Таблица 3. Логические операторы

5. Тернарный оператор

Тернарный оператор сокращает запись проверяемого условия и имеет следующий синтаксис:

        условие ? выполнить_код_если_истинно : выполнить_код_если_ложно:
    

Проверим, переменная n больше 10 или нет. Если значение n больше 10, уменьшим значение n на единицу (декремент). В противном случае увеличим на единицу (инкремент).

        <?php
$n = 5;
$n > 10 ? $n-- : $n++;
echo $n; // 6
    

6. Переключатель switch

Переключатель switch проводит нестрогое сравнение == значений и передает управление соответствующему оператору case. Если значение не совпадает со значением из case, тогда выполняется переход к оператору default.

Синтаксис переключателя switch
        switch (переменная) {
    case 'значение1':
           код
        break;
    case 'значение2':
           код
        break;    
    default:
           код
        break;
}

    

Напишем конструкцию из переключателя switch и двух
операторов case:

        <?php
$n = 3;

switch ($n) {
    case 1:
        echo "Число равно двум.";
        break;
    case 2:
        echo "Число равно пяти.";
        break;
    default:
        echo "Значение по умолчанию.";
        break;
}
// Значение по умолчанию.
    

7. Цикл while

Рис. 3. Цикл while в PHP

Рис. 3. Цикл while в PHP

Оператор while выполняет код до тех пор, пока значение условия не станет ложным.

Синтаксис цикла while
        while (условие) {
    // код
}
    

Выведем на экран пять раз слово Hello.

        <?php
$m = 0;

while ($m < 4) {
    $m++;
    echo "Hellon";
}

/*
Hello
Hello
Hello
Hello
*/
    

Расшифровка:

while – обозначение цикла.

$m = 0 – начальное значение переменной m.

$m < 5 – условие, которое проверяется перед началом цикла.

$m++ – инкрементирование, то есть увеличение переменной на единицу.

echo "Hellon" – вывод на экран слово Hello каждый раз с новой строки n.

Другой способ записи с помощью декремента в условии:

        <?php
$m = 4;

while ($m--) {
    echo "Hellon";
}

/*
Hello
Hello
Hello
Hello
*/
    

Здесь:

$m-- – декрементация, то есть уменьшение значения переменной на единицу. В это примере знак декремента -- стоит после переменной, поэтому мы получим четыре итерации (от 4 до 0).

Если поставить оператор декремента перед переменной --$m, то мы получим три итерации (от 4 до 1):

        <?php
$m = 4;

while (--$m) {
    echo "Hellon";
}

/*
Hello
Hello
Hello
*/
    

8. Цикл do..while

Цикл do..while выполняется минимум один раз, так как условие выполнения цикла проверяется в конце итерации, а не в начале как в цикле while.

Синтаксис цикла do..while
        do {
    // код
} while (условие);

    

Напишем цикл, выводящий на экран четыре раза слово Hello:

        <?php
$a = 0;
do {
    echo "Hellon";
    $a++;
} while ($a < 4);

/*
Hello
Hello
Hello
Hello
*/
    

9. Цикл for

Рис. 4. Цикл for в PHP

Рис. 4. Цикл for в PHP

Когда нам известно количество итераций, вместо цикла while лучше использовать цикл for.

Синтаксис цикла for
        for (инициализация; условие_цикла; счетчик)
    тело_цикла
    
  1. Инициализирующее выражение выполняется один раз в начале цикла.
  2. Проверяется условие. Если оно истинно, то выполняется тело цикла. Если ложно, то выполнение цикла прерывается.
  3. В конце каждой итерации изменяется счетчик (увеличивается или уменьшается).

Цикл выполняется, до тех пор, пока условие истинно, то есть значение i не станет равным 4:

        <?php
for ($i=0; $i <= 4; $i++) {
    echo $i;
}

// 01234
    

10. Цикл foreach

Цикл foreach последовательно перебирает элементы массива.

Синтаксис цикла foreach
        foreach (массив as переменная) {
  инструкция
}
    

На каждой итерации переменной присваивается значение текущего элемента последовательности. Переберем все элементы массива и умножим каждый элемент на 3:

        <?php
$array = [1, 2, 3, 4];
foreach ($array as $number) {
    $number *= 3;
    echo $number;
}

// 36912
    

11. Массивы

Рис. 5. Индексы элементов в массиве PHP

Рис. 5. Индексы элементов в массиве PHP

Массивы – упорядоченная коллекция элементов с доступом по индексу или ключу. Индексный массив создается двумя способами:

Через функцию array():

        <?php
$a = array('Cat', 'Dog', 123);
echo $a[1]; // Dog

    

и через квадратные скобки []:

        <?php
$a = ['Cat', 'Dog', 123];
echo $a[1]; // Dog

    

Здесь:

echo $a[1] – вывести на экран второй элемент массива.

Нумерация массива начинается с 0. В нашем случаем элементу массива Cat соответствует порядковый номер 0, Dog1, 1232. Для обращения к элементу массива используется следующий синтаксис: $имя_массива[индекс_элемента].

Рекомендуется объявлять массив через квадратные скобки, так как эта запись компактнее.

Создадим пустой массив:

        <?php
$a = [];
    

Добавим в него несколько элементов и выведем на экран его содержимое:

        <?php
$array = [];
$array[] = 'Cat';
$array[] = 'Dog';
$array[] = 123;

print_r($array);

/*
Array
(
    [0] => Cat
    [1] => Dog
    [2] => 123
)
*/
    

Чтобы добавить новый элемент мы использовали запись $имя_массива[] = новый_элемент. Первый добавленный элемент получает индекс 0. Индексы следующих элементов увеличиваются на 1. Можно задать индекс самостоятельно. Для этого в квадратных скобках укажем нужный нам индекс:

        <?php
$array = [];
$array[100] = 'Cat';
$array[0] = 'Dog';
$array[33] = 123;

print_r($array[0]); // Dog
    

При добавлении непронумерованного элемента 5000, значение его индекса будет на единицу большего максимального значения индекса в массиве – 101:

        <?php
$array = [];
$array[100] = 'Cat';
$array[0] = 'Dog';
$array[33] = 123;
print_r($array);

/*
Array
(
    [100] => Cat
    [0] => Dog
    [33] => 123
)
*/

$array[] = 5000;
print_r($array);

/*
Array
(
    [100] => Cat
    [0] => Dog
    [33] => 123
    [101] => 5000
)
*/
    

Для удаления элемента из массива воспользуемся функцией unset():

        <?php
$array = ['Cat', 'Dog', 123];
unset($array[2]);
print_r($array);

/*
Array
(
    [0] => Cat
    [1] => Dog
)
*/

    

Здесь:

unset($array[2]) – удаление третьего элемента массива.

В качестве индекса также используют строки:

        <?php
$array = [];
$array['animal_one'] = 'Cat';
$array['animal_two'] = 'Dog';
$array['number'] = 123;

print_r($array['animal_two']); // Dog
    

В таком случае мы получаем что-то напоминающее словари в других языках программирования с ключами и значениями. В PHP такой массив называют ассоциативным.

Ассоциативный массив объявляется через символы =>:

        $имя_словаря = ['ключ1' => 'значение1', 'ключ2' => 'значение2']
    

Создадим ассоциативный массив:

        <?php
$array = ['first_key' => 'Cat', 'second_key' => 5000];
print_r($array);

/*
Array
(
    [first_key] => Cat
    [second_key] => 5000
)
*/
    

Здесь:

'first_key' – ключ.

'Cat' – значение.

Для поиска ключа по значению используем функцию array_search():

        <?php
$array = ['first_key' => 'Cat', 'second_key' => 5000];
print_r(array_search('Cat' ,$array)); // first_key
    

Здесь:

array_search('Cat' ,$array) – поиск ключа, соответствующего значению Cat в массиве array.

Чтобы подсчитать количество элементов в массиве воспользуемся функцией count():

        <?php
$array = ['first_key' => 'Cat', 'second_key' => 5000];
print_r(count($array)); // 2

    

Также можно создать многомерный массив:

        <?php
$array = ['animals' => ['Cat', 'Dog'], 'second_array' => [5000, 33, ['third_array' => ['Hello']]]];
print_r($array['animals'][1]); // Dog
print_r($array['second_array'][2]['third_array'][0]); // Hello
    

'animals' => ['Cat', 'Dog'] – ключ animals с двумя значениями: Cat и Dog.

'second_array' => [5000, 33, ['third_array' => ['Hello']]] – ключ second_array с тремя значениями: два числа 5000, 33 и массив, но уже со своим ключем third_array и значением Hello.

12. Функции

Функция – подпрограмма, которая на входе принимает аргументы (бывают функции без входных аргументов), выполняет код и возвращает результат. Функциональное программирование упрощает жизнь программиста, так как не нужно копировать и вставлять фрагменты кода снова и снова. Достаточно обратиться к функции когда нужно и сколько угодно раз.

Существуют встроенные и пользовательские функции. Встроенные функции – print(), print_r() и так далее – придумали разработчики. Пользовательские функции программисты пишут самостоятельно.

Как объявить функцию

Синтаксис функции:

        function имяФункции(аргументФункции1, аргументФункции2, ...) {
    код
return результат
}
    

Здесь:

function – мы говорим интерпретатору, что отсюда начинается функция.

аргументФункции – переменные, которые передаются функции для выполнения кода.

имяФункции – чтобы вызывать функцию, ей нужно присвоить имя.

return – выдает результат работы функции.

Напишем и вызовем функцию, выводящую на экран фразу Hello, World.

        <?php
function helloMessage(){
    return print("Hello, World.");
}

helloMessage(); // Hello, World. – вызов функции
    

Аргументы функций

До этого мы рассматривали функции без аргументов – переменных, которые функция получает извне. Напишем функцию с аргументами, которая считает сумму трех чисел:

        <?php
function summation($a, $b, $c){
    return print($a + $b + $c);

}

summation(1, 2, 3); // 6
summation(100, 74, 8); // 182

    

Здесь:

$a, $b, $c – аргументы функции.

13. Собираем HTML-страницу

Чтобы просмотреть HTML-страницу, собранную из нескольких PHP-файлов, установим и запустим веб-сервер, разместим файлы в определенной папке и обратимся к файлу через браузер.

Запуск веб-сервера

Веб-сервер можно запустить несколькими способами:

  1. Через встроенный в PHP веб-сервер.
  2. Через сторонние инструменты: XAMPP, Open Server, Winginx.

Встроенный в PHP веб-сервер

Инструкция для Windows:

  1. Скачаем с официального сайта PHP и распакуем содержимое архива на диск.
  2. Откроем консоль и перейдем в папку с PHP, используя команду cd, например, cd php7.
  3. Создадим папку page командной mkdir page. В ней будут храниться файлы нашей странички.
  4. Введем в консоли php -S localhost:8000 -t P:php7page. Флаг -S означает, что мы запускаем сервер по адресу localhost на 8000 порту. Флаг -t указывает путь к корневой директории.

Инструкция для Ubuntu:

  1. Установим PHP командой sudo apt install php libapache2-mod-php php-mysql.
  2. Создадим в домашней директории папку page.
  3. Введем в консоли php -S localhost:8000 -t /home/USERNAME/page.

Чтобы проверить запущен ли сервер, перейдем по адресу http://localhost:8000/:

Рис. 6. Запуск встроенного в PHP веб-сервера

Рис. 6. Запуск встроенного в PHP веб-сервера

Если мы получили ошибку 404, значит сервер запущен.

XAMPP

Скачаем и установим XAMPP. В папке C:xampphtdocs создадим папку нашей странички page. Запустим веб-сервер Apache, кликнув по кнопке Start. Узнаем версию PHP, введя в консоли (Shell) команду php -v.

Рис. 7. Запуск сервера с помощью XAMPP

Рис. 7. Запуск сервера с помощью XAMPP

Проверим, запущен ли сервер, перейдя по адресу http://localhost/. Если появилось приветственное сообщение, значит сервер запущен.

Рис. 8. Запуск сервера с помощью XAMPP на Windows

Рис. 8. Запуск сервера с помощью XAMPP на Windows

14. Собираем страничку

Теперь создадим несколько PHP-файлов, из которых соберем страничку. Перейдем в папку page и создадим четыре файла: index.php, header.php, body.php, footer.php.

Структура простого HTML-документа выглядит следующим образом:

        <!DOCTYPE html>
<html>
 <head>
  <title>First page</title>
 </head> 
 <body>
  <header>

  </header>

  <footer>

  </footer>
 </body> 
</html>

    

Воспользуемся фреймворком Bootstrap, чтобы ускорить создание странички. Скачивать ничего не нужно, просто вставим ссылку на Bootstrap в тег <head>:

        <!DOCTYPE html>
<html>
 <head>
  <title>First page</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
 </head> 
 <body>
  <header>
  </header>
  <footer>
  </footer>
 </body> 
</html>

    

Откроем файл header.php и вставим в него следующий код:

        <!DOCTYPE html>
<html>

<head>
    <title>First page</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
</head>

<body>
    <header>
        <ul class="nav justify-content-center">
            <li class="nav-item">
                <a class="nav-link active" aria-current="page" href="#">Active</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Ссылка</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Ссылка</a>
            </li>
        </ul>
    </header>
    

в файл body.php:

            <div class="card-group">
        <div class="card">
            <img src="https://upload.wikimedia.org/wikipedia/commons/2/27/PHP-logo.svg" class="card-img-top" alt="...">
            <div class="card-body">
                <h5 class="card-title">Что такое PHP?</h5>
                <p class="card-text">PHP — скриптовый язык общего назначения, интенсивно применяемый для разработки веб-приложений. </p>
                <p class="card-text"><small class="text-muted">Добавлено 5 минут назад</small></p>
            </div>
        </div>
        <div class="card">
            <img src="https://upload.wikimedia.org/wikipedia/commons/2/27/PHP-logo.svg" class="card-img-top" alt="...">
            <div class="card-body">
                <h5 class="card-title">Что такое PHP?</h5>
                <p class="card-text">PHP (англ. PHP: Hypertext Preprocessor — «PHP: препроцессор гипертекста»; первоначально PHP/FI (Personal Home Page / Form Interpreter), а позже названный Personal Home Page Tools</p>
                <p class="card-text"><small class="text-muted">Добавлено 8 минут назад</small></p>
            </div>
        </div>
        <div class="card">
            <img src="https://upload.wikimedia.org/wikipedia/commons/2/27/PHP-logo.svg" class="card-img-top" alt="...">
            <div class="card-body">
                <h5 class="card-title">Что такое PHP?</h5>
                <p class="card-text">В области веб-программирования, в частности серверной части, PHP — один из популярных сценарных языков (наряду с JSP, Perl и языками, используемыми в ASP.NET).</p>
                <p class="card-text"><small class="text-muted">Добавлено 10 минут назад</small></p>
            </div>
        </div>
    </div>

    

в файл footer.php:

            <footer>
        <nav aria-label="Page navigation example">
            <ul class="pagination">
                <li class="page-item"><a class="page-link" href="#">Назад</a></li>
                <li class="page-item"><a class="page-link" href="#">1</a></li>
                <li class="page-item"><a class="page-link" href="#">2</a></li>
                <li class="page-item"><a class="page-link" href="#">3</a></li>
                <li class="page-item"><a class="page-link" href="#">Вперед</a></li>
            </ul>
        </nav>
    </footer>
    </body>

</html>

    

в файл index.php:

        <?php

include 'header.php';
include 'body.php' ;
include 'footer.php';

    

Здесь:

include – инструкция, которая подключает к PHP-сценарию другие сценарии. Также сценарии подключают с помощью инструкций require, include_once и require_once. Они отличаются по реакции на отсутствие подключаемого файла.

Откроем страницу, перейдя на http://localhost:8000/ или http://localhost/page/. Должно получиться как на рис. 9.

Рис. 9. HTML-страница, собранная из php-файлов

Рис. 9. HTML-страница, собранная из php-файлов

***

Литература

  • Робин Никсон. Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript, CSS и HTML5;
  • Котеров, Симдянов. PHP 7;
  • Веллинг, Томсон. Разработка веб-приложений с помощью PHP и MySQL;

Остальные книги указаны в нашей статье ТОП-10 книг по PHP: от новичка до профессионала.

Шпаргалки

  • Шпаргалка по PHP
  • Основы PHP

YouTube-каналы и курсы

Бесплатные курсы на русском языке:

  • Основы php с нуля. Новейший курс 2020 – двадцать четыре урока от основ до регулярных выражений и функций;
  • Базовый курс по PHP 7 – узнаете про базовые понятия, GET-параметры, методы, функции и ООП;
  • Учим PHP за 1 Час – основы за полтора часа;
  • Изучение PHP для начинающих – научитесь работать с массивами, подключать файлы, обрабатывать формы, работать с куки и базой данных MySQL;
  • Уроки PHP 7 – много уроков по ООП;
  • PHP для начинающих – курс на Stepik для начинающих разработчиков, не требует специальных знаний;
  • PHP – первое знакомство – азы программирования на PHP (Stepik).
  • подписывайтесь на тег PHP, чтобы получать уведомления о новых статьях;
  • телеграм-канал «Библиотека пхпшника»;
  • книги по программированию в нашем телеграм-канале «Книги для программистов».

***

Итог

  • вы познакомились с синтаксисом PHP и типами данных;
  • узнали, как работают условные операторы и циклы;
  • запустили веб-сервер в Ubuntu и Windows;
  • собрали страничку HTML из файлов PHP.

Понравилась статья? Поделить с друзьями:

А вот и еще наши интересные статьи:

  • Интерактивное электронное техническое руководство это
  • Аторис таблетки для чего применяют инструкция по применению взрослым отзывы
  • Эдас 126 инструкция по применению цена отзывы
  • Кооперативный техникум руководство
  • Дефектоскоп электроискровой корона 2 инструкция по применению

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии