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