PHP данные: от простых скаляров до объектов и массивов

Раздел: PHP -> Обработка данных

Основные способы работы с данными в PHP

Использование строгой типизации и объявлений типов

Как гарантировать, что данные в PHP имеют ожидаемый тип?

Строгая типизация (declare(strict_types=1)) и объявления типов в функциях, методах и свойствах классов позволяют избежать неявного преобразования типов и ошибок, связанных с некорректными данными. Это основной способ обеспечения надежности кода.

declare(strict_types=1);

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

echo sum(5, 10); // 15
// echo sum('5', 10); // Fatal error: Uncaught TypeError

В данном примере функция sum ожидает целые числа и возвращает целое число. Если передать строку, будет выброшена ошибка типа.

Типичные проблемы: забывают включить declare(strict_types=1) в начале файла, что отключает строгую проверку. Также при работе с внешними данными (из БД, форм) требуется явное приведение типов.

Как использовать константы для неизменяемых данных?

Константы (define или const) подходят для хранения значений, которые не должны изменяться во время выполнения: настройки, версии, пути.

define('APP_NAME', 'MyApp');
const DB_HOST = 'localhost';
echo APP_NAME; // MyApp

Проблема: константы не могут быть изменены, но их можно переопределить в дочернем классе (для const в классах). Нельзя использовать для массивов с изменяемыми значениями.

Как организовать данные с помощью массивов?

Массивы - универсальный способ хранения наборов данных: индексированные, ассоциативные, многомерные.

$user = [
    'name' => 'Иван',
    'age' => 30,
    'roles' => ['admin', 'editor']
];
echo $user['name']; // Иван

Проблема: отсутствие строгой структуры - ключи могут быть пропущены или иметь разные типы. Для сложных данных лучше использовать объекты.

Как применить объекты для структурированных данных?

Классы и объекты обеспечивают инкапсуляцию, наследование и типизацию свойств. Можно определить класс User с типизированными свойствами.

class User {
    public string $name;
    public int $age;
    public array $roles;
}

$user = new User();
$user->name = 'Иван';
$user->age = 30;
$user->roles = ['admin'];
echo $user->name;

Проблема: требуется больше кода для определения класса, но это оправдано для сложной логики.

Расширенные примеры работы с данными

Деструктуризация массивов

Пример
$data = [1, 2, 3];
[$a, $b, $c] = $data;
echo "$a $b $c"; // 1 2 3
1 2 3

Анонимные классы для одноразовых объектов

Пример
$obj = new class('value') {
    private string $prop;
    public function __construct(string $prop) { $this->prop = $prop; }
    public function getProp(): string { return $this->prop; }
};
echo $obj->getProp(); // value
value

Генераторы для обработки больших наборов данных

Пример
function generateNumbers(int $limit): Generator {
    for ($i = 1; $i <= $limit; $i++) {
        yield $i;
    }
}
foreach (generateNumbers(5) as $num) {
    echo $num . ' ';
} // 1 2 3 4 5
1 2 3 4 5

Выражение match для ветвления по данным

Пример
$status = 200;
$message = match($status) {
    200 => 'OK',
    404 => 'Not Found',
    default => 'Unknown',
};
echo $message; // OK
OK

Переменные переменные (использовать с осторожностью)

Пример
$varName = 'price';
$$varName = 100;
echo $price; // 100

Функции compact и extract

Пример
$name = 'John';
$age = 25;
$arr = compact('name', 'age');
print_r($arr); // Array ( [name] => John [age] => 25 )

Статические переменные в функциях

Пример
function counter(): int {
    static $count = 0;
    return ++$count;
}
echo counter(); // 1
echo counter(); // 2

Данные в PHP коде - comments

En
Php данные в коде (php)