<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'language.oop5.visibility.php',
    1 => 'Visibilidade',
    2 => 'Visibilidade',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Classes e Objetos',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.decon.php',
    1 => 'Construtores e Destrutores',
  ),
  'next' => 
  array (
    0 => 'language.oop5.inheritance.php',
    1 => 'Heran&ccedil;a de Objetos',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    '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">Visibilidade</h2>
  <p class="para">
   A visibilidade de uma propriedade ou método ou constante pode ser definida prefixando a
   declaração com as palavras-chave <code class="literal">public</code>,
   <code class="literal">protected</code> ou
   <code class="literal">private</code>. Membros de classes declarados como públicos podem ser
   acessados de qualquer lugar. Membros declarados como protegidos podem ser acessados
   na própria classe ou de classes referenciadas por herança
   acima. Membros declarados como privados só podem ser acessados por classes
   que definem esse membro.
  </p>

  <div class="sect2" id="language.oop5.visibility-members">
   <h3 class="title">Visibilidade de propriedades</h3>
   <p class="para">
    Propriedades de classes podem ser declaradas como públicas, privadas ou
    protegidas. Propriedades declaradas sem visibilidade
    são definidas como públicas.
   </p>
   <div class="example" id="example-1">
    <p><strong>Exemplo #1 Declaração de propriedade</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 /> * Define MinhaClasse<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MinhaClasse<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$publica </span><span style="color: #007700">= </span><span style="color: #DD0000">'Public'</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">$protegida </span><span style="color: #007700">= </span><span style="color: #DD0000">'Protected'</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">$privada </span><span style="color: #007700">= </span><span style="color: #DD0000">'Private'</span><span style="color: #007700">;<br /><br />    function </span><span style="color: #0000BB">imprimeAlo</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">publica</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protegida</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">privada</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">MinhaClasse</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">publica</span><span style="color: #007700">; </span><span style="color: #FF8000">// Funciona<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protegida</span><span style="color: #007700">; </span><span style="color: #FF8000">// Erro Fatal<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">privada</span><span style="color: #007700">; </span><span style="color: #FF8000">// Erro Fatal<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">imprimeAlo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Mostra Public, Protected e Private<br /><br /><br />/**<br /> * Define MinhaClasse2<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MinhaClasse2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">MinhaClasse<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// É possível redeclarar as propriedades públicas e protegidas, mas não as privadas<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">$publica </span><span style="color: #007700">= </span><span style="color: #DD0000">'Public2'</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">$protegida </span><span style="color: #007700">= </span><span style="color: #DD0000">'Protected2'</span><span style="color: #007700">;<br /><br />    function </span><span style="color: #0000BB">imprimeAlo</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">publica</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protegida</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">privada</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">MinhaClasse2</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">publica</span><span style="color: #007700">;   </span><span style="color: #FF8000">// Funciona<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protegida</span><span style="color: #007700">; </span><span style="color: #FF8000">// Erro fatal<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">privada</span><span style="color: #007700">;   </span><span style="color: #FF8000">// Não definida<br /></span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">imprimeAlo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Mostra Public, Protected2, Undefined<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <div class="sect3" id="language.oop5.visibility-members-aviz">
    <h4 class="title">Visibilidade de propriedade assimétrica</h4>
    <p class="simpara">
     A partir do PHP 8.4, as propriedades de objeto também podem ter sua
     visibilidade definida de forma assimétrica, com escopo diferente para
     leitura (<code class="literal">get</code>) e escrita (<code class="literal">set</code>).
     Especificamente, a visibilidade <code class="literal">set</code> pode ser
     especificada separadamente, desde que não seja mais permissiva que a
     visibilidade padrão.
    </p>
    <div class="example" id="example-2">
     <p><strong>Exemplo #2 Visibilidade de propriedade assimétrica</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: #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">// OK<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">// Erro fatal<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">'How to 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">// Funciona<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">// Funciona<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">// Erro fatal<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">'How not to PHP'</span><span style="color: #007700">; </span><span style="color: #FF8000">// Erro fatal<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">// Erro fatal<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">// Erro fatal<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
    <p class="simpara">
     A partir do PHP 8.5, a visibilidade <code class="literal">set</code> também pode ser aplicada a propriedades estáticas de classes.
    </p>
    <div class="example" id="example-3">
     <p><strong>Exemplo #3 Visibilidade assimétrica de propriedade estática</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: #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">// Faz outras coisas.<br />        </span><span style="color: #007700">return </span><span style="color: #DD0000">"uma string"</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">// Funciona<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">// Funciona<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">// Erro fatal<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>O exemplo acima produzirá:</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 /algum/arquivo.php
</pre></div>
     </div>
    </div>
    <p class="para">Existem algumas advertências em relação à visibilidade assimétrica:</p>
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       Somente propriedades tipadas podem ter uma visibilidade <code class="literal">set</code> separada.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       A visibilidade <code class="literal">set</code> deve ser a mesma
       de <code class="literal">get</code> ou mais restritiva. Ou seja,
       <code class="code">public protected(set)</code> e <code class="code">protected protected(set)</code>
       são permitidos, mas <code class="code">protected public(set)</code> causará um erro de sintaxe.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Se uma propriedade for <code class="literal">public</code>, a visibilidade principal poderá ser
       omitida. Ou seja, <code class="code">public private(set)</code> e <code class="code">private(set)</code>
       terão o mesmo resultado.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Uma propriedade com visibilidade <code class="literal">private(set)</code>
       é automaticamente <code class="literal">final</code> e não pode ser declarada novamente em uma classe filha.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       A obtenção de uma referência para uma propriedade segue a visibilidade <code class="literal">set</code>, não <code class="literal">get</code>.
       Isso ocorre porque uma referência pode ser usada para modificar o valor da propriedade.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Da mesma forma, tentar escrever em uma propriedade de array envolve uma operação <code class="literal">get</code> e
       <code class="literal">set</code> internamente e, portanto, seguirá a visibilidade <code class="literal">set</code>,
       como é sempre a mais restritiva.
      </span>
     </li>
    </ul>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <span class="simpara">
      Espaços não são permitidos na declaração de visibilidade &quot;set&quot;.
      <code class="literal">private(set)</code> está correto.
      <code class="literal">private( set )</code> não está correto e resultará em erro de análise.
     </span>
    </p></blockquote>
    <p class="simpara">
     Quando uma classe estende outra, a classe filha pode redefinir
     qualquer propriedade que não seja <code class="literal">final</code>. Ao fazer isso,
     pode ampliar a visibilidade principal ou a visibilidade <code class="literal">set</code>,
     desde que a nova visibilidade seja igual ou mais ampla
     que a classe pai. Entretanto, esteja ciente de que se uma propriedade <code class="literal">private</code>
     for substituída, ela na verdade não altera a propriedade da classe pai,
     mas cria uma nova propriedade com um nome interno diferente.
    </p>
    <div class="example" id="example-4">
     <p><strong>Exemplo #4 Herança de propriedade assimétrica</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: #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">// OK, pois a leitura é mais ampla e a escrita igual.<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $author</span><span style="color: #007700">; </span><span style="color: #FF8000">// OK, pois a leitura é a mesma e a escrita é mais ampla.<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">// Erro fatal. propriedades private(set) são finais.<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

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

  <div class="sect2" id="language.oop5.visiblity-methods">
   <h3 class="title">Visibilidades de métodos</h3>
   <p class="para">
    Métodos de classe podem ser definidos como público, privado
    ou protegido. Métodos sem qualquer declaração explícita serão
    definidos como público.
   </p>
   <div class="example" id="example-5">
    <p><strong>Exemplo #5 Declaração de método</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 /> * Define MinhaClasse<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MinhaClasse<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Declara um construtor público<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">// Declara um método público<br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">MeuPublico</span><span style="color: #007700">() { }<br /><br />    </span><span style="color: #FF8000">// Declara um método protegido<br />    </span><span style="color: #007700">protected function </span><span style="color: #0000BB">MeuProtegido</span><span style="color: #007700">() { }<br /><br />    </span><span style="color: #FF8000">// Declara um método privado<br />    </span><span style="color: #007700">private function </span><span style="color: #0000BB">MeuPrivado</span><span style="color: #007700">() { }<br /><br />    </span><span style="color: #FF8000">// Esse é público<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">MeuPublico</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MeuProtegido</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MeuPrivado</span><span style="color: #007700">();<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$minhaclasse </span><span style="color: #007700">= new </span><span style="color: #0000BB">MinhaClasse</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$minhaclasse</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MeuPublico</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Funciona<br /></span><span style="color: #0000BB">$minhaclasse</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MeuProtegido</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Erro Fatal<br /></span><span style="color: #0000BB">$minhaclasse</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MeuPrivado</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Erro Fatal<br /></span><span style="color: #0000BB">$minhaclasse</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Public, Protected e Private funcionam<br /><br /><br />/**<br /> * Define MinhaClasse2<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MinhaClasse2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">MinhaClasse<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Esse é public<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">MeuPublico</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MeuProtegido</span><span style="color: #007700">();<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MeuPrivado</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Erro Fatal<br />    </span><span style="color: #007700">}<br />}<br /><br /></span><span style="color: #0000BB">$minhaclasse2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">MinhaClasse2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$minhaclasse2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MeuPublico</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Funciona<br /></span><span style="color: #0000BB">$minhaclasse2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Foo2</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Public e Protected funcionam, Private não<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 />        </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 />        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 />        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 />        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 />        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<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect2" id="language.oop5.visiblity-constants">
   <h3 class="title">Visibilidade de constantes</h3>
   <p class="para">
    A partir do PHP 7.1.0, constantes de classe podem ser definidas como públicas, protegidas
    ou privadas. Constantes declaradas sem visibilidade explícita
    são definidas como públicas.
   </p>
   <div class="example" id="example-6">
    <p><strong>Exemplo #6 Declaração de constantes (desde o 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 /> * Define 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">// Declara uma constante pública<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">// Declara uma constante protegida<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">// Declara uma constante privada<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">// Funciona<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">// Erro fatal<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">// Erro fatal<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">// Todos os acessos funcionam dentro do método<br /><br /><br />/**<br /> * Define 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">// Isto é público<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">// Fatal Error<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">// Funciona<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 e Protected funcionam, mas não Private<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect2" id="language.oop5.visibility-other-objects">
   <h3 class="title">Visibilidade de outros objetos</h3>
   <p class="para">
    Objetos do mesmo tipo terão acesso a outros mementos privados e
    protegidos mesmo que não sejam da mesma instância. Isso acontece
    por que os detalhes específicos de implementação já são conhecidos dentro
    destes objetos.
   </p>
   <div class="example" id="example-7">
    <p><strong>Exemplo #7 Acessando membros privados entre objetos do mesmo tipo</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: #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">'Acessou o método privado.'</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">// Pode-se alterar a propriedade privada:<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">'hello'</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">// Pode-se chamar método privado:<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">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>O exemplo acima produzirá:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
string(5) &quot;hello&quot;
Acessou o método privado.
</pre></div>
    </div>
   </div>
  </div>
 </div><?php manual_footer($setup); ?>