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

contributors($setup);

?>
<div id="language.oop5.visibility" class="sect1">
 <h2 class="title">Область видимости</h2>
 <p class="para">
  Область видимости свойства, метода или начиная c PHP 7.1.0 константы определяют
  путём добавления перед объявлением ключевого слова: <code class="literal">public</code>,
  <code class="literal">protected</code> или <code class="literal">private</code>. Доступ к общедоступным членам класса, —
  которые объявили с ключевым словом public, — разрешается из любой области видимости.
  Доступ к защищённым членам класса, которые объявили с ключевым словом protected, — возможен только
  внутри самого класса, и в производных классах-наследниках или родительских классах.
  Доступ к закрытым членам класса, — которые объявили с ключевым словом private, — открывается
  только для самого класса, в котором их определили.
 </p>

 <div class="sect2" id="language.oop5.visibility-members">
  <h3 class="title">Область видимости свойства</h3>
  <p class="para">
   Свойства класса разрешается определять как открытые — public, защищённые — protected или закрытые — private.
   Свойства, которые объявили без модификатора области видимости,
   определяются как открытые, как будто свойство объявили с ключевым словом public.
  </p>
  <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: #FF8000">/**<br /> * Определение класса MyClass<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$public </span><span style="color: #007700">= </span><span style="color: #DD0000">'Public'</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">$protected </span><span style="color: #007700">= </span><span style="color: #DD0000">'Protected'</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">$private </span><span style="color: #007700">= </span><span style="color: #DD0000">'Private'</span><span style="color: #007700">;<br /><br />    function </span><span style="color: #0000BB">printHello</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">public</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protected</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">private</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">MyClass</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">public</span><span style="color: #007700">; </span><span style="color: #FF8000">// Работает<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protected</span><span style="color: #007700">; </span><span style="color: #FF8000">// Фатальная ошибка<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">private</span><span style="color: #007700">; </span><span style="color: #FF8000">// Фатальная ошибка<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">printHello</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Выводит 'Public', 'Protected' и 'Private'<br /><br /><br />/**<br /> * Определение MyClass2<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Разрешается переопределять открытые и защищённые свойства, но не закрытые<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">$public </span><span style="color: #007700">= </span><span style="color: #DD0000">'Public2'</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">$protected </span><span style="color: #007700">= </span><span style="color: #DD0000">'Protected2'</span><span style="color: #007700">;<br /><br />    function </span><span style="color: #0000BB">printHello</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">public</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protected</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">private</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass2</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">public</span><span style="color: #007700">; </span><span style="color: #FF8000">// Работает<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protected</span><span style="color: #007700">; </span><span style="color: #FF8000">// Фатальная ошибка<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">private</span><span style="color: #007700">; </span><span style="color: #FF8000">// Предупреждение о неопределённом свойстве<br /></span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">printHello</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Выводит 'Public2', 'Protected2' и предупреждение о неопределённом свойстве</span></span></code></div>
    </div>

   </div>
  <div class="sect3" id="language.oop5.visibility-members-aviz">
   <h4 class="title">Асимметричная область видимости свойств</h4>
   <p class="simpara">
    Начиная с PHP 8.4 свойства объекта дополнительно стали поддерживать установку асимметричной области видимости:
    отдельно для чтения и записи. Видимость свойства для записи определяют спецификатором
    <code class="literal">(set)</code>, который указывают сразу после модификатора видимости,
    тогда как спецификатор <code class="literal">(get)</code> после модификатора видимости для чтения не указывают, а подразумевают.
    Спецификатором <code class="literal">set</code> нельзя устанавливать уровень доступности свойства для записи
    слабее, чем уровень доступа для чтения.
   </p>
   <div class="example" id="example-2">
    <p><strong>Пример #2 Пример асимметричной установки области видимости свойств</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">Book<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(<br />        public private(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">string $title</span><span style="color: #007700">,<br />        public protected(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">string $author</span><span style="color: #007700">,<br />        protected private(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">int $pubYear</span><span style="color: #007700">,<br />    ) {}<br />}<br /><br />class </span><span style="color: #0000BB">SpecialBook </span><span style="color: #007700">extends </span><span style="color: #0000BB">Book<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">update</span><span style="color: #007700">(</span><span style="color: #0000BB">string $author</span><span style="color: #007700">, </span><span style="color: #0000BB">int $year</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">author </span><span style="color: #007700">= </span><span style="color: #0000BB">$author</span><span style="color: #007700">; </span><span style="color: #FF8000">// Всё хорошо<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pubYear </span><span style="color: #007700">= </span><span style="color: #0000BB">$year</span><span style="color: #007700">; </span><span style="color: #FF8000">// Критическая ошибка<br />    </span><span style="color: #007700">}<br />}<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= new </span><span style="color: #0000BB">Book</span><span style="color: #007700">(</span><span style="color: #DD0000">'Правильный PHP-код'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Peter H. Peterson'</span><span style="color: #007700">, </span><span style="color: #0000BB">2024</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">title</span><span style="color: #007700">; </span><span style="color: #FF8000">// Всё хорошо<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">author</span><span style="color: #007700">; </span><span style="color: #FF8000">// Всё хорошо<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pubYear</span><span style="color: #007700">; </span><span style="color: #FF8000">// Критическая ошибка<br /><br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">title </span><span style="color: #007700">= </span><span style="color: #DD0000">'Неправильный PHP-код'</span><span style="color: #007700">; </span><span style="color: #FF8000">// Критическая ошибка<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">author </span><span style="color: #007700">= </span><span style="color: #DD0000">'Pedro H. Peterson'</span><span style="color: #007700">; </span><span style="color: #FF8000">// Критическая ошибка<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pubYear </span><span style="color: #007700">= </span><span style="color: #0000BB">2023</span><span style="color: #007700">; </span><span style="color: #FF8000">// Критическая ошибка</span></span></code></div>
    </div>

   </div>
    <p class="simpara">
     Начиная с PHP 8.5 статические свойства класса тоже стали поддерживать установку отдельной области видимости для записи через спецификатор <code class="literal">set</code>.
    </p>
    <div class="example" id="example-3">
     <p><strong>Пример #3 Asymmetric Static Property Visibility</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">Manager<br /></span><span style="color: #007700">{<br />    public private(</span><span style="color: #0000BB">set</span><span style="color: #007700">) static </span><span style="color: #0000BB">int $calls </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">doAThing</span><span style="color: #007700">(): </span><span style="color: #0000BB">string<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$calls</span><span style="color: #007700">++;<br />        </span><span style="color: #FF8000">// Выполняем другую работу<br />        </span><span style="color: #007700">return </span><span style="color: #DD0000">"Произвольная строка"</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$m </span><span style="color: #007700">= new </span><span style="color: #0000BB">Manager</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$m</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">doAThing</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Работает<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">Manager</span><span style="color: #007700">::</span><span style="color: #0000BB">$calls</span><span style="color: #007700">; </span><span style="color: #FF8000">// Работает<br /></span><span style="color: #0000BB">Manager</span><span style="color: #007700">::</span><span style="color: #0000BB">$calls </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">; </span><span style="color: #FF8000">// Фатальная ошибка</span></span></code></div>
     </div>

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

     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
1
Fatal error: Uncaught Error: Cannot modify private(set) property Manager::$calls from global scope in /some/file.php
</pre></div>
     </div>
    </div>
   <p class="para">Относительно асимметричной области видимости определили ряд условий:</p>
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      Отдельную область видимости <code class="literal">set</code> разрешается устанавливать только типизированным свойствам.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Ограничение области видимости <code class="literal">set</code> требуется указывать как у области видимости <code class="literal">get</code>
      или сильнее. Так, сочетания модификаторов <code class="code">public protected(set)</code> и <code class="code">protected protected(set)</code>
      допустимы, но более слабое условие области видимости для записи наподобие <code class="code">protected public(set)</code>
      вызовет синтаксическую ошибку.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Область видимости для чтения открытых свойств разрешается пропускать и не указывать модификатор <code class="literal">public</code>.
      Поэтому определения <code class="code">public private(set)</code> и <code class="code">private(set)</code>
      установят свойству одни и те же области видимости.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Свойство с областью видимости <code class="literal">private(set)</code> автоматически становится окончательным (<code class="literal">final</code>)
      и его нельзя повторно объявить в дочернем классе.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Получение ссылки на свойство подчиняется видимости <code class="literal">set</code>, а не <code class="literal">get</code>.
      Это связано с тем, что ссылка разрешает изменять значение свойства.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Аналогично, попытка записи в массив, который содержится в свойстве,
      включает в себя как внутреннюю операцию чтения — <code class="literal">get</code>,
      так и операцию записи — <code class="literal">set</code>, и поэтому подчинится области видимости <code class="literal">set</code>,
      поскольку ограничение области видимости для записи сильнее.
     </span>
    </li>
   </ul>
    <blockquote class="note"><p><strong class="note">Замечание</strong>: 
     <span class="simpara">
      Пробелы в объявлении области видимости для записи не допускаются.
      Правильно: <code class="literal">private(set)</code>.
      Неправильно и вызовет ошибку синтаксического анализа: <code class="literal">private( set )</code>.
     </span>
    </p></blockquote>
   <p class="simpara">
    При наследовании класса дочернему классу доступно переопределение свойств родительского класса,
    которые не обозначили окончательными ключевым словом <code class="literal">final</code>.
    При этом дочернему классу разрешается ослабить либо основную видимость — для чтения, либо видимость <code class="literal">set</code>,
    если только новая видимость останется такой же или станет слабее, чем у родительского класса.
    Однако имейте в виду, что при переопределении свойства с модификатором <code class="literal">private</code>
    новая область видимости не изменяет видимость родительского свойства, а создаёт новое свойство с другим внутренним именем.
   </p>
   <div class="example" id="example-4">
    <p><strong>Пример #4 Наследование свойств с асимметричной областью видимости</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">Book<br /></span><span style="color: #007700">{<br />    protected </span><span style="color: #0000BB">string $title</span><span style="color: #007700">;<br />    public protected(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">string $author</span><span style="color: #007700">;<br />    protected private(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">int $pubYear</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">SpecialBook </span><span style="color: #007700">extends </span><span style="color: #0000BB">Book<br /></span><span style="color: #007700">{<br />    public protected(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">string $title</span><span style="color: #007700">; </span><span style="color: #FF8000">// Всё хорошо, поскольку ограничение на чтение слабее, а на запись – такое же<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $author</span><span style="color: #007700">; </span><span style="color: #FF8000">// Всё хорошо, поскольку ограничение на чтение такое же, а на запись – слабее<br />    </span><span style="color: #007700">public protected(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">int $pubYear</span><span style="color: #007700">; </span><span style="color: #FF8000">// Критическая ошибка. Свойства с видимостью private(set) — окончательны!<br /></span><span style="color: #007700">}</span></span></code></div>
    </div>

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

 <div class="sect2" id="language.oop5.visiblity-methods">
  <h3 class="title">Область видимости метода</h3>
  <p class="para">
   Методы класса разрешается определять как открытые — public, защищённые — protected или закрытые — private.
   Методы, которые объявили без явного ключевого слова области видимости,
   определяются как открытые, как будто метод объявили с ключевым словом public.
  </p>
  <div class="example" id="example-5">
    <p><strong>Пример #5 Объявление метода</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/**<br /> * Определение класса MyClass<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Объявление общедоступного конструктора<br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {}<br /><br />    </span><span style="color: #FF8000">// Объявление общедоступного метода<br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">MyPublic</span><span style="color: #007700">() {}<br /><br />    </span><span style="color: #FF8000">// Объявление защищённого метода<br />    </span><span style="color: #007700">protected function </span><span style="color: #0000BB">MyProtected</span><span style="color: #007700">() {}<br /><br />    </span><span style="color: #FF8000">// Объявление закрытого метода<br />    </span><span style="color: #007700">private function </span><span style="color: #0000BB">MyPrivate</span><span style="color: #007700">() {}<br /><br />    </span><span style="color: #FF8000">// Это общедоступный метод<br />    </span><span style="color: #007700">function </span><span style="color: #0000BB">Foo</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyPublic</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyProtected</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyPrivate</span><span style="color: #007700">();<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$myclass </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$myclass</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyPublic</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Работает<br /></span><span style="color: #0000BB">$myclass</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyProtected</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Фатальная ошибка<br /></span><span style="color: #0000BB">$myclass</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyPrivate</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Фатальная ошибка<br /></span><span style="color: #0000BB">$myclass</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Общедоступный, защищённый и закрытый методы работают<br /><br /><br />/**<br /> * Определение класса MyClass2<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Это общедоступный метод<br />    </span><span style="color: #007700">function </span><span style="color: #0000BB">Foo2</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyPublic</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyProtected</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyPrivate</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Фатальная ошибка<br />    </span><span style="color: #007700">}<br />}<br /><br /></span><span style="color: #0000BB">$myclass2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$myclass2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyPublic</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Работает<br /></span><span style="color: #0000BB">$myclass2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Foo2</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Общедоступный и защищённый методы работают, закрытый — не работает<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Bar<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">testPrivate</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">testPublic</span><span style="color: #007700">();<br />    }<br /><br />    public function </span><span style="color: #0000BB">testPublic</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">"Bar::testPublic\n"</span><span style="color: #007700">;<br />    }<br /><br />    private function </span><span style="color: #0000BB">testPrivate</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">"Bar::testPrivate\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Foo </span><span style="color: #007700">extends </span><span style="color: #0000BB">Bar<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">testPublic</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">"Foo::testPublic\n"</span><span style="color: #007700">;<br />    }<br /><br />    private function </span><span style="color: #0000BB">testPrivate</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">"Foo::testPrivate\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$myFoo </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$myFoo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">test</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Bar::testPrivate<br />                // Foo::testPublic</span></span></code></div>
    </div>

  </div>
 </div>

 <div class="sect2" id="language.oop5.visiblity-constants">
  <h3 class="title">Область видимости констант</h3>
  <p class="para">
   Начиная с PHP 7.1.0 константы класса разрешается определять как открытые — public,
   защищённые — protected или закрытые — private.
   Константы, которые объявили без явного ключевого слова области видимости,
   определяются как открытые, как будто константу объявили с ключевым словом public.
  </p>
  <div class="example" id="example-6">
    <p><strong>Пример #6 Пример объявления констант с PHP 7.1.0</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/**<br /> * Объявление класса MyClass<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Объявление общедоступной константы<br />    </span><span style="color: #007700">public const </span><span style="color: #0000BB">MY_PUBLIC </span><span style="color: #007700">= </span><span style="color: #DD0000">'public'</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Объявление защищённой константы<br />    </span><span style="color: #007700">protected const </span><span style="color: #0000BB">MY_PROTECTED </span><span style="color: #007700">= </span><span style="color: #DD0000">'protected'</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Объявление закрытой константы<br />    </span><span style="color: #007700">private const </span><span style="color: #0000BB">MY_PRIVATE </span><span style="color: #007700">= </span><span style="color: #DD0000">'private'</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PUBLIC</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PROTECTED</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PRIVATE</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$myclass </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PUBLIC</span><span style="color: #007700">; </span><span style="color: #FF8000">// Работает<br /></span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PROTECTED</span><span style="color: #007700">; </span><span style="color: #FF8000">// Фатальная ошибка<br /></span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PRIVATE</span><span style="color: #007700">; </span><span style="color: #FF8000">// Фатальная ошибка<br /></span><span style="color: #0000BB">$myclass</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Выводятся константы с модификаторами public, protected и private<br /><br /><br />/**<br /> * Объявление класса MyClass2<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Публичный метод<br />    </span><span style="color: #007700">function </span><span style="color: #0000BB">foo2</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PUBLIC</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PROTECTED</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PRIVATE</span><span style="color: #007700">; </span><span style="color: #FF8000">// Фатальная ошибка<br />    </span><span style="color: #007700">}<br />}<br /><br /></span><span style="color: #0000BB">$myclass2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass2</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">MyClass2</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PUBLIC</span><span style="color: #007700">; </span><span style="color: #FF8000">// Работает<br /></span><span style="color: #0000BB">$myclass2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo2</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Выводятся константы с модификаторами public и protected, но не с модификатором private</span></span></code></div>
    </div>

   </div>
 </div>

 <div class="sect2" id="language.oop5.visibility-other-objects">
  <h3 class="title">Видимость из других объектов</h3>
  <p class="para">
   Объектам одного и того же типа доступны защищённые и закрытые члены
   друг друга, даже если это разные экземпляры.
   Это связано с тем, что внутри таких объектов уже известны конкретные детали реализации.
  </p>
  <div class="example" id="example-7">
   <p><strong>Пример #7 Доступ к закрытым членам объекта того же типа</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 />    private </span><span style="color: #0000BB">$foo</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">$foo</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #0000BB">$foo</span><span style="color: #007700">;<br />    }<br /><br />    private function </span><span style="color: #0000BB">bar</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">'Доступ к закрытому методу.'</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">baz</span><span style="color: #007700">(</span><span style="color: #0000BB">Test $other</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #FF8000">// Закрытое свойство доступно для изменения:<br />        </span><span style="color: #0000BB">$other</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #DD0000">'привет'</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$other</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">);<br /><br />        </span><span style="color: #FF8000">// Закрытый метод также доступен для вызова:<br />        </span><span style="color: #0000BB">$other</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</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">'test'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">baz</span><span style="color: #007700">(new </span><span style="color: #0000BB">Test</span><span style="color: #007700">(</span><span style="color: #DD0000">'other'</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(6) &quot;привет&quot;
Доступ к закрытому методу.
</pre></div>
   </div>
  </div>
 </div>
</div><?php manual_footer($setup); ?>