LEARN X · ЗА 15 МИН

PHP

PHP за 15 минут: синтаксис, типы, строки, массивы, функции, ООП, исключения, формы, PDO и JSON — весь язык на одной странице через примеры кода.

PHP — серверный язык для веба: динамическая типизация, встроенная работа с HTTP и БД. Весь язык на одной странице — всё объяснено прямо в комментариях к коду.

1. Теги и вывод

PHP-код живёт внутри тегов; всё снаружи отправляется как обычный текст.

<?php
// Однострочный комментарий
# Тоже однострочный
/* Многострочный
   комментарий */

// echo выводит одну или несколько строк (это языковая конструкция, не функция)
echo "Привет";          // Привет
echo "a", "b", "c";       // abc

// print тоже выводит, но возвращает 1 (его можно использовать в выражении)
print "Мир\n";           // Мир

// printf — форматированный вывод
printf("%d + %d = %d\n", 2, 3, 5); // 2 + 3 = 5
?>
<!-- Этот HTML вне тегов уйдёт в браузер как есть -->
<?php echo "снова PHP"; ?>

2. Переменные и типы

Переменные начинаются с $, тип определяется значением.

<?php
$int    = 42;            // int
$float  = 3.14;          // float
$bool   = true;          // bool (true / false)
$string = "текст";       // string
$null   = null;          // null — отсутствие значения
$arr    = [1, 2, 3];     // array

// Узнать тип и содержимое
var_dump($int);          // int(42)
var_dump($bool);         // bool(true)
echo gettype($float);    // double

// Проверки типа
var_dump(is_int($int));  // bool(true)
var_dump(is_string($int));// bool(false)

// Приведение типов
$n = (int) "123abc";     // 123
$s = (string) 99;        // "99"

// Константы (не меняются)
const PI = 3.14159;
define("SITE", "codechick");
echo PI, SITE;
?>

3. Строки

Двойные кавычки понимают спецсимволы и подставляют переменные, одинарные — нет.

<?php
$name = "Аня";

// Одинарные кавычки — без интерполяции и \n
echo 'Привет, $name\n';   // Привет, $name\n  (буквально)

// Двойные кавычки — интерполяция и спецсимволы
echo "Привет, $name\n";   // Привет, Аня (с переносом)
echo "Длина: {$name}!\n"; // фигурные скобки для ясности границ

// Конкатенация через точку
$full = "Привет, " . $name . "!";
echo $full;               // Привет, Аня!

// Полезные функции
echo strlen("abc");       // 3 (байты)
echo mb_strlen("абв");    // 3 (символы UTF-8)
echo strtoupper("php");   // PHP
echo ucfirst("привет");   // Привет
echo str_replace("a", "o", "banana"); // bonono
echo trim("  x  ");       // x
echo substr("abcdef", 1, 3); // bcd
var_dump(str_contains("hello", "ell")); // bool(true)
echo implode("-", [1,2,3]);   // 1-2-3
print_r(explode(",", "a,b,c")); // [a, b, c]
?>

4. Операторы и условия

<?php
// Сравнение: == свободное, === строгое (с типом)
var_dump(0 == "0");      // bool(true)
var_dump(0 === "0");     // bool(false) — разные типы

$age = 18;
if ($age < 18) {
    echo "ребёнок";
} elseif ($age < 65) {
    echo "взрослый";     // сюда
} else {
    echo "пенсионер";
}

// switch
$day = 3;
switch ($day) {
    case 1: echo "Пн"; break;
    case 3: echo "Ср"; break;  // сюда
    default: echo "другой";
}

// match (PHP 8) — строгое сравнение, возвращает значение
$type = match($day) {
    1, 2, 3, 4, 5 => "будни",  // сюда
    6, 7          => "выходные",
};
echo $type;              // будни

// Тернарный оператор
$max = (5 > 3) ? 5 : 3;  // 5

// ?? — значение по умолчанию, если null/не задано
$user = $name ?? "гость";
// ?: — короткий тернарный (если левое истинно)
$x = "" ?: "пусто";      // пусто
?>

5. Циклы

<?php
// for
for ($i = 0; $i < 3; $i++) {
    echo $i;             // 012
}

// foreach — по массиву
$colors = ["красный", "зелёный"];
foreach ($colors as $c) {
    echo $c, " ";        // красный зелёный
}
// foreach с ключом и значением
$ages = ["Аня" => 25, "Боб" => 30];
foreach ($ages as $name => $age) {
    echo "$name: $age\n"; // Аня: 25 ...
}

// while
$n = 3;
while ($n > 0) {
    echo $n;             // 321
    $n--;
}

// do-while — тело выполнится хотя бы раз
do {
    echo "раз";          // раз
} while (false);

// break / continue
for ($i = 0; $i < 10; $i++) {
    if ($i == 2) continue; // пропустить 2
    if ($i == 4) break;    // остановиться на 4
    echo $i;               // 013
}
?>

6. Массивы

В PHP массив — это упорядоченная карта: и список, и словарь одновременно.

<?php
// Индексный массив
$nums = [10, 20, 30];
echo $nums[0];           // 10
$nums[] = 40;            // добавить в конец
count($nums);            // 4

// Ассоциативный массив (ключ => значение)
$user = [
    "name" => "Аня",
    "age"  => 25,
];
echo $user["name"];      // Аня
$user["city"] = "Москва";// добавить пару

// Полезные функции
$a = [3, 1, 2];
sort($a);                 // [1, 2, 3]
$b = array_map(fn($x) => $x * 2, [1, 2, 3]);  // [2, 4, 6]
$c = array_filter([1, 2, 3, 4], fn($x) => $x % 2 == 0); // [2, 4]
$sum = array_sum([1, 2, 3]);          // 6
var_dump(in_array(2, [1, 2, 3]));     // bool(true)
print_r(array_keys($user));           // [name, age, city]
print_r(array_merge([1], [2, 3]));    // [1, 2, 3]
$r = array_reduce([1,2,3], fn($acc, $x) => $acc + $x, 0); // 6
?>

7. Функции

<?php
// Базовая функция
function greet($name) {
    return "Привет, $name!";
}
echo greet("Аня");       // Привет, Аня!

// Аргумент по умолчанию
function power($base, $exp = 2) {
    return $base ** $exp;
}
echo power(3);           // 9
echo power(2, 3);        // 8

// Типизация аргументов и возврата
function add(int $a, int $b): int {
    return $a + $b;
}
echo add(2, 3);          // 5

// Стрелочная функция (PHP 7.4) — видит внешние переменные сама
$factor = 10;
$mul = fn($x) => $x * $factor;
echo $mul(5);            // 50

// Анонимная функция (нужен use для захвата)
$prefix = "№";
$label = function($n) use ($prefix) {
    return $prefix . $n;
};
echo $label(7);          // №7

// Variadic — приём любого числа аргументов
function total(...$nums) {
    return array_sum($nums);
}
echo total(1, 2, 3, 4);  // 10

// Именованные аргументы (PHP 8)
function box(int $w, int $h) { return $w * $h; }
echo box(h: 4, w: 3);    // 12
?>

8. Классы и ООП

<?php
class User {
    // Свойства с видимостью
    public string $name;
    protected int $age;       // доступно классу и наследникам
    private string $secret;   // только этому классу

    // Конструктор
    public function __construct(string $name, int $age) {
        $this->name = $name;  // $this — текущий объект
        $this->age  = $age;
        $this->secret = "токен";
    }

    // Метод
    public function greet(): string {
        return "Я {$this->name}, мне {$this->age}";
    }

    // Статическое свойство и метод
    public static int $count = 0;
    public static function create(string $name): static {
        self::$count++;
        return new static($name, 0);
    }
}

$u = new User("Аня", 25);
echo $u->name;            // Аня
echo $u->greet();         // Я Аня, мне 25

// Сокращённое объявление свойств в конструкторе (PHP 8)
class Point {
    public function __construct(
        public int $x = 0,
        public int $y = 0,
    ) {}
}
$p = new Point(3, 4);
echo $p->x;               // 3
?>

9. Наследование, интерфейсы, трейты

<?php
// Абстрактный класс — нельзя создать напрямую
abstract class Animal {
    public function __construct(protected string $name) {}
    abstract public function sound(): string; // должен реализовать наследник
    public function describe(): string {
        return "{$this->name} говорит {$this->sound()}";
    }
}

// Наследование через extends
class Dog extends Animal {
    public function sound(): string {
        return "гав";
    }
}
$d = new Dog("Рекс");
echo $d->describe();      // Рекс говорит гав

// Интерфейс — контракт
interface Serializable2 {
    public function toJson(): string;
}
class Config implements Serializable2 {
    public function __construct(private array $data) {}
    public function toJson(): string {
        return json_encode($this->data);
    }
}

// Трейт — переиспользуемый набор методов
trait Timestamped {
    public function now(): string {
        return date("Y-m-d");
    }
}
class Post {
    use Timestamped;
}
echo (new Post)->now();   // например 2026-06-16
?>

10. Исключения

<?php
function divide(int $a, int $b): float {
    if ($b === 0) {
        // throw — бросить исключение
        throw new InvalidArgumentException("Деление на ноль");
    }
    return $a / $b;
}

try {
    echo divide(10, 2);  // 5
    echo divide(10, 0);  // бросит исключение
} catch (InvalidArgumentException $e) {
    // ловим конкретный тип
    echo "Ошибка: " . $e->getMessage(); // Ошибка: Деление на ноль
} catch (Throwable $e) {
    // Throwable ловит вообще всё
    echo "Непредвиденное";
} finally {
    // выполнится в любом случае
    echo "\nГотово";
}

// Свой класс исключения
class PaymentException extends Exception {}
// throw new PaymentException("Недостаточно средств");
?>

11. Суперглобальные и формы

PHP автоматически наполняет суперглобальные массивы данными HTTP-запроса.

<?php
// $_GET — параметры из строки запроса:  page.php?q=php&n=5
$query = $_GET["q"] ?? "";        // безопасно с ??
$num   = (int)($_GET["n"] ?? 0); // приводим к int

// $_POST — данные отправленной формы
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $login = trim($_POST["login"] ?? "");
    // ВСЕГДА экранируй ввод перед выводом в HTML!
    echo htmlspecialchars($login); // защита от XSS
}

// Другие суперглобальные:
// $_SERVER  — данные сервера и запроса (URI, IP, заголовки)
// $_SESSION — сессия пользователя (после session_start())
// $_COOKIE  — куки
// $_FILES   — загруженные файлы
?>
<form method="post">
  <input name="login">
  <button>Войти</button>
</form>

12. Полезное: PDO, JSON, неймспейсы

<?php
// --- JSON ---
$data = ["name" => "Аня", "age" => 25];
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
echo $json;              // {"name":"Аня","age":25}
$back = json_decode($json, true); // true => в ассоц. массив
echo $back["name"];      // Аня

// --- PDO: работа с БД через подготовленные запросы ---
$pdo = new PDO("sqlite::memory:");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("CREATE TABLE users (id INTEGER, name TEXT)");

// Подготовленный запрос защищает от SQL-инъекций
$stmt = $pdo->prepare("INSERT INTO users VALUES (?, ?)");
$stmt->execute([1, "Аня"]);

$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([1]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo $row["name"];       // Аня
?>

<?php
// --- Неймспейсы: группировка кода и избежание конфликтов имён ---
namespace App\Models;

class Order {}

// В другом файле подключение:
// use App\Models\Order;
// $o = new Order();
//
// Автозагрузка классов обычно через Composer (composer.json -> PSR-4),
// тогда require вручную не нужен.
?>
Поддержать проект