<?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 => 'uk',
  ),
  'this' => 
  array (
    0 => 'language.oop5.decon.php',
    1 => 'Конструктори та деструктори',
    2 => 'Конструктори та деструктори',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Класи та об\'єкти',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.autoload.php',
    1 => 'Autoloading Classes',
  ),
  'next' => 
  array (
    0 => 'language.oop5.visibility.php',
    1 => 'Область видимості',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'uk',
    '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 дозволяє розробникам оголошувати методи-конструктори. Класи, в яких
    оголошено метод-конструктор, будуть викликати його під час створення нового
    об&#039;єкта. Це корисно, коли перед використанням об&#039;єкта його потрібно
    ініціалізувати.
   </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="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">BaseClass </span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<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 </span><span style="color: #007700">{<br />   function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<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 </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">// Виводить:<br />// В конструкторі класу 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">();<br /></span><span style="color: #0000BB">?&gt;</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">
    Конструктори — це звичайні методи, виклик яких здійснюється під час
    створення примірника їхнього класу. Таким чином, для них можна оголошувати
    довільну кількість параметрів, які можуть бути обов&#039;язковими, мати тип та
    початкові значення. Параметри конструктору передають в дужках після назви
    класу.
   </p>
   <div class="example" id="example-2">
    <p><strong>Приклад #2 Використання параметрів конструктора</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Point </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 />        </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 /></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 /></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">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Якщо клас не має конструктора, або конструктор не вимагає обов&#039;язкових
    параметрів, дужки можуть бути пропущені.
   </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>, проте
     досі дозволяє викликати цю функцію, як конструктор. Якщо оголошено і метод
     <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, параметри конструктора можна оголошувати як
     властивості об&#039;єкта. Дуже часто в тілі конструктора значення його
     параметрів призначають властивостям і більше не обробляють. Тепер же існує
     спрощений спосіб це зробити. Приклад вище можна переписати наступним чином.
    </p>
    <div class="example" id="example-3">
     <p><strong>Приклад #3 Оголошення параметрів конструктора як властивостей</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Point </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 />    }<br />}</span></span></code></div>
     </div>

    </div>
    <p class="para">
     Якщо оголошений параметр конструктора має модифікатора, то PHP інтерпретує
     параметр також як властивість об&#039;єкта, тож обоє отримають однакові
     значення. Таким чином тіло конструктора може бути порожнім або містити інші
     оператори, які будуть виконані після отримання властивостями значень
     відповідних параметрів.
    </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">
      Властивості об&#039;єкта не можуть мати тип <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">
      Оскільки параметри, що оголошені як властивості, виконують подвійну роль,
      до них застосовуються обмеження щодо назв, які стосуються як параметрів,
      так і властивостей.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Зауваження</strong>: 
     <p class="para">
      <a href="language.attributes.php" class="link">Атрибут</a>, встановлений для
      параметра-властивості, діє і на параметр, і на властивість. Початкове
      значення параметра, що оголошений, як властивість, буде надано тільки
      параметру.
     </p>
    </p></blockquote>
   </div>
   
   <div class="sect3" id="language.oop5.decon.constructor.new">
    <h4 class="title">Ключове слово <code class="literal">new</code> в ініціалізаторах</h4>
    <p class="para">
     Починаючи з PHP 8.1.0, об&#039;єкти можуть бути початковими значеннями
     параметрів, статичних змінних, глобальних констант, а також параметрів
     атрибутів. Об&#039;єкти також можуть бути передані в функцію
     <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 Використання <code class="literal">new</code> в ініціалізаторах</strong></p>
     <div class="example-contents">
<div class="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 /><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 </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">) {}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </div>
   
   <div class="sect3" id="language.oop5.decon.constructor.static">
    <h4 class="title">Способи статичного створення об&#039;єктів</h4>
    <p class="para">
     PHP підтримує тільки один конструктор на клас. Однак, в деяких випадках
     потрібно будувати об&#039;єкт по-різному з різними вхідними даними.
     Рекомендованим способом є використання статичних методів, як надбудов над
     конструкторами.
    </p>
    <div class="example" id="example-5">
     <p><strong>Приклад #5 Використання способів статичного створення об&#039;єктів</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Product </span><span style="color: #007700">{<br /><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 />        </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 />        </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 />        </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 />        </span><span style="color: #FF8000">// Користувацька логіка.<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">convert_xml_to_array</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">= </span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'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">[</span><span style="color: #DD0000">'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">);</span></span></code></div>
     </div>

    </div>
    <p class="para">
     Конструктор можна зробити закритим або захищеним, щоб заборонити виклик
     його ззовні. В такому випадку тільки статичний метод зможе повернути
     примірник свого класу. Статичні методи мають доступ до закритих та
     захищених методів, визначених в спільному класі, навіть якщо останні
     належать до різних примірників цього класу. Закритий конструктор є
     необов&#039;язковим і може мати або не мати сенс, залежно від випадку
     застосування.
    </p>
    <p class="para">
     В прикладі вище три загальнодоступні статичні методи показують різні
     способи створення об&#039;єктів.
    </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-рядок, обробляє його, а потім
     створює чистий об'єкт. Метод викликає конструктор без параметрів,
     оскільки всі вони необов'язкові. Далі безпосередньо задає значення
     властивостям об'єкта та повертає цей об'єкт.</li>
    </ul>
    <p class="para">
     У всіх трьох випадках ключове слово <code class="code">static</code> транслюється в
     назву класу, всередині якого воно застосовано.
     In this case, <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 має концепцію деструктора, схожу з тими, що є в інших
    об&#039;єктно-орієнтованих мовах, як от C++. Метод деструктора об&#039;єкта буде
    викликано одразу за відсутності посилань на об&#039;єкт, або в довільному
    порядку під час процедури завершення скрипта.
   </p>
   <div class="example" id="example-6">
    <p><strong>Приклад #6 Використання деструктора</strong></p>
    <div class="example-contents">
<div class="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 />        print </span><span style="color: #DD0000">"In constructor\n"</span><span style="color: #007700">;<br />    }<br /><br />    function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {<br />        print </span><span style="color: #DD0000">"Destroying " </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">
    Схоже з конструктором, батьківський деструктор не буде викликано
    автоматично. Щоб запустити батьківський деструктор, потрібно явно викликати
    <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">
    Якщо деструктор створює нові посилання на свій об&#039;єкт, його не буде
    викликано вдруге, коли кількість посилань знову досягне нуля чи під час
    завершення скрипта.
   </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>, то
    заплановані деструктори об&#039;єктів виконуються в окремому файбері з назвою
    <code class="literal">gc_destructor_fiber</code>. Якщо цей файбер призупинено, то
    створюється новий, щоб довиконати деструктори. Збирач сміття більше не
    посилатиметься на попередній файбер <code class="literal">gc_destructor_fiber</code>,
    який буде знищений під час наступного збирання сміття. Об&#039;єкт, чий
    деструктор призупинено, не знищиться, допоки деструктор не буде виконано
    або не буде знищено файбер.
   </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); ?>