Свойства

Переменные, которые являются членами класса, называются свойства. Также их называют, используя другие термины, такие как атрибуты или поля, но в рамках этой документации, мы будем называть их свойствами. Они определяются с помощью ключевых слов public, protected или private, могут сопровождаться необязательным объявлением типа и следуют правилам правильного объявления переменных. Это объявление может содержать инициализацию, но эта инициализация должна быть постоянным значением, то есть значение должно быть вычислено во время компиляции и не должны зависеть от информации, полученной во время выполнения для их вычисления.

Смотрите Область видимости для получения информации о применении public, protected, и private.

Замечание:

Для того, чтобы поддерживать обратную совместимость с PHP 4, PHP 5 по-прежнему позволяет использовать ключевое слово var при определении свойств вместо (или в дополнении к) public, protected, или private. Однако var больше не требуется. В версиях PHP с 5.0 по 5.1.3 использование var считалось устаревшим и выдавало предупреждение E_STRICT, но с PHP 5.1.3 больше не считается устаревшим и не выдает предупреждения.

Если вы объявляете свойство с помощью var вместо public, protected или private, тогда PHP 5 будет рассматривать свойство так, как если оно было объявлено как public.

В пределах методов класса доступ к нестатическим свойствам может быть получен с помощью -> (объектного оператора): $this->property (где property - имя свойства). Доступ к статическим свойствам осуществляется с помощью :: (двойного двоеточия): self::$property. Дополнительную информацию о различии статических и нестатических свойств смотрите в разделе "Ключевое слово Static".

Псевдопеременная $this доступна внутри любого метода класса, когда этот метод вызывается из контекста объекта. $this - это ссылка на вызываемый объект (обычно это объект, к которому принадлежит метод, но возможно и другого объекта, если метод вызван статически из контекста второго объекта).

Пример #1 Определение свойств

<?php
class SimpleClass
{
   
// правильное определение свойства с PHP 5.6.0:
   
public $var1 'hello ' 'world';
   
// правильное определение свойства с PHP 5.3.0:
   
public $var2 = <<<EOD
hello world
EOD;
   
// правильное определение свойства с PHP 5.6.0:
   
public $var3 1+2;
   
// неправильное определение свойств:
   
public $var4 self::myStaticMethod();
   public 
$var5 $myVar;

   
// правильное определение свойств:
   
public $var6 myConstant;
   public 
$var7 = array(truefalse);

   
// правильное определение свойства с PHP 5.3.0:
   
public $var8 = <<<'EOD'
hello world
EOD;
}
?>

Замечание:

Существуют несколько интересных функций для обработки классов и объектов. Вы можете их увидеть тут Функции для классов/объектов.

Heredoc и Nowdoc

Начиная с PHP 5.3.0 heredocs и nowdocs могут быть использованы в любом статическом контексте данных, включая определение свойств.

Пример #2 Пример использования nowdoc для инициализации свойств

<?php
class foo {
   
// Начиная с PHP 5.3.0
   
public $bar = <<<'EOT'
bar
EOT;
   public 
$baz = <<<EOT
baz
EOT;
}
?>

Замечание:

Поддержка Nowdoc и Heredoc была добавлена в PHP 5.3.0.

Объявления типов

Начиная с PHP 7.4.0, в определении свойств могут быть указаны типы.

Пример #3 Пример использования типизированных свойств

<?php

class User
{
    public 
int $id;
    public ?
string $name;

    public function 
__construct(int $id, ?string $name)
    {
        
$this->id $id;
        
$this->name $name;
    }
}

$user = new User(1234null);

var_dump($user->id);
var_dump($user->name);

?>

Результат выполнения данного примера:

int(1234)
NULL

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

Пример #4 Обращение к свойствам

<?php

class Shape
{
    public 
int $numberOfSides;
    public 
string $name;

    public function 
setNumberOfSides(int $numberOfSides): void
    
{
        
$this->numberOfSides $numberOfSides;
    }

    public function 
setName(string $name): void
    
{
        
$this->name $name;
    }

    public function 
getNumberOfSides(): int
    
{
        return 
$this->numberOfSides;
    }

    public function 
getName(): string
    
{
        return 
$this->name;
    }
}

$triangle = new Shape();
$triangle->setName("triangle");
$triangle->setNumberofSides(3);
var_dump($triangle->getName());
var_dump($triangle->getNumberOfSides());

$circle = new Shape();
$circle->setName("circle");
var_dump($circle->getName());
var_dump($circle->getNumberOfSides());
?>

Результат выполнения данного примера:

string(8) "triangle"
int(3)
string(6) "circle"

Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be accessed before initialization

Допустимые типы свойств

Тип Описание Минимальная версия PHP
bool Свойство должно быть со значением типа bool. PHP 7.4.0
int Свойство должно быть со значением типа int. PHP 7.4.0
float Свойство должно быть со значением типа float. PHP 7.4.0
string Свойство должно быть со значением типа string. PHP 7.4.0
array Свойство должно быть со значением типа array. PHP 7.4.0
object Свойство должно быть со значением типа object. PHP 7.4.0
iterable Свойство должно быть со значением типа array или объектом интерфейса Traversable (используется instanceof). PHP 7.4.0
self Свойство должно иметь тот же самый класс, в котором оно определено (используется instanceof). PHP 7.4.0
parent Свойство должно иметь родительский класс объекта, в котором оно определено (используется instanceof). PHP 7.4.0
Имя класса/интерфейса Свойство должно иметь указанный класс или интерфейс (используется instanceof). PHP 7.4.0
?type Свойство должно быть со значением указанного типа, либо null. PHP 7.4.0