var
Ключевое слово var в PHP используется для объявления свойств класса. В современном PHP оно является синонимом public и считается устаревшим.
Ключевое слово var в PHP
var — устаревшее ключевое слово для объявления свойства класса в PHP. Оно появилось в PHP 4, когда у классов не было модификаторов доступа и все свойства были фактически публичными. В современном PHP var сохранено только для обратной совместимости — начиная с PHP 5 оно является точным синонимом public.
На этой странице рассматривается, что делает var, как оно соотносится с модификаторами public / private / protected, которые пришли ему на смену, и почему не стоит использовать его в новом коде.
var — это то же самое, что public
Главное, что нужно помнить: свойство, объявленное с var, ведёт себя идентично свойству, объявленному с public. Оба доступны для чтения и записи откуда угодно — внутри класса, в подклассах и снаружи.
<?php
class User {
var $name = "Guest"; // legacy syntax
}
class Account {
public $name = "Guest"; // modern equivalent — exactly the same behavior
}
$a = new User();
$b = new Account();
echo $a->name . "\n"; // Guest
echo $b->name . "\n"; // Guest
$a->name = "Alice"; // both properties are publicly writable
$b->name = "Bob";
echo $a->name . "\n"; // Alice
echo $b->name . "\n"; // BobПоскольку они эквивалентны, смешивать var и public в одном классе допустимо, но неудобно — выберите public и придерживайтесь единого стиля.
Синтаксис
Свойство var может быть объявлено с начальным значением или без него, а также можно перечислить несколько свойств на одной строке:
<?php
class Config {
var $host; // no default → null
var $port = 8080; // with a default value
var $debug = false, $cache = true; // multiple at once
}
$c = new Config();
var_dump($c->host); // NULL
echo $c->port . "\n"; // 8080
var_dump($c->debug); // bool(false)Значение по умолчанию должно быть константным выражением (литерал, константа или массив из них) — оно не может быть результатом вызова функции или другого объекта.
Почему var был заменён
PHP 5 ввёл настоящую видимость с тремя модификаторами доступа, а var просто не мог выразить разницу между ними:
| Модификатор | Доступен из |
|---|---|
public | откуда угодно (то же самое, что var) |
protected | самого класса и его подклассов |
private | только объявляющего класса |
<?php
class BankAccount {
public $owner; // readable everywhere
protected $type; // class + subclasses
private $balance = 0; // this class only
public function deposit(int $amount): void {
$this->balance += $amount; // allowed: same class
}
public function getBalance(): int {
return $this->balance;
}
}
$acc = new BankAccount();
$acc->owner = "Alice"; // OK — public
$acc->deposit(100);
echo $acc->getBalance(); // 100
// echo $acc->balance; // Fatal error: Cannot access private propertyИнкапсуляция $balance как private вынуждает все изменения проходить через deposit(), поэтому класс управляет собственным состоянием. Именно такой гарантии var дать не может — вот почему явные модификаторы стали стандартом.
Подводные камни
- Это не
varиз JavaScript. PHP-шныйvarслужит только для объявления свойства класса. Локальные переменные внутри функций записываются как$x = 1;— без ключевого слова. - Не комбинируйте его с модификатором.
var public $x;— синтаксическая ошибка:varсам является модификатором. - Типизированные свойства его не используют. Начиная с PHP 7.4 пишут
public int $port;. Вариантvar int $port;не существует.
Рекомендации
Не используйте var в новом коде. Всегда явно объявляйте видимость, чтобы читатель сразу понимал предполагаемый уровень доступа:
- По умолчанию выбирайте наиболее ограничительную видимость, которая всё ещё работает — как правило,
private, предоставляя данные через методы. - Используйте
protected, когда подклассам действительно нужен доступ. - Оставляйте
publicдля тех частей, которые являются истинным внешним интерфейсом объекта.
Связанные темы
- Модификаторы доступа PHP —
public,privateиprotectedподробно. - Ключевые слова PHP
publicи PHPprivate. - Классы и объекты PHP и ключевое слово
class. - Конструктор PHP — инициализация свойств при создании объекта.
Заключение
var — это пережиток PHP 4, который теперь ничем не отличается от public. Он по-прежнему работает, но скрывает намерение разработчика. В современном PHP объявляйте каждое свойство с public, protected или private, чтобы правила доступа в вашем коде были явными и самодокументирующимися.