W3docs

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 для тех частей, которые являются истинным внешним интерфейсом объекта.

Связанные темы

Заключение

var — это пережиток PHP 4, который теперь ничем не отличается от public. Он по-прежнему работает, но скрывает намерение разработчика. В современном PHP объявляйте каждое свойство с public, protected или private, чтобы правила доступа в вашем коде были явными и самодокументирующимися.

Практика

Практика
В современном PHP ключевое слово 'var', используемое для объявления свойства класса, эквивалентно какому модификатору доступа?
В современном PHP ключевое слово 'var', используемое для объявления свойства класса, эквивалентно какому модификатору доступа?
Was this page helpful?