Свойства
Переменные, которые являются членами класса, называются свойства.
Также их называют, используя другие термины,
такие как атрибуты или поля, но в рамках этой документации,
мы будем называть их свойствами.
Они определяются с помощью ключевых слов 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(true, false);
// правильное определение свойства с 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(1234, null);
var_dump($user->id);
var_dump($user->name);
?>
Результат выполнения данного примера:
Перед обращением к типизированному свойству у него должно быть задано значение, иначе будет выброшено исключение
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