Avatar ·

Что делает ключевое слово 'var' в PHP и зачем оно нужно?

Всем привет! Я только начал изучать PHP, и у меня возник вопрос по поводу ключевого слова `var`. Я наткнулся на старый код, где внутри класса используются `var` для объявления свойств: ```php class User { var $name; var $email; function __construct($name, $email) { $this->name = $name; $this->email = $email; } } ``` В современных учебниках я вижу, что все используют `public`, `private` или `protected`. Но `var` тоже работает — код выполняется без ошибок. Я не понимаю: зачем тогда нужно `var`, если есть модификаторы доступа? Может быть, это просто устаревший синоним `public`? Или у него есть какие-то особенности? Почему его до сих пор можно использовать, если он считается плохой практикой? Буду благодарен за развернутое объяснение с примерами. <<>>

Ключевое слово var в PHP: история и современное использование

Вы совершенно правы — var действительно является устаревшим синонимом для public в контексте объявления свойств класса. Давайте разберемся подробнее.

Исторический контекст

Когда в PHP 4 появились классы (объектно-ориентированное программирование), модификаторов доступа public, private и protected еще не существовало. Единственным способом объявить свойство класса было использование ключевого слова var. Все свойства, объявленные через var, были общедоступными — как public в современных версиях.

В PHP 5 (вышел в 2004 году) добавили полноценную поддержку модификаторов доступа, и var был объявлен устаревшим (deprecated). Однако разработчики PHP решили не удалять его полностью для обратной совместимости. В PHP 7 и 8 var по-прежнему работает, но его использование не рекомендуется.

Что делает var сейчас?

Начиная с PHP 5.0.0 и до текущих версий, var эквивалентен public. То есть:

class Example {
    var $property = 'value'; // То же самое, что:
    public $property = 'value';
}

Оба варианта создают общедоступное свойство, к которому можно обращаться из любого места программы.

Почему не стоит использовать var?

  • Устаревший синтаксис — код выглядит как из PHP 4, что может ввести в заблуждение других разработчиков.
  • Отсутствие гибкости — вы не сможете сделать свойство приватным или защищенным, не переписывая код.
  • Стандарты кодирования — современные фреймворки (Laravel, Symfony) и PSR-стандарты рекомендуют использовать явные модификаторы доступа.
  • IDE и анализаторы кода — многие инструменты могут выдавать предупреждения при использовании var.

Примеры для наглядности

Вот как выглядит современный код с правильным использованием модификаторов доступа:

class User {
    public $name;      // Доступно всем
    private $email;    // Только внутри класса
    protected $role;   // Внутри класса и в наследниках
    
    public function __construct($name, $email, $role = 'user') {
        $this->name = $name;
        $this->email = $email;
        $this->role = $role;
    }
    
    public function getEmail() {
        return $this->email; // Приватное свойство — только через геттер
    }
}

А это устаревший вариант с var:

class User {
    var $name;
    var $email;
    var $role;
    
    function __construct($name, $email, $role = 'user') {
        $this->name = $name;
        $this->email = $email;
        $this->role = $role;
    }
}

Во втором случае все свойства общедоступны — вы не можете контролировать доступ к ним. Например, кто-то может случайно изменить $email на некорректное значение напрямую, минуя валидацию.

Исключение: множественное объявление

Интересный факт: var позволяет объявлять несколько свойств в одной строке без указания модификатора для каждого, но это скорее синтаксический сахар:

class Test {
    var $a, $b, $c; // Все три — public
    // Аналог:
    public $a, $b, $c;
}

Вывод

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

<<>>

Дополнение: а как же типизация свойств?

Стоит также отметить, что var не поддерживает объявление типов свойств, которое появилось в PHP 7.4. Если вы используете современный PHP, вы можете (и должны) указывать тип для каждого свойства:

class User {
    public string $name;      // Тип string
    private string $email;    // Тип string
    protected int $roleId;    // Тип int
    
    // А вот с var указать тип нельзя:
    // var string $name; // Синтаксическая ошибка!
}

PHP 8.0 и 8.1 добавили еще больше возможностей: union-типы, mixed, readonly-свойства. Все это доступно только при использовании современных модификаторов доступа.

Если вы пишете новый проект — забудьте о var. Если встретили его в чужом коде — воспринимайте как маркер того, что код писался очень давно или неопытным разработчиком. При рефакторинге смело меняйте var на public — это абсолютно безопасно и никак не повлияет на работу кода.