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