<?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.decon.php',
    1 => 'Конструкторы и деструкторы',
    2 => 'Конструкторы и деструкторы',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Классы и объекты',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.autoload.php',
    1 => 'Автоматическая загрузка классов',
  ),
  'next' => 
  array (
    0 => 'language.oop5.visibility.php',
    1 => 'Область видимости',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/oop5/decon.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.decon" class="sect1">
 <h2 class="title">Конструкторы и деструкторы</h2>

 <div class="sect2" id="language.oop5.decon.constructor">
  <h3 class="title">Конструктор</h3>
  <div class="methodsynopsis dc-description" id="object.construct">
   <span class="methodname"><strong>__construct</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">...$values</code><span class="initializer"> = &quot;&quot;</span></span>): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

  <p class="para">
   PHP разрешает разработчикам объявлять для классов методы-конструкторы.
   Классы с методом-конструктором автоматически вызывают этот метод для каждого
   создаваемого объекта, поэтому объявление конструктора
   удобно для установки начального состояния объекта — инициализации свойств и другой подготовки объекта к работе.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Конструктор родительского класса не вызывается автоматически
    при определении конструктора в дочернем классе.
    Внутри конструктора дочернего класса потребуется вызвать
    <span class="function"><strong>parent::__construct()</strong></span>, чтобы запустить конструктор родительского класса.
    Дочерний класс унаследует конструктор родительского класса как стандартный метод,
    если в дочернем классе конструктор не определили и родительский конструктор не закрытый.
   </span>
  </p></blockquote>
  <div class="example" id="example-1">
   <p><strong>Пример #1 Конструкторы при наследовании</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">BaseClass<br /></span><span style="color: #007700">{<br />   function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br />   {<br />       print </span><span style="color: #DD0000">"Конструктор класса BaseClass\n"</span><span style="color: #007700">;<br />   }<br />}<br /><br />class </span><span style="color: #0000BB">SubClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">BaseClass<br /></span><span style="color: #007700">{<br />   function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br />   {<br />       </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">__construct</span><span style="color: #007700">();<br />       print </span><span style="color: #DD0000">"Конструктор класса SubClass\n"</span><span style="color: #007700">;<br />   }<br />}<br /><br />class </span><span style="color: #0000BB">OtherSubClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">BaseClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Класс наследует конструктор класса BaseClass<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// Конструктор класса BaseClass<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">BaseClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Конструктор класса BaseClass<br />// Конструктор класса SubClass<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">SubClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Конструктор класса BaseClass<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">OtherSubClass</span><span style="color: #007700">();</span></span></code></div>
   </div>

  </div>
  <p class="para">
   В отличие от других методов, метод <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>
   освобождается <a href="language.oop5.basic.php#language.oop.lsp" class="link">от правил совместимости сигнатуры</a>
   при наследовании.
  </p>
  <p class="para">
   Конструкторы — обыкновенные методы, которые вызываются во время создания объекта
   класса с конструктором или объекта дочернего класса без конструктора.
   Поэтому в конструкторах определяют произвольное количество параметров,
   которые разрешено объявлять обязательными, типизированными, со значением по умолчанию.
   Параметры конструктора указываются в круглых скобках после имени класса.
  </p>
  <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">Point<br /></span><span style="color: #007700">{<br />    protected </span><span style="color: #0000BB">int $x</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">int $y</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 $x</span><span style="color: #007700">, </span><span style="color: #0000BB">int $y </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">x </span><span style="color: #007700">= </span><span style="color: #0000BB">$x</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">y </span><span style="color: #007700">= </span><span style="color: #0000BB">$y</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Передаём оба аргумента<br /></span><span style="color: #0000BB">$p1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Point</span><span style="color: #007700">(</span><span style="color: #0000BB">4</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Передаём только обязательные аргументы. Переменная $y содержит значение по умолчанию 0<br /></span><span style="color: #0000BB">$p2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Point</span><span style="color: #007700">(</span><span style="color: #0000BB">4</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Создаём объект с передачей именованных аргументов, которые поддерживаются начиная с PHP 8.0:<br /></span><span style="color: #0000BB">$p3 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Point</span><span style="color: #007700">(</span><span style="color: #0000BB">y</span><span style="color: #007700">: </span><span style="color: #0000BB">5</span><span style="color: #007700">, </span><span style="color: #0000BB">x</span><span style="color: #007700">: </span><span style="color: #0000BB">4</span><span style="color: #007700">);</span></span></code></div>
   </div>

  </div>
  <p class="para">
   Скобки после названия класса необязательны, если в классе не определили конструктор
   или конструктор класса не содержит обязательных параметров.
  </p>
  <div class="sect3">
   <h4 class="title">Конструкторы в старом стиле</h4>
   <p class="para">
    До PHP 8.0.0 классы в глобальном пространстве имён
    интерпретируют названный именем класса метод как конструктор старого стиля.
    Этот синтаксис устарел и вызовет ошибку уровня <strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong>,
    но всё равно вызовет этот метод как конструктор.
    PHP вызовет как конструктор метод <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>,
    если в классе определили и метод <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>,
    и метод с названием класса.
   </p>
   <p class="para">
    У метода, название которого совпадает с именем класса, нет особого значения
    в классах внутри пространства имён, а с PHP 8.0.0 — в любых классах.
   </p>
   <p class="para">
    В новом коде определяют только метод <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>.
   </p>
  </div>
  <div class="sect3" id="language.oop5.decon.constructor.promotion">
   <h4 class="title">Продвижение параметров конструктора до свойств класса</h4>
   <p class="para">
    С PHP 8.0.0 параметры конструктора стали поддерживать продвижение
    до свойств объекта. Это распространённая практика — присваивать
    свойствам объекта значения только за счёт аргументов, которые передали в конструктор.
    Определение свойств в конструкторе сокращает количество шаблонного кода. Предыдущий пример
    переписывается вот так:
   </p>
   <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">Point<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(protected </span><span style="color: #0000BB">int $x</span><span style="color: #007700">, protected </span><span style="color: #0000BB">int $y </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">) {}<br />}</span></span></code></div>
    </div>

   </div>
   <p class="para">
    PHP интерпретирует параметры с модификатором видимости одновременно и как параметр конструктора,
    и как свойство объекта, и устанавливает значение аргумента свойству.
    За счёт объявления свойств через параметры тело конструктора
    остаётся пустым, или включает другие инструкции, не связанные с инициализацией свойств.
    Конструктор выполнит дополнительные инструкции после присваивания значений аргументов
    свойствам.
   </p>
   <p class="para">
    Не каждому параметру конструктора требуется продвижение
    до свойства объекта. Поддерживается смешивание продвигаемых
    и стандартных параметров в произвольном порядке. Продвигаемые параметры
    не изменяют порядок вызова конструктора.
   </p>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <p class="para">
     <a href="language.oop5.visibility.php" class="link">Модификатор области видимости</a> —
     <code class="literal">public</code>, <code class="literal">protected</code> или <code class="literal">private</code> —
     наиболее вероятный способ применить продвинутую установку свойств,
     но любой другой модификатор, например <code class="literal">readonly</code>, даст такой же эффект.
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <p class="para">
     Нельзя указывать свойствам объекта тип <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>.
     Это связано с неоднозначностью, которую представляют вызываемые значения для движка PHP.
     Поэтому и для параметров конструктора, которые устанавливают классу свойства,
     тоже нельзя указывать тип <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>. Но остальные
     <a href="language.types.declarations.php" class="link">декларации типов</a> поддерживаются.
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <p class="para">
     PHP накладывает ограничения на именование параметров конструктора
     как к свойствам класса, так и к параметрам функции,
     поскольку при разборе кода PHP преобразовывает синтаксический сахар
     объявления свойств в конструкторе в декларирование свойств класса
     с теми же модификаторами видимости и типом данных, которые указали
     в продвигаемом до свойств объекта параметре, и присваивает значение
     аргумента и параметру функции, и свойству класса.
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <p class="para">
     На этапе определения конструктора <a href="language.attributes.php" class="link">атрибуты</a>
     продвигаемого до свойства параметра реплицируются как на параметр конструктора,
     так и на свойство класса, но значение по умолчанию PHP установит только параметру,
     но не свойству.
    </p>
   </p></blockquote>
  </div>

  <div class="sect3" id="language.oop5.decon.constructor.new">
   <h4 class="title">Ключевое слово new в инициализаторах</h4>
   <p class="para">
    В PHP 8.1.0 разрешили присваивать объекты как значения по умолчанию для параметров,
    как значения статических переменных и глобальных констант, а также как значения аргументов
    в атрибутах. Объекты также допустимо передавать в функцию <span class="function"><a href="function.define.php" class="function">define()</a></span>.
   </p>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <p class="para">
     При этом динамические или нестроковые имена классов или анонимных классов
     не разрешены. Использовать распаковку аргументов не разрешено.
     Неподдерживаемые выражения как аргументы не разрешены.
    </p>
   </p></blockquote>
   <div class="example" id="example-4">
    <p><strong>Пример #4 Пример ключевого слова new при инициализации объекта</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: #FF8000">// Всё допустимо:<br /></span><span style="color: #007700">static </span><span style="color: #0000BB">$x </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">();<br />const </span><span style="color: #0000BB">C </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">();<br /><br />function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$param </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">) {}<br /><br />#[</span><span style="color: #0000BB">AnAttribute</span><span style="color: #007700">(new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">)]<br />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 </span><span style="color: #0000BB">$prop </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">,<br />    ) {}<br />}<br /><br /></span><span style="color: #FF8000">// Всё запрещено (ошибка времени компиляции):<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">$a </span><span style="color: #007700">= new (</span><span style="color: #0000BB">CLASS_NAME_CONSTANT</span><span style="color: #007700">)(), </span><span style="color: #FF8000">// Динамическое имя класса<br />    </span><span style="color: #0000BB">$b </span><span style="color: #007700">= new class {}, </span><span style="color: #FF8000">// Анонимный класс<br />    </span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">(...[]), </span><span style="color: #FF8000">// Распаковка аргументов<br />    </span><span style="color: #0000BB">$d </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">(</span><span style="color: #0000BB">$abc</span><span style="color: #007700">), </span><span style="color: #FF8000">// Неподдерживаемое постоянное выражение<br /></span><span style="color: #007700">) {}</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect3" id="language.oop5.decon.constructor.static">
   <h4 class="title">Статические методы, которые создают объект класса</h4>
   <p class="para">
    PHP поддерживает только один конструктор для класса. Однако бывает так,
    что нужно создавать разные объекты для разных входных данных.
    Рекомендуемый способ — использовать статические методы как обёртки над конструктором.
   </p>
   <div class="example" id="example-5">
    <p><strong>Пример #5 Использование статических методов для создания объектов</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$some_json_string </span><span style="color: #007700">= </span><span style="color: #DD0000">'{ "id": 1004, "name": "Elephpant" }'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$some_xml_string </span><span style="color: #007700">= </span><span style="color: #DD0000">"&lt;animal&gt;&lt;id&gt;1005&lt;/id&gt;&lt;name&gt;Elephpant&lt;/name&gt;&lt;/animal&gt;"</span><span style="color: #007700">;<br /><br />class </span><span style="color: #0000BB">Product<br /></span><span style="color: #007700">{<br />    private ?</span><span style="color: #0000BB">int $id</span><span style="color: #007700">;<br />    private ?</span><span style="color: #0000BB">string $name</span><span style="color: #007700">;<br /><br />    private 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">null</span><span style="color: #007700">, ?</span><span style="color: #0000BB">string $name </span><span style="color: #007700">= </span><span style="color: #0000BB">null</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 />    public static function </span><span style="color: #0000BB">fromBasicData</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">): static<br />    {<br />        </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new static(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$name</span><span style="color: #007700">);<br />        return </span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />    }<br /><br />    public static function </span><span style="color: #0000BB">fromJson</span><span style="color: #007700">(</span><span style="color: #0000BB">string $json</span><span style="color: #007700">): static<br />    {<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">json_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">$json</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />        return new static(</span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'id'</span><span style="color: #007700">], </span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">]);<br />    }<br /><br />    public static function </span><span style="color: #0000BB">fromXml</span><span style="color: #007700">(</span><span style="color: #0000BB">string $xml</span><span style="color: #007700">): static<br />    {<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">simplexml_load_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml</span><span style="color: #007700">);<br />        </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new static();<br />        </span><span style="color: #0000BB">$new</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id </span><span style="color: #007700">= (int) </span><span style="color: #0000BB">$data</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$new</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$data</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br />        return </span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$p1 </span><span style="color: #007700">= </span><span style="color: #0000BB">Product</span><span style="color: #007700">::</span><span style="color: #0000BB">fromBasicData</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">, </span><span style="color: #DD0000">'Widget'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p2 </span><span style="color: #007700">= </span><span style="color: #0000BB">Product</span><span style="color: #007700">::</span><span style="color: #0000BB">fromJson</span><span style="color: #007700">(</span><span style="color: #0000BB">$some_json_string</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p3 </span><span style="color: #007700">= </span><span style="color: #0000BB">Product</span><span style="color: #007700">::</span><span style="color: #0000BB">fromXml</span><span style="color: #007700">(</span><span style="color: #0000BB">$some_xml_string</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$p1</span><span style="color: #007700">, </span><span style="color: #0000BB">$p2</span><span style="color: #007700">, </span><span style="color: #0000BB">$p3</span><span style="color: #007700">);</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Конструктор разрешено делать закрытым или защищённым, чтобы исключить
    вызов конструктора извне. Тогда создать объект класса получится только
    через статический метод. Доступ к закрытым методам класса есть и у конструктора,
    и у статического метода, поскольку конструктор, статический и закрытый методы
    определили в одном и том же классе, даже если один экземпляр объекта вызывает
    закрытый метод другого. Закрытый конструктор необязателен,
    и будет ли в закрытом конструкторе смысл, определяет ситуация.
   </p>
   <p class="para">
    В примере выше три открытых статических метода показывают разные способы,
    которыми они создают экземпляр объекта.
   </p>
   <ul class="simplelist">
    <li>
     Метод <code class="code">fromBasicData()</code> принимает конкретные параметры, создаёт экземпляр
     класса через конструктор и возвращает результат.
    </li>
    <li>
     Метод <code class="code">fromJson()</code> принимает JSON-строку и выполняет над
     строкой предварительную обработку, чтобы преобразовать строку в формат,
     который требует конструктор. Затем метод возвращает новый объект.
    </li>
    <li>
     Метод <code class="code">fromXml()</code> принимает XML-строку, предварительно обрабатывает её,
     а затем создаёт пустой объект. При этом PHP вызывает конструктор, но поскольку
     параметры конструктора необязательны, метод пропускает их. Затем непосредственно
     перед возвратом результата метод присваивает значения свойствам объекта.
    </li>
   </ul>
   <p class="para">
    В каждом из трёх случаев ключевое слово <code class="code">static</code> транслируется в имя класса,
    в котором вызвали код. В примере — в имя класса <code class="code">Product</code>.
   </p>
  </div>
 </div>

 <div class="sect2" id="language.oop5.decon.destructor">
  <h3 class="title">Деструкторы</h3>
  <div class="methodsynopsis dc-description" id="object.destruct">
   <span class="methodname"><strong>__destruct</strong></span>(): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

  <p class="para">
   Концепция деструктора PHP повторяет концепцию других объектно-ориентированных
   языков, например C++. PHP вызовет деструктор, как только не останется ссылок
   на конкретный объект, или в другом порядке в течение завершения работы.
  </p>
  <div class="example" id="example-6">
   <p><strong>Пример #6 Пример использования деструктора</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">MyDestructableClass<br /></span><span style="color: #007700">{<br />   function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">()<br />   {<br />       print </span><span style="color: #DD0000">"Конструктор\n"</span><span style="color: #007700">;<br />   }<br /><br />   function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">()<br />   {<br />       print </span><span style="color: #DD0000">"Уничтожается " </span><span style="color: #007700">. </span><span style="color: #0000BB">__CLASS__  </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />   }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyDestructableClass</span><span style="color: #007700">();</span></span></code></div>
   </div>

  </div>
  <p class="para">
   Как и конструкторы, движок PHP не будет неявно вызывать деструкторы,
   которые объявили в родительском классе. Необходимо вызвать <span class="function"><strong>parent::__destruct()</strong></span>
   в теле деструктора дочернего класса, чтобы запустить деструктор родительского класса.
   Аналогично конструкторам, дочерний класс, в котором
   не определен деструктор, наследует деструктор из родительского класса.
  </p>
  <p class="para">
   Движок вызовет деструктор, даже если выполнение скрипта
   остановила функция <span class="function"><a href="function.exit.php" class="function">exit()</a></span>. Вызов функции <span class="function"><a href="function.exit.php" class="function">exit()</a></span>
   в деструкторе предотвратит запуск остальных процедур завершения работы.
  </p>
  <p class="para">
   Деструктор, который создаёт новые ссылки на свой объект, не вызовется второй раз,
   когда счётчик ссылок снова достигнет нуля или при завершении работы программы.
  </p>
  <p class="para">
   Начиная с PHP 8.4.0 при запуске <a href="features.gc.collecting-cycles.php" class="link">сборки циклических ссылок</a>
   внутри <a href="language.fibers.php" class="link">файбера</a>
   деструкторы объектов-кандидатов на уничтожение выполняются в отдельном файбере,
   который называется <code class="literal">gc_destructor_fiber</code>.
   Сборщик создаст новый файбер сборки мусора для выполнения оставшихся деструкторов,
   если текущий файбер сборщика приостановили внутри деструктора уничтожаемого объекта.
   Сборщик мусора перестанет ссылаться на предыдущий файбер <code class="literal">gc_destructor_fiber</code>,
   который станет доступен для сборки, если на него не останется других ссылок.
   Уничтожение объектов с приостановленным деструктором откладывается
   до завершения выполнения деструктора или уничтожения самого файбера.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Движок отправляет HTTP-заголовки ещё до начала этапа завершения работы скрипта, на котором вызываются деструкторы.
    Относительные пути в деструкторах разрешаются в неожиданные абсолютные пути,
    когда SAPI наподобие веб-сервера Apache изменяют текущий рабочий каталог на этапе завершения работы скрипта.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Попытка выбросить исключение из деструктора, который вызвали на этапе
    завершения работы скрипта, вызовет фатальную ошибку.
   </p>
  </p></blockquote>
 </div>

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