Перейти к содержимому

3. Синтаксис и переменные

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

  • Базовый синтаксис PHP
  • Переменные и их именование
  • Вывод данных (echo, print)
  • Комментарии в коде
  • Константы
  • Интерполяция строк

PHP-код всегда заключается в специальные теги:

<?php
// Ваш PHP-код здесь
?>
```text
**Важно:**
- Открывающий тег `<?php` обязателен
- Закрывающий тег `?>` можно опустить, если после него нет HTML
- Рекомендуется НЕ ставить `?>` в конце чистых PHP-файлов (без HTML)
### Правильное использование тегов
```php
<?php
// ✅ Правильно: чистый PHP-файл без закрывающего тега
echo "Hello, World!";
echo "Еще одна строка";
```text
```php
<?php
// ✅ Правильно: PHP + HTML
echo "<h1>Заголовок</h1>";
?>
<p>Это обычный HTML</p>
<?php
echo "<p>Снова PHP</p>";
?>
```text
```php
<?php
// ❌ Неправильно: пробелы после закрывающего тега могут вызвать проблемы
echo "Test";
?>
```text
### Точка с запятой
Каждая инструкция в PHP должна заканчиваться точкой с запятой:
```php
<?php
echo "Привет"; // ✅ Правильно
echo "Мир"; // ✅ Правильно
echo "Привет" // ❌ Ошибка: пропущена точка с запятой
echo "Мир";
?>
```text
**Исключение:** Последняя инструкция перед `?>` может не иметь точки с запятой (но лучше ставить всегда).
### Регистр (case sensitivity)
PHP **частично** чувствителен к регистру:
```php
<?php
// ✅ Ключевые слова НЕ чувствительны к регистру
ECHO "Test";
Echo "Test";
echo "Test"; // Все работает одинаково
// ✅ Имена функций НЕ чувствительны
STRLEN("test");
strlen("test");
StrLen("test"); // Все одинаково
// ❌ Переменные ЧУВСТВИТЕЛЬНЫ к регистру
$name = "Иван";
$Name = "Петр";
$NAME = "Сергей";
// Это три РАЗНЫЕ переменные!
echo $name; // Иван
echo $Name; // Петр
echo $NAME; // Сергей
?>
```text
**Рекомендация:** Используйте единый стиль — обычно lowercase для ключевых слов и функций.
## Переменные
Переменные в PHP начинаются со знака доллара `$`.
### Объявление переменных
```php
<?php
// Переменные объявляются при первом присваивании
$name = "Алексей";
$age = 25;
$price = 99.99;
$isActive = true;
// В PHP не нужно указывать тип — он определяется автоматически
?>
```text
### Правила именования переменных
```php
<?php
// ✅ Правильные имена
$name
$firstName
$first_name
$_private
$number1
$userName2
// ❌ Неправильные имена
$1number // Не может начинаться с цифры
$first-name // Нельзя использовать дефис
$first name // Нельзя использовать пробелы
$@name // Спецсимволы запрещены
?>
```text
**Best practices:**
- Используйте осмысленные имена: `$userName` вместо `$un`
- camelCase или snake_case (будьте последовательны)
- Для констант: UPPER_SNAKE_CASE
### Примеры хороших имен
```php
<?php
// ✅ Хорошо: понятно, что хранится
$userEmail = "[email protected]";
$productPrice = 1500;
$isAuthenticated = true;
$orderItemsCount = 5;
// ❌ Плохо: непонятно
$p = 1500;
$flag = true;
$n = 5;
?>
```text
## Типы переменных (введение)
PHP — динамически типизированный язык, но у переменных есть типы:
```php
<?php
// Строка (string)
$name = "Мария";
$message = 'Привет!';
// Целое число (integer)
$age = 30;
$count = -5;
// Число с плавающей точкой (float/double)
$price = 99.99;
$pi = 3.14159;
// Булево значение (boolean)
$isActive = true;
$isDeleted = false;
// Массив (array)
$colors = ["red", "green", "blue"];
$user = ["name" => "Иван", "age" => 25];
// NULL (отсутствие значения)
$emptyValue = null;
// Проверка типа
echo gettype($name); // string
echo gettype($age); // integer
echo gettype($isActive); // boolean
?>
```text
### Приведение типов
PHP автоматически преобразует типы при необходимости:
```php
<?php
$a = "5"; // Строка
$b = 10; // Число
$result = $a + $b; // PHP преобразует "5" в 5
echo $result; // 15
// Явное приведение типов
$string = "123.45";
$integer = (int)$string; // 123
$float = (float)$string; // 123.45
$boolean = (bool)$string; // true
echo $integer; // 123
echo $float; // 123.45
var_dump($boolean); // bool(true)
?>
```text
## Вывод данных
### echo — основной способ вывода
```php
<?php
// Простой вывод
echo "Привет, мир!";
// Вывод нескольких значений
echo "Привет", " ", "мир", "!";
// Вывод переменных
$name = "Алексей";
echo "Привет, $name!";
// Вывод HTML
echo "<h1>Заголовок</h1>";
echo "<p>Параграф текста</p>";
// Вывод с конкатенацией
$firstName = "Иван";
$lastName = "Иванов";
echo "Полное имя: " . $firstName . " " . $lastName;
?>
```text
### print — альтернатива echo
```php
<?php
// print работает почти как echo
print "Привет!";
// Главное отличие: print возвращает 1
$result = print "Test"; // Выведет "Test" и вернет 1
// print не может выводить несколько аргументов
print "Hello", " World"; // ❌ Ошибка
echo "Hello", " World"; // ✅ Работает
?>
```text
**На практике:** Используйте `echo` — он быстрее и гибче.
### var_dump — вывод для отладки
```php
<?php
$data = ["name" => "Иван", "age" => 25, "active" => true];
// var_dump показывает тип и значение
var_dump($data);
// Выведет:
// array(3) {
// ["name"]=>
// string(8) "Иван"
// ["age"]=>
// int(25)
// ["active"]=>
// bool(true)
// }
// Для более читабельного вывода оберните в <pre>
echo "<pre>";
var_dump($data);
echo "</pre>";
?>
```text
### print_r — человекочитаемый вывод
```php
<?php
$user = [
"name" => "Мария",
"email" => "[email protected]",
"roles" => ["admin", "editor"]
];
echo "<pre>";
print_r($user);
echo "</pre>";
// Выведет:
// Array
// (
// [name] => Мария
// [email] => [email protected]
// [roles] => Array
// (
// [0] => admin
// [1] => editor
// )
// )
?>
```text
## Интерполяция строк
PHP позволяет вставлять переменные прямо в строки.
### Двойные кавычки (интерполяция работает)
```php
<?php
$name = "Алексей";
$age = 25;
// ✅ Переменные обрабатываются
echo "Меня зовут $name, мне $age лет.";
// Выведет: Меня зовут Алексей, мне 25 лет.
// Сложные выражения в фигурных скобках
$user = ["name" => "Иван", "age" => 30];
echo "Пользователь: {$user['name']}, возраст: {$user['age']}";
?>
```text
### Одинарные кавычки (без интерполяции)
```php
<?php
$name = "Алексей";
// ❌ Переменные НЕ обрабатываются
echo 'Меня зовут $name';
// Выведет: Меня зовут $name
// ✅ Используйте одинарные кавычки для обычных строк
echo 'Это обычная строка без переменных';
// Для переменных нужна конкатенация
echo 'Меня зовут ' . $name;
?>
```text
### Когда использовать что
```php
<?php
// ✅ Двойные кавычки — когда есть переменные
$greeting = "Привет, $name!";
// ✅ Одинарные кавычки — для обычных строк (чуть быстрее)
$message = 'Постоянный текст';
// ✅ Конкатенация — для сложных выражений
$fullName = $firstName . ' ' . $lastName;
$url = $baseUrl . '/page/' . $pageNumber;
?>
```text
## Конкатенация строк
Оператор `.` соединяет строки:
```php
<?php
$firstName = "Иван";
$lastName = "Петров";
// Простая конкатенация
$fullName = $firstName . " " . $lastName;
echo $fullName; // Иван Петров
// Конкатенация с присваиванием (.=)
$message = "Привет";
$message .= ", ";
$message .= $firstName;
$message .= "!";
echo $message; // Привет, Иван!
// Сложное выражение
$html = '<div class="user">';
$html .= '<h2>' . $fullName . '</h2>';
$html .= '<p>Email: ' . $email . '</p>';
$html .= '</div>';
echo $html;
?>
```text
## Комментарии
Комментарии игнорируются PHP и нужны для пояснений в коде.
### Однострочные комментарии
```php
<?php
// Это однострочный комментарий
echo "Hello"; // Комментарий в конце строки
# Тоже однострочный комментарий (но // предпочтительнее)
?>
```text
### Многострочные комментарии
```php
<?php
/*
* Это многострочный комментарий
* Может занимать несколько строк
* Удобно для длинных пояснений
*/
/*
* Функция для расчета скидки
*
* @param float $price Базовая цена
* @param int $discount Процент скидки
* @return float Цена со скидкой
*/
function calculateDiscount($price, $discount) {
return $price - ($price * $discount / 100);
}
?>
```text
### PHPDoc — документирующие комментарии
```php
<?php
/**
* Класс для работы с пользователями
*
* @package App\Models
* @author Ваше имя
* @version 1.0.0
*/
class User
{
/**
* Имя пользователя
*
* @var string
*/
private $name;
/**
* Получить имя пользователя
*
* @return string Имя пользователя
*/
public function getName(): string
{
return $this->name;
}
}
?>
```text
### Лучшие практики комментирования
```php
<?php
// ✅ Хорошо: объясняет ПОЧЕМУ
// Используем bcrypt вместо md5 для безопасности
$hash = password_hash($password, PASSWORD_BCRYPT);
// ❌ Плохо: описывает очевидное
// Присваиваем переменной значение 5
$count = 5;
// ✅ Хорошо: предупреждает о неочевидном поведении
// Важно: эта функция возвращает false, если файл не найден
$content = file_get_contents($filename);
// ✅ Хорошо: TODO для будущих доработок
// TODO: Добавить валидацию email
$email = $_POST['email'];
?>
```text
## Константы
Константы — это значения, которые нельзя изменить после определения.
### Определение констант
```php
<?php
// Способ 1: функция define()
define('SITE_NAME', 'Мой сайт');
define('MAX_LOGIN_ATTEMPTS', 3);
define('PI', 3.14159);
echo SITE_NAME; // Мой сайт
// Способ 2: const (PHP 5.3+, только в области видимости)
const DB_HOST = 'localhost';
const DB_USER = 'root';
// ❌ Константу нельзя изменить
define('TAX_RATE', 0.20);
define('TAX_RATE', 0.25); // Warning: constant already defined
?>
```text
### Соглашения об именовании констант
```php
<?php
// ✅ Константы пишутся ЗАГЛАВНЫМИ буквами
define('MAX_FILE_SIZE', 5242880); // 5 MB
define('ALLOWED_EXTENSIONS', ['jpg', 'png', 'gif']);
// Для логических групп используйте префиксы
define('DB_HOST', 'localhost');
define('DB_PORT', 3306);
define('DB_NAME', 'myapp');
?>
```text
### Магические константы
PHP предоставляет специальные константы:
```php
<?php
echo __FILE__; // Полный путь к файлу
echo __DIR__; // Директория файла
echo __LINE__; // Номер текущей строки
echo __FUNCTION__; // Имя функции
echo __CLASS__; // Имя класса
echo __METHOD__; // Имя метода класса
// Пример использования
function debugInfo() {
echo "Выполняется функция: " . __FUNCTION__ . " в строке " . __LINE__;
}
?>
```text
## Переменные переменных
PHP позволяет использовать значение одной переменной как имя другой:
```php
<?php
$var = "name";
$$var = "Иван"; // Создает переменную $name = "Иван"
echo $name; // Иван
echo $$var; // Иван (то же самое)
// Практический пример
$field = "username";
$$field = "admin"; // Создает $username = "admin"
echo $username; // admin
?>
```text
**Осторожно:** Переменные переменных усложняют код. Используйте только когда действительно необходимо.
## Область видимости переменных
Переменные имеют разную область видимости (scope).
### Глобальная область
```php
<?php
$globalVar = "Я глобальная";
function test() {
// ❌ Внутри функции глобальные переменные недоступны
echo $globalVar; // Warning: undefined variable
}
test();
?>
```text
### Использование global
```php
<?php
$siteName = "Мой сайт";
function showSiteName() {
global $siteName; // Делаем переменную доступной
echo $siteName;
}
showSiteName(); // Мой сайт
?>
```text
### Локальная область
```php
<?php
function calculate() {
$result = 10 + 20; // Локальная переменная
echo $result;
}
calculate(); // 30
// ❌ Вне функции переменная недоступна
echo $result; // Warning: undefined variable
?>
```text
## Примеры из реальной практики
### Пример 1: Приветствие пользователя
```php
<?php
$userName = "Алексей";
$currentHour = date("H");
if ($currentHour < 12) {
$greeting = "Доброе утро";
} elseif ($currentHour < 18) {
$greeting = "Добрый день";
} else {
$greeting = "Добрый вечер";
}
echo "<h1>$greeting, $userName!</h1>";
?>
```text
### Пример 2: Расчет скидки
```php
<?php
$productName = "Ноутбук";
$originalPrice = 50000;
$discountPercent = 15;
$discountAmount = $originalPrice * ($discountPercent / 100);
$finalPrice = $originalPrice - $discountAmount;
echo "<div class='product'>";
echo "<h2>$productName</h2>";
echo "<p>Цена: <s>$originalPrice руб.</s></p>";
echo "<p>Скидка: $discountPercent%</p>";
echo "<p class='price'>$finalPrice руб.</p>";
echo "</div>";
?>
```text
### Пример 3: Генерация meta-тегов
```php
<?php
$pageTitle = "Главная страница";
$pageDescription = "Добро пожаловать на наш сайт";
$pageKeywords = "главная, сайт, php";
$metaTags = <<<HTML
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>$pageTitle</title>
<meta name="description" content="$pageDescription">
<meta name="keywords" content="$pageKeywords">
HTML;
echo $metaTags;
?>
```text
## WordPress контекст
В WordPress переменные и функции используются повсеместно.
### Вывод данных в теме
```php
<?php
// Получение данных через функции WordPress
$site_name = get_bloginfo('name');
$site_description = get_bloginfo('description');
$current_year = date('Y');
// Вывод в шаблоне
?>
<header>
<h1><?php echo $site_name; ?></h1>
<p><?php echo $site_description; ?></p>
</header>
<footer>
<p>&copy; <?php echo $current_year; ?> <?php echo $site_name; ?></p>
</footer>
```text
### Кастомные переменные в WordPress
```php
<?php
// Получение мета-полей поста
$post_views = get_post_meta(get_the_ID(), 'views', true);
$featured_text = get_post_meta(get_the_ID(), 'featured_text', true);
// Использование в шаблоне
if ($featured_text) {
echo '<div class="featured">' . esc_html($featured_text) . '</div>';
}
echo '<p>Просмотров: ' . absint($post_views) . '</p>';
?>
```text
### Настройки темы
```php
<?php
// Определение констант темы
define('THEME_VERSION', '1.0.0');
define('THEME_DIR', get_template_directory());
define('THEME_URL', get_template_directory_uri());
// Использование
echo '<link rel="stylesheet" href="' . THEME_URL . '/style.css?v=' . THEME_VERSION . '">';
?>
```text
## Практика
### Задание 1: Калькулятор возраста
Создайте скрипт, который:
- Хранит год рождения в переменной
- Вычисляет текущий возраст
- Выводит красиво оформленное сообщение
```php
<?php
$birthYear = 1995;
$currentYear = date("Y");
$age = $currentYear - $birthYear;
echo "<p>Вы родились в $birthYear году. Вам $age лет.</p>";
?>
```text
### Задание 2: Карточка товара
Создайте переменные для товара (название, цена, наличие) и выведите HTML-карточку.
### Задание 3: Генератор приветствий
Создайте скрипт, который выводит разные приветствия в зависимости от дня недели.
### Задание 4: Комментирование
Возьмите любой код из предыдущих заданий и добавьте к нему подробные комментарии.
### Задание 5: Эксперименты
Попробуйте:
- Создать переменные разных типов
- Использовать `var_dump()` для их исследования
- Поэкспериментировать с конкатенацией и интерполяцией
- Создать несколько констант
## Онлайн-редакторы
Протестируйте примеры в онлайн-редакторах:
- **PHPSandbox**: https://phpsandbox.io/
- **3v4l**: https://3v4l.org/
## Итоги
В этом уроке вы изучили:
✅ **Базовый синтаксис PHP** — теги, точки с запятой, регистр
✅ **Переменные** — создание, именование, типы
✅ **Вывод данных** — echo, print, var_dump
✅ **Интерполяция строк** — вставка переменных в текст
✅ **Комментарии** — однострочные, многострочные, PHPDoc
✅ **Константы** — создание неизменяемых значений
✅ **Примеры из практики** — реальное применение
### Следующий шаг
Теперь мы готовы перейти к изучению типов данных: [Типы данных](/php/types/)
### Ключевые моменты
1. **$ начинает переменную** — всегда помните про доллар
2. **Точка с запятой обязательна** — завершайте инструкции
3. **Осмысленные имена** — код должен читаться как текст
4. **Комментируйте сложное** — но не переусердствуйте
5. **echo — ваш лучший друг** — для вывода и отладки
**Совет:** Создайте тестовый файл `playground.php` и экспериментируйте с примерами из урока!
---
**Готовы двигаться дальше?** Переходите к следующему уроку: [Типы данных](/php/types/)