<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'language.oop5.properties.php',
    1 => 'Свойства',
    2 => 'Свойства',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Классы и объекты',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.basic.php',
    1 => 'Основы',
  ),
  'next' => 
  array (
    0 => 'language.oop5.property-hooks.php',
    1 => 'Хуки свойств',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/oop5/properties.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.properties" class="sect1">
 <h2 class="title">Свойства</h2>

 <p class="para">
  Переменные-члены класса называются <em>свойствами</em>.
  В других языках аналогичные элементы называются <em>полями</em> и другими терминами,
  но в PHP-документации
  переменные-члены класса называются <em>свойствами</em>.
  Свойства класса определяют хотя бы одним модификатором (которые описывают разделы
  «<a href="language.oop5.visibility.php" class="xref">Область видимости</a>», «<a href="language.oop5.static.php" class="xref">Ключевое слово static</a>»
  или начиная с PHP 8.1.0 <a href="language.oop5.properties.php#language.oop5.properties.readonly-properties" class="link">readonly</a>),
  за которым начиная с PHP 7.4 следует необязательное, за исключением <code class="code">readonly</code>-свойств,
  объявление типа, после которого идёт стандартное объявление переменной.
  При объявлении свойства класса переменную возможно инициализировать,
  но начальное значение переменной потребуется указать
  как <a href="language.constants.php" class="link">постоянное значение</a>.
 </p>
 <blockquote class="note"><p><strong class="note">Замечание</strong>: 
  <p class="para">
   Устаревший способ объявления свойств класса —
   ключевое слово <code class="literal">var</code> вместо модификатора.
  </p>
 </p></blockquote>
 <blockquote class="note"><p><strong class="note">Замечание</strong>: 
  <span class="simpara">
   Свойство, которое объявили без модификатора раздела «<a href="language.oop5.visibility.php" class="xref">Область видимости</a>»,
   PHP объявит как <code class="literal">public</code>.
  </span>
 </p></blockquote>
 <p class="para">
  Внутри методов класса доступ к нестатическим свойствам получают
  через оператор объекта <code class="literal">-&gt;</code> —
  <var class="varname">$this->property</var>, где <code class="literal">property</code> — имя свойства.
  Доступ к статическим свойствам получают через оператор двойного двоеточия <code class="literal">::</code> —
  <var class="varname">self::$property</var>. Дополнительную информацию об отличиях
  статических свойств от нестатических даёт раздел
  «<a href="language.oop5.static.php" class="xref">Ключевое слово static</a>».
 </p>
 <p class="para">
  Псевдопеременная <var class="varname">$this</var> доступна внутри
  каждого метода класса, если метод вызывается из контекста объекта.
  Переменная <var class="varname">$this</var> — значение вызывающего объекта.
 </p>

 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Пример #1 Объявление свойств</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">SimpleClass<br /></span><span style="color: #007700">{<br />   public </span><span style="color: #0000BB">$var1 </span><span style="color: #007700">= </span><span style="color: #DD0000">'hello ' </span><span style="color: #007700">. </span><span style="color: #DD0000">'world'</span><span style="color: #007700">;<br />   public </span><span style="color: #0000BB">$var2 </span><span style="color: #007700">= &lt;&lt;&lt;EOD<br /></span><span style="color: #DD0000">hello world<br /></span><span style="color: #007700">EOD;<br />   public </span><span style="color: #0000BB">$var3 </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">+</span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />   </span><span style="color: #FF8000">// Неправильное определение свойств:<br />   </span><span style="color: #007700">public </span><span style="color: #0000BB">$var4 </span><span style="color: #007700">= </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">myStaticMethod</span><span style="color: #007700">();<br />   public </span><span style="color: #0000BB">$var5 </span><span style="color: #007700">= </span><span style="color: #0000BB">$myVar</span><span style="color: #007700">;<br /><br />   </span><span style="color: #FF8000">// Правильное определение свойств:<br />   </span><span style="color: #007700">public </span><span style="color: #0000BB">$var6 </span><span style="color: #007700">= </span><span style="color: #0000BB">myConstant</span><span style="color: #007700">;<br />   public </span><span style="color: #0000BB">$var7 </span><span style="color: #007700">= [</span><span style="color: #0000BB">true</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">];<br /><br />   public </span><span style="color: #0000BB">$var8 </span><span style="color: #007700">= &lt;&lt;&lt;'EOD'<br /></span><span style="color: #DD0000">hello world<br /></span><span style="color: #007700">EOD;<br /><br />   </span><span style="color: #FF8000">// Без модификатора области видимости:<br />   </span><span style="color: #007700">static </span><span style="color: #0000BB">$var9</span><span style="color: #007700">;<br />   readonly </span><span style="color: #0000BB">int $var10</span><span style="color: #007700">;<br />}</span></span></code></div>
   </div>

  </div>
 </p>

 <blockquote class="note"><p><strong class="note">Замечание</strong>: 
  <p class="para">
   Классы и объекты обрабатывают набором функций.
   Смотрите раздел справки «<a href="ref.classobj.php" class="link">Функции работы с классами и объектами</a>».
  </p>
 </p></blockquote>

  <div class="sect2" id="language.oop5.properties.typed-properties">
   <h3 class="title">Объявления типов</h3>
   <p class="para">
    Начиная с PHP 7.4.0 определениям свойств разрешается включать «<a href="language.types.declarations.php" class="xref">Объявления типов</a>»,
    за исключением типа <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>.
    <div class="example" id="example-2">
     <p><strong>Пример #2 Пример типизированных свойств</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">User<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">int $id</span><span style="color: #007700">;<br />    public ?</span><span style="color: #0000BB">string $name</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">int $id</span><span style="color: #007700">, ?</span><span style="color: #0000BB">string $name</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id </span><span style="color: #007700">= </span><span style="color: #0000BB">$id</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$name</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$user </span><span style="color: #007700">= new </span><span style="color: #0000BB">User</span><span style="color: #007700">(</span><span style="color: #0000BB">1234</span><span style="color: #007700">, </span><span style="color: #0000BB">null</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$user</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$user</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">);</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
int(1234)
NULL
</pre></div>
     </div>
    </div>
   </p>

   <p class="para">
    При обращении к типизированному свойству, для которого не определили
    начальное значение, PHP выбросит исключение <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
    <div class="example" id="example-3">
     <p><strong>Пример #3 Обращение к свойствам</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Shape<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">int $numberOfSides</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">string $name</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">setNumberOfSides</span><span style="color: #007700">(</span><span style="color: #0000BB">int $numberOfSides</span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">numberOfSides </span><span style="color: #007700">= </span><span style="color: #0000BB">$numberOfSides</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #0000BB">string $name</span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$name</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">getNumberOfSides</span><span style="color: #007700">(): </span><span style="color: #0000BB">int<br />    </span><span style="color: #007700">{<br />        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">numberOfSides</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">getName</span><span style="color: #007700">(): </span><span style="color: #0000BB">string<br />    </span><span style="color: #007700">{<br />        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$triangle </span><span style="color: #007700">= new </span><span style="color: #0000BB">Shape</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$triangle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #DD0000">"triangle"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$triangle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setNumberofSides</span><span style="color: #007700">(</span><span style="color: #0000BB">3</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$triangle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getName</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$triangle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getNumberOfSides</span><span style="color: #007700">());<br /><br /></span><span style="color: #0000BB">$circle </span><span style="color: #007700">= new </span><span style="color: #0000BB">Shape</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$circle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #DD0000">"circle"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$circle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getName</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$circle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getNumberOfSides</span><span style="color: #007700">());</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
string(8) &quot;triangle&quot;
int(3)
string(6) &quot;circle&quot;

Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be accessed before initialization
</pre></div>
     </div>
    </div>
   </p>
  </div>

 <div class="sect2" id="language.oop5.properties.readonly-properties">
  <h3 class="title">Readonly-свойства</h3>
  <p class="para">
   Начиная с PHP 8.1.0 разрешили объявлять свойства с модификатором <code class="literal">readonly</code>,
   который запрещает изменять свойство после инициализации.
   До PHP 8.4.0 свойство с модификатором <code class="literal">readonly</code>
   автоматически получало закрытую видимость для установки значения,
   и записывать такое свойство можно было только в том же самом классе, в котором свойство объявили.
   С PHP 8.4.0 свойства с модификатором <code class="literal">readonly</code>
   автоматически получают защищённую видимость для установки значения
   <a href="language.oop5.visibility.php#language.oop5.visibility-members-aviz" class="link"><code class="literal">protected(set)</code></a>,
   поэтому устанавливать значения для такого свойства можно в дочернем классе.
   Видимость свойства для записи разрешается переопределять вручную.
   <div class="example" id="example-4">
    <p><strong>Пример #4 Примеры readonly-свойств</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Test<br /></span><span style="color: #007700">{<br />    public readonly </span><span style="color: #0000BB">string $prop</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">string $prop</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #FF8000">// Правильная инициализация.<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #0000BB">$prop</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$test </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">(</span><span style="color: #DD0000">"foobar"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Правильное чтение<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop</span><span style="color: #007700">); </span><span style="color: #FF8000">// string(6) "foobar"<br /><br />// Неправильное переопределение. Не имеет значения, что присвоенное значение такое же<br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #DD0000">"foobar"</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Error: Cannot modify readonly property Test::$prop</span></span></code></div>
    </div>

   </div>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <p class="para">
     Модификатор readonly разрешается применять только
     к <a href="language.oop5.properties.php#language.oop5.properties.typed-properties" class="link">типизированным свойствам</a>.
     Тип свойства объявляют как <a href="language.types.mixed.php" class="xref">Mixed</a>,
     когда требуется создать readonly-свойство без ограничений типа.
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <p class="para">
     Статические readonly-свойства не поддерживаются.
    </p>
   </p></blockquote>
  </p>
  <p class="para">
   Readonly-свойство разрешается инициализировать только один раз и только из области видимости,
   в которой свойство объявили.
   Другое присваивание или изменение свойства приведёт к исключению <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
   <div class="example" id="example-5">
    <p><strong>Пример #5 Неправильная инициализация readonly-свойств</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Test1<br /></span><span style="color: #007700">{<br />    public readonly </span><span style="color: #0000BB">string $prop</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$test1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test1</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Неправильная инициализация за пределами закрытой области<br /></span><span style="color: #0000BB">$test1</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #DD0000">"foobar"</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Error: Cannot initialize readonly property Test1::$prop from global scope</span></span></code></div>
    </div>

   </div>
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Нельзя явным образом указывать значение по умолчанию для readonly-свойств,
    потому что readonly-свойство со значением по умолчанию по существу совпадает
    с константой, и поэтому бесполезно.
    <div class="informalexample">
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Test<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Error: Readonly property Test::$prop cannot have default value<br />    </span><span style="color: #007700">public readonly </span><span style="color: #0000BB">int $prop </span><span style="color: #007700">= </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br />}</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Конструкцией <span class="function"><a href="function.unset.php" class="function">unset()</a></span> нельзя уничтожить readonly-свойство
    после инициализации.
    Однако получится уничтожить readonly-свойство до инициализации из области видимости,
    в которой свойство объявили.
   </p>
  </p></blockquote>
  <p class="para">
   К изменениям относятся не только стандартные присваивания, следующие изменения
   тоже выбросят ошибку <span class="classname"><a href="class.error.php" class="classname">Error</a></span>:
   <div class="informalexample">
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Test<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(<br />        public readonly </span><span style="color: #0000BB">int $i </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br />        public readonly array </span><span style="color: #0000BB">$ary </span><span style="color: #007700">= [],<br />    ) {}<br />}<br /><br /></span><span style="color: #0000BB">$test </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i </span><span style="color: #007700">+= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">++;<br />++</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ary</span><span style="color: #007700">[] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ary</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">][] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />unset(</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ary</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$ref </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$ref</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">byRef</span><span style="color: #007700">(</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">);<br />foreach (</span><span style="color: #0000BB">$test </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$prop</span><span style="color: #007700">);</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   При этом readonly-свойства не исключают внутреннюю изменчивость.
   Объекты и ресурсы, которые хранятся в readonly-свойствах,
   по-прежнему получится изменить внутри:
   <div class="informalexample">
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Test<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(public readonly </span><span style="color: #0000BB">object $obj</span><span style="color: #007700">) {}<br />}<br /><br /></span><span style="color: #0000BB">$test </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">(new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">());<br /><br /></span><span style="color: #FF8000">// Правильное внутреннее изменение<br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Неправильное переопределение<br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">();</span></span></code></div>
    </div>

   </div>
  </p>
   <p class="para">
    Начиная с PHP 8.3.0 свойства, доступные только для чтения, разрешается инициализировать повторно
    при клонировании объекта через магический метод <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>.
    <div class="example" id="example-6">
     <p><strong>Пример #6 Клонирование readonly-свойств</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Test1<br /></span><span style="color: #007700">{<br />    public readonly ?</span><span style="color: #0000BB">string $prop</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__clone</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">setProp</span><span style="color: #007700">(</span><span style="color: #0000BB">string $prop</span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #0000BB">$prop</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$test1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test1</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$test1</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setProp</span><span style="color: #007700">(</span><span style="color: #DD0000">'foobar'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$test2 </span><span style="color: #007700">= clone </span><span style="color: #0000BB">$test1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$test2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop</span><span style="color: #007700">); </span><span style="color: #FF8000">// NULL</span></span></code></div>
     </div>

    </div>
   </p>
 </div>

 <div class="sect2" id="language.oop5.properties.dynamic-properties">
  <h3 class="title">Динамические свойства</h3>
  <p class="para">
   При попытке присвоить несуществующее свойство объекту (<span class="type"><a href="language.types.object.php" class="type object">object</a></span>),
   PHP автоматически создаст такое свойство.
   Это динамически созданное свойство будет доступно
   <em>только</em> для этого экземпляра класса.
  </p>

  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="simpara">
    С PHP 8.2.0 динамические свойства устарели.
    Вместо динамического присваивания свойства классу рекомендуют объявлять свойство.
    Для обработки произвольных имён свойств
    класс должен реализовать магические методы
    <a href="language.oop5.overloading.php#object.get" class="link">__get()</a> и <a href="language.oop5.overloading.php#object.set" class="link">__set()</a>.
    В крайнем случае класс помечают атрибутом <code class="code">#[\AllowDynamicProperties]</code>.
   </p>
  </div>
 </div>

</div><?php manual_footer($setup); ?>