PHP - Strict Typing: A Beginner's Guide

Здравствуйте, будущие маги PHP! Я рад пригласить вас в увлекательное путешествие в мир strict typing в PHP. Как кто-то, кто уже давно преподает PHP, я могу сказать, что понимание этой концепции сделает вас намного лучше программистом. Так что погружаемся!

PHP - Strict Typing

Что такое Strict Typing?

Прежде чем мы углубимся в детали, давайте поймем, что такое strict typing. Представьте, что вы пекете торт. Вы бы не использовали соль вместо сахара, правда? Потому что рецепт строги в отношении того, какие ингредиенты использовать. Точно так же strict typing в PHP касается точности в отношении типов данных, которые мы используем в нашем коде.

Почему важно Strict Typing

Вы можете задаться вопросом: "Почему мне стоит беспокоиться о strict typing?" Ну, мой молодой падаван, strict typing помогает предотвратить ошибки, делает ваш код более надежным и даже может улучшить производительность. Это как having a vigilant guard для вашего кода!

Пример: Опасности Loose Typing

Давайте начнем с простого примера, чтобы показать, почему strict typing может быть спасением:

function addNumbers($a, $b) {
return $a + $b;
}

echo addNumbers(5, "10");  // Выводит: 15
echo addNumbers("5", "10");  // Выводит: 15

В этом примере PHP автоматически преобразует строку "10" в целое число. Это поведение, называемое type juggling, иногда может привести к неожиданным результатам. Что, если кто-то случайно передаст строку, которая не может быть преобразована в число? Начнется хаос!

Введение в Type Hints

Type hints resemble name tags for your function parameters. They tell PHP, "Hey, I only want this specific type of data here!"

Давайте усовершенствуем наш предыдущий пример:

function addNumbers(int $a, int $b) {
return $a + $b;
}

echo addNumbers(5, 10);  // Выводит: 15
echo addNumbers("5", "10");  // Выбрасывает TypeError

Теперь, если кто-то пытается передать строки вместо целых чисел, PHP будет ругаться (технически, выбрасывает TypeError). Это как если бы у вас былouncer в клубе, проверяющий паспорта!

Доступные Type Hints

PHP предлагает разнообразие type hints. Вот удобная таблица самых_common из них:

Type Hint Description
int Целые числа
float Дробные числа
string Текстовые строки
bool Логические значения (true/false)
array Массивы
object Любые объекты
callable Функции или методы, которые можно вызывать
iterable Массивы или объекты, реализующие Traversable
self Тот же класс, в котором он используется
?type Nullable type (может быть указанным типом или null)

Мощь strict_types

Теперь давайте поднимем планку с помощью strict_types. Это как включение "суперстрогого режима" для PHP.

Чтобы включить strict typing, добавьте эту строку в самую верхушку вашего PHP файла:

<?php
declare(strict_types=1);

function divideNumbers(int $a, int $b): float {
return $a / $b;
}

echo divideNumbers(10, 3);  // Выводит: 3.3333333333333
echo divideNumbers(10, "3");  // Выбрасывает TypeError

С включенным strict_types, PHP становится намного строже в отношении типов. Он даже не пытается преобразовывать "3" в целое число anymore. Это как если бы у вас был учитель математики, insist на точных вычислениях!

Return Type

Обратите внимание на : float после параметров функции? Это декларация типа返回. Она говорит PHP, что эта функция должна возвращать значение типа float.

function greet(string $name): string {
return "Hello, $name!";
}

echo greet("Alice");  // Выводит: Hello, Alice!
echo greet(123);  // Выбрасывает TypeError

Практический пример: Простой калькулятор

Давайте соберем все вместе с более практическим примером:

<?php
declare(strict_types=1);

class Calculator {
public function add(float $a, float $b): float {
return $a + $b;
}

public function subtract(float $a, float $b): float {
return $a - $b;
}

public function multiply(float $a, float $b): float {
return $a * $b;
}

public function divide(float $a, float $b): float {
if ($b == 0) {
throw new Exception("Division by zero is not allowed");
}
return $a / $b;
}
}

$calc = new Calculator();

try {
echo $calc->add(5.5, 3.2) . "\n";  // Выводит: 8.7
echo $calc->subtract(10, 4) . "\n";  // Выводит: 6
echo $calc->multiply(2.5, 3) . "\n";  // Выводит: 7.5
echo $calc->divide(15, 3) . "\n";  // Выводит: 5
echo $calc->divide(10, 0);  // Выбрасывает Exception
} catch (TypeError $e) {
echo "Type Error: " . $e->getMessage();
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}

В этом примере мы создали класс Calculator с методами, которые используют strict typing. Обратите внимание, как мы используем float для всех чисел, чтобы работать как с целыми, так и с десятичными.

Заключение

Поздравляю! Вы только что сделали свои первые шаги в мир strict typing в PHP. Помните, strict typing как seatbelt при программировании – он может показаться restrictivным сначала, но он существует, чтобы защитить вас от讨厌ных ошибок и сбоев.

Продолжая ваше путешествие в PHP, продолжайте практиковаться с strict typing. Это зробит вас более дисциплинированным и надежным программистом. И кто знает? Может быть有一天, вы станете тем, кто будет учить других о чудесах strict typing в PHP!

Счастливого кодирования, и пусть ваши типы всегда будут strict и ваши ошибки редки!

Credits: Image by storyset