Старт з нуля: PHP 8, Composer, перша програма, strict_types
PHP — мова, на якій працюють Facebook, Wikipedia, WordPress, Etsy, Slack, MailChimp. У 2026 році PHP — це не мова з 2000-х: PHP 8.3 — типобезпечний, швидкий, з модерним синтаксисом. Junior PHP-розробник може стартувати від $700-1200 в Україні.
Чому PHP
- Низький поріг входу — простіший за Java/C#, менш гімнічний за JS
- Величезна екосистема — Laravel, Symfony, тисячі пакетів через Composer
- Стабільний попит — WordPress = 40% інтернету, постійно треба підтримувати/розвивати
- Швидкий старт у фрилансі — багато sites, e-commerce, інтеграції
Що знадобиться
PHP 8.3+
# Ubuntu/Debian
sudo apt install php php-cli php-mbstring php-xml php-mysql php-curl
# Перевірити
php --version # PHP 8.3.x
⚠ У 2026 актуальний — PHP 8.3 або 8.4. PHP 7.x і нижче — застаріле, не вчи. PHP 5 — взагалі небезпечно.
Composer — менеджер пакетів
# Глобальна інсталяція
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version
Composer для PHP = npm для Node.js = pip для Python.
Git
Стандарт для будь-якої розробки. Якщо ще не встановив:
sudo apt install git
git config --global user.name "Ім'я"
git config --global user.email "email@example.com"
IDE
- PhpStorm (JetBrains) — найкращий для PHP, платний. Має 30-денний trial.
- VS Code + PHP Intelephense extension — безкоштовно, дуже годне.
Перша програма
hello.php:
<?php
echo "Привіт, PHP!\n";
$name = "Олена";
echo "Привіт, $name!\n"; // змінні розкриваються в подвійних лапках
echo 'Привіт, $name'; // в одинарних — буквально
$age = 25;
echo "Тобі $age років, через 10 буде " . ($age + 10) . "\n";
Запуск:
php hello.php
Структура PHP-файлу
<?php
// код тут
// $foo = 1;
?>
<?php— відкриває PHP-блок?>— закриває (опційно в чистих PHP-файлах — краще опустити, щоб не плутати з вивідом);— після кожної інструкції
Чистий .php (рекомендовано)
Тільки <?php на початку, без ?> в кінці:
<?php
declare(strict_types=1);
function greet(string $name): string {
return "Привіт, $name!";
}
echo greet("Олена");
Змішаний з HTML (старий стиль, але робочий)
<!DOCTYPE html>
<html>
<body>
<h1>Список</h1>
<ul>
<?php foreach (['яблуко', 'груша', 'слива'] as $fruit): ?>
<li><?= htmlspecialchars($fruit) ?></li>
<?php endforeach; ?>
</ul>
</body>
</html>
<?= ... ?> — короткий синтаксис для <?php echo ?>. У production-проєктах використовуй шаблонізатори (Blade, Twig) замість прямого змішування.
Базовий синтаксис
<?php
// Змінні — починаються з $
$name = "Олена";
$age = 25;
$isAdmin = false;
// Типи (PHP — динамічно типізована)
$int = 42; // int
$float = 3.14; // float
$str = "text"; // string
$bool = true; // bool
$arr = [1, 2, 3]; // array
$null = null;
$obj = new \stdClass(); // object
// Перевірка типу
var_dump($name); // string(5) "Олена" — для дебагу
echo gettype($age); // "integer"
// Конкатенація
$full = $name . " (" . $age . ")"; // .
$full = "{$name} ({$age})"; // у "" з фігурними дужками
// f-string в PHP — немає. Інтерполяція через "".
// Умови
if ($age >= 18) {
echo "Дорослий";
} elseif ($age >= 13) {
echo "Підліток";
} else {
echo "Дитина";
}
// Цикл
for ($i = 0; $i < 5; $i++) {
echo $i;
}
foreach ([1, 2, 3] as $n) {
echo $n;
}
// Функція
function add(int $a, int $b): int {
return $a + $b;
}
echo add(2, 3); // 5
strict_types — сувора типізація
<?php
declare(strict_types=1); // ⭐ найперший рядок файлу
function square(int $n): int {
return $n * $n;
}
square(5); // ✓ 25
square("5"); // ❌ TypeError (без strict — мовчки конвертує)
Завжди додавай declare(strict_types=1); — ловить багато помилок.
var_dump vs print_r vs echo
$arr = ['name' => 'Олена', 'age' => 25];
echo $arr; // ⚠ "Array" — некорисно
print_r($arr); // Array ( [name] => Олена [age] => 25 )
var_dump($arr); // array(2) { ["name"]=> string(5) "Олена" ["age"]=> int(25) }
Для дебагу: var_dump() найкорисніший — показує і тип, і структуру.
Тест: перевір себе
- У чому різниця між
"$name"і'$name'? - Що робить
declare(strict_types=1);? - Як вивести масив для дебагу?
- Що означає
<?= $x ?>? - Чому варто опустити
?>в кінці чистого PHP-файлу?
Відповіді
- У
"..."змінні розкриваються ($name→ значення). У'...'все буквально. - Робить функції строго типізованими: якщо очікується
int, передача рядка кинеTypeErrorзамість мовчазного перетворення. Найкраща практика. print_r($arr)для людиночитабельного вигляду.var_dump($arr)для дебагу — показує типи і вкладеність.- Скорочений запис для
<?php echo htmlspecialchars($x); ?>— ні, фактично<?php echo $x; ?>. Sanitize окремо. - Якщо є зайвий пробіл/новий рядок після
?>— він піде в HTTP-вивід. Це ламаєheader()(не можна слати header'и після виводу) і додає сміття до JSON-відповідей.