Справочник по синтаксису PHP: что означают эти символы? (PHP Syntax)
Полный справочник основных символов PHP
Давайте разберём все ключевые символы, которые вызывают путаницу у новичков. Ниже — подробные объяснения с примерами.
1. -> (стрелка) — Доступ к свойству/методу объекта
Используется для обращения к свойствам и методам объекта.
class User {
public $name;
public function sayHello() {
return "Привет, я {$this->name}";
}
}
$user = new User();
$user->name = 'Иван'; // установка свойства
echo $user->sayHello(); // вызов метода
2. => (двойная стрелка) — Ассоциативные массивы и foreach
Используется для задания ключа при создании массива, а также в цикле foreach для получения пары ключ->значение.
// Создание ассоциативного массива
$person = [
'name' => 'Мария',
'age' => 30
];
// Перебор массива
foreach ($person as $key => $value) {
echo "{$key}: {$value}<br>";
}
3. :: (двойное двоеточие) — Статический доступ (Scope Resolution Operator)
Используется для доступа к статическим свойствам, константам и методам класса, а также для вызова родительских методов.
class MathHelper {
const PI = 3.14;
public static function square($x) {
return $x * $x;
}
}
echo MathHelper::PI; // доступ к константе
echo MathHelper::square(5); // вызов статического метода
// Внутри класса для вызова родительского метода
class Child extends Parent {
public function method() {
parent::method(); // вызов метода родителя
$this->doSomething();
}
}
4. @ (собака) — Подавление ошибок
Подавляет вывод ошибок для выражения, к которому применяется. Используйте с осторожностью — лучше обрабатывать ошибки явно.
// Без @ выдаст Warning, если файл не найден
$content = @file_get_contents('nonexistent.txt');
// Лучший способ — проверка
if (file_exists('file.txt')) {
$content = file_get_contents('file.txt');
}
5. ... (три точки) — Spread-оператор (распаковка массивов) и Variadic-аргументы
В PHP 5.6+ — для функций с переменным числом аргументов. В PHP 7.4+ — для распаковки массивов.
// Variadic-аргументы: функция принимает любое количество параметров
function sum(...$numbers) {
return array_sum($numbers);
}
echo sum(1, 2, 3, 4); // 10
// Распаковка массива (PHP 7.4+)
$arr1 = [1, 2, 3];
$arr2 = [0, ...$arr1, 4]; // [0, 1, 2, 3, 4]
6. ?? (два вопроса) — Оператор объединения с null (Null Coalescing Operator)
Возвращает левый операнд, если он не равен null, иначе правый. Появился в PHP 7.0.
$username = $_GET['user'] ?? 'Гость';
// Эквивалентно: $username = isset($_GET['user']) ? $_GET['user'] : 'Гость';
// Можно цепочкой
$value = $a ?? $b ?? $c ?? 'default';
7. ?: (вопрос с двоеточием) — Тернарный оператор (сокращённая форма)
Сокращённая форма тернарного оператора. $a ?: $b возвращает $a, если оно приводится к true, иначе $b.
$name = $input ?: 'Аноним';
// Эквивалентно: $name = $input ? $input : 'Аноним';
// Полный тернарный оператор
$status = ($age >= 18) ? 'взрослый' : 'ребёнок';
Исправляем ваш пример
Теперь применим знания к вашему коду. Проблема была в приоритете операторов и неправильном использовании ??.
// Правильный вариант
$user = new User();
$user->name = 'Иван';
$user->age = 25;
echo ($user->name ?? 'Гость') .
($user->age >= 18 ? ' совершеннолетний' : ' несовершеннолетний');
Объяснение:
($user->name ?? 'Гость')— если имя не установлено, подставится 'Гость'- Тернарный оператор
($user->age >= 18 ? ... : ...)выбирает правильное сообщение - Скобки обязательны для правильного порядка вычислений
Бонус: Другие полезные символы
??=— оператор присваивания с null-объединением (PHP 7.4+):$a ??= $b;— присвоит $b, если $a равно null->с...— именованные аргументы (PHP 8.0+):func(name: 'Иван', age: 25)#— однострочный комментарий (стиль оболочки)/* */— многострочный комментарий
Надеюсь, эта шпаргалка поможет вам быстрее ориентироваться в коде!
<<Альтернативный подход: акцент на приоритет операторов и отладку
Когда вы комбинируете несколько операторов в одной строке (как в вашем примере), очень важно понимать приоритет операторов. В PHP он такой (от высшего к низшему для рассмотренных символов):
->,::— самый высокий приоритет@— подавление ошибок??— null-объединение?:— тернарный оператор.— конкатенация строк
Именно поэтому ваш первоначальный код работал неправильно: ?? выполнился раньше, чем конкатенация, и получилась каша. Всегда используйте круглые скобки, если сомневаетесь. Вот отладочная версия вашего кода, которая наглядно показывает, что происходит:
// Разобьём на этапы
$name = $user->name ?? 'Гость';
$ageStatus = $user->age >= 18 ? ' совершеннолетний' : ' несовершеннолетний';
$result = $name . $ageStatus;
echo $result; // Иван совершеннолетний
Ещё один совет: для сложных выражений лучше использовать многострочную запись с временными переменными — это повышает читаемость и упрощает отлад
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги