Переменные-члены класса называются свойствами . На них можно ссылаться с использованием других терминов, таких как поля , но для целей этой ссылки будут использоваться свойства . Они определяются с помощью как минимум одного модификатора (например, Visibility , Static Keyword или, начиная с PHP 8.1.0, readonly ), опционально (кроме readonlyсвойств), начиная с PHP 7.4, за которым следует объявление типа, за которым следует обычное объявление переменной. Это объявление может включать инициализацию, но эта инициализация должна быть постоянным значением.

Примечание :

Устаревший способ объявления свойств класса — использование varключевого слова вместо модификатора.

Примечание . Свойство, объявленное без модификатора видимости , будет объявлено как public.

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

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

 

Пример #1 Объявления свойств

<?php
class SimpleClass
{
   public $var1 = 'hello ' . 'world';
   public $var2 = <<<EOD
hello world
EOD;
   public $var3 = 1+2;
   // invalid property declarations:
   public $var4 = self::myStaticMethod();
   public $var5 = $myVar;

   // valid property declarations:
   public $var6 = myConstant;
   public $var7 = [true, false];

   public $var8 = <<<'EOD'
hello world
EOD;

   // Without visibility modifier:
   static $var9;
   readonly int $var10;
}
?>

Примечание :

Существуют различные функции для обработки классов и объектов.

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

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

Пример #2 Пример типизированных свойств

<?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(1234, null);

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

?>

Приведенный выше пример выведет:

интервал(1234)
НУЛЕВОЙ

Типизированные свойства должны быть инициализированы перед доступом, иначе выдается ошибка .

Пример #3 Доступ к свойствам

<?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());
?>

Приведенный выше пример выведет:

строка(8) "треугольник"
интервал(3)
строка(6) "круг"

Неустранимая ошибка: Uncaught Error: Типизированное свойство Shape::$numberOfSides не должно быть доступно до инициализации

Свойства только для чтения

Начиная с PHP 8.1.0, свойство может быть объявлено с readonlyмодификатором, который предотвращает изменение свойства после инициализации.

Example #4 Пример свойств только для чтения

<?php

class Test {
   public readonly string $prop;

   public function __construct(string $prop) {
       // Legal initialization.
       $this->prop = $prop;
   }
}

$test = new Test("foobar");
// Legal read.
var_dump($test->prop); // string(6) "foobar"

// Illegal reassignment. It does not matter that the assigned value is the same.
$test->prop = "foobar";
// Error: Cannot modify readonly property Test::$prop
?>

Примечание :

Модификатор readonly может применяться только к типизированным свойствам . Свойство только для чтения без ограничений типа может быть создано с использованием смешанного типа.

Примечание :

Статические свойства только для чтения не поддерживаются.

Свойство только для чтения можно инициализировать только один раз и только из области, в которой оно было объявлено. Любое другое присвоение или изменение свойства приведет к исключению ошибки .

Пример #5 Недопустимая инициализация свойств только для чтения

<?php
class Test1 {
    public readonly string $prop;
}

$test1 = new Test1;
// Illegal initialization outside of private scope.
$test1->prop = "foobar";
// Error: Cannot initialize readonly property Test1::$prop from global scope
?>

Примечание :

Указание явного значения по умолчанию для свойств, доступных только для чтения, не допускается, потому что свойство только для чтения со значением по умолчанию по сути то же самое, что и константа, и поэтому не особенно полезно.

<?php

class Test {
    // Fatal error: Readonly property Test::$prop cannot have default value
    public readonly int $prop = 42;
}
?>

Примечание :

Свойства только для чтения не могут быть unset() после их инициализации. Однако можно сбросить свойство только для чтения до инициализации из области, в которой свойство было объявлено.

Модификации не обязательно являются простыми присваиваниями, все следующие действия также приведут к исключению Error :

<?php

class Test {
    public function __construct(
        public readonly int $i = 0,
        public readonly array $ary = [],
    ) {}
}

$test = new Test;
$test->i += 1;
$test->i++;
++$test->i;
$test->ary[] = 1;
$test->ary[0][] = 1;
$ref =& $test->i;
$test->i =& $ref;
byRef($test->i);
foreach ($test as &$prop);
?>

Однако свойства только для чтения не исключают внутренней изменчивости. Объекты (или ресурсы), хранящиеся в свойствах только для чтения, могут быть изменены внутри:

<?php

class Test {
    public function __construct(public readonly object $obj) {}
}

$test = new Test(new stdClass);
// Legal interior mutation.
$test->obj->foo = 1;
// Illegal reassignment.
$test->obj = new stdClass;
?>