<?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 => 'it',
  ),
  'this' => 
  array (
    0 => 'language.oop5.visibility.php',
    1 => 'Visibility',
    2 => 'Visibility',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Classi e Oggetti',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.decon.php',
    1 => 'Constructors and Destructors',
  ),
  'next' => 
  array (
    0 => 'language.oop5.inheritance.php',
    1 => 'Object Inheritance',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'en',
    '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">Visibility</h2>
  <p class="para">
   The visibility of a property, a method or (as of PHP 7.1.0) a constant can be defined by prefixing
   the declaration with the keywords <code class="literal">public</code>,
   <code class="literal">protected</code> or
   <code class="literal">private</code>. Class members declared public can be
   accessed everywhere. Members declared protected can be accessed
   only within the class itself and by inheriting and parent
   classes. Members declared as private may only be accessed by the
   class that defines the member.
  </p>

  <div class="sect2" id="language.oop5.visibility-members">
   <h3 class="title">Property Visibility</h3>
   <p class="para">
    Class properties may be defined as public, private, or
    protected. Properties declared without any explicit visibility
    keyword are defined as public.
   </p>
   <div class="example" id="example-1">
    <p><strong>Example #1 Property declaration</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 />    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">// Works<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">// Fatal Error<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">// Fatal Error<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">// Shows Public, Protected and Private<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">// We can redeclare the public and protected properties, but not private<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">// Works<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">// Fatal Error<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">// Undefined<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">// Shows Public2, 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">Asymmetric Property Visibility</h4>
    <p class="simpara">
     As of PHP 8.4, object properties may also have their
     visibility set asymmetrically, with a different scope for
     reading (<code class="literal">get</code>) and writing (<code class="literal">set</code>).
     Specifically, the <code class="literal">set</code> visibility may be
     specified separately, provided it is not more permissive than the
     default visibility.
    </p>
    <div class="example" id="example-2">
     <p><strong>Example #2 Asymmetric 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 /></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">// Fatal Error<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">// Works<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">// Works<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">// Fatal Error<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">// Fatal Error<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">// Fatal Error<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">// Fatal Error<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    <p class="simpara">
     As of PHP 8.5, <code class="literal">set</code> visibility may also be applied to static properties of classes.
    </p>
    <div class="example" id="example-3">
     <p><strong>Example #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 /></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">// Do other stuff.<br />        </span><span style="color: #007700">return </span><span style="color: #DD0000">"some 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">// Works<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">// Works<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">// Fatal error<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
     <div class="example-contents screen">
<div class="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">There are a few caveats regarding asymmetric visibility:</p>
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       Only typed properties may have a separate <code class="literal">set</code> visibility.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       The <code class="literal">set</code> visibility must be the same
       as <code class="literal">get</code> or more restrictive. That is,
       <code class="code">public protected(set)</code> and <code class="code">protected protected(set)</code>
       are allowed, but <code class="code">protected public(set)</code> will cause a syntax error.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       If a property is <code class="literal">public</code>, then the main visibility may be
       omitted.  That is, <code class="code">public private(set)</code> and <code class="code">private(set)</code>
       will have the same result.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       A property with <code class="literal">private(set)</code> visibility
       is automatically <code class="literal">final</code>, and may not be redeclared in a child class.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Obtaining a reference to a property follows <code class="literal">set</code> visibility, not <code class="literal">get</code>.
       That is because a reference may be used to modify the property value.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Similarly, trying to write to an array property involves both a <code class="literal">get</code> and
       <code class="literal">set</code> operation internally, and therefore will follow the <code class="literal">set</code>
       visibility, as that is always the more restrictive.
      </span>
     </li>
    </ul>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <span class="simpara">
      Spaces are not allowed in the set-visibility declaration.
      <code class="literal">private(set)</code> is correct.
      <code class="literal">private( set )</code> is not correct and will result in a parse error.
     </span>
    </p></blockquote>
    <p class="simpara">
     When a class extends another, the child class may redefine
     any property that is not <code class="literal">final</code>.  When doing so,
     it may widen either the main visibility or the <code class="literal">set</code>
     visibility, provided that the new visibility is the same or wider
     than the parent class.  However, be aware that if a <code class="literal">private</code>
     property is overridden, it does not actually change the parent&#039;s property
     but creates a new property with a different internal name.
    </p>
    <div class="example" id="example-4">
     <p><strong>Example #4 Asymmetric Property inheritance</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, as reading is wider and writing the same.<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, as reading is the same and writing is wider.<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">// Fatal Error. private(set) properties are final.<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">Method Visibility</h3>
   <p class="para">
    Class methods may be defined as public, private, or
    protected. Methods declared without any explicit visibility
    keyword are defined as public.
   </p>
   <div class="example" id="example-5">
    <p><strong>Example #5 Method Declaration</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">// Declare a public constructor<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">// Declare a public method<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">// Declare a protected method<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">// Declare a private method<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">// This is public<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">// Works<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">// Fatal Error<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">// Fatal Error<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 and Private work<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">// This is 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">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">// 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 /></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">// Works<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 and Protected work, not Private<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">Constant Visibility</h3>
   <p class="para">
    As of PHP 7.1.0, class constants may be defined as public, private, or
    protected. Constants declared without any explicit visibility
    keyword are defined as public.
   </p>
   <div class="example" id="example-6">
    <p><strong>Example #6 Constant Declaration as of 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">// Declare a public constant<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">// Declare a protected constant<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">// Declare a private constant<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">// Works<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">// Fatal Error<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">// Fatal Error<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 and Private work<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">// This is public<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">// Works<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 and Protected work, not 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">Visibility from other objects</h3>
   <p class="para">
    Objects of the same type will have access to each others private and
    protected members even though they are not the same instances. This is
    because the implementation specific details are already known when inside
    those objects.
   </p>
   <div class="example" id="example-7">
    <p><strong>Example #7 Accessing private members of the same object type</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">'Accessed the private method.'</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">// We can change the private property:<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">// We can also call the private method:<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>Il precedente esempio visualizzerà:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
string(5) &quot;hello&quot;
Accessed the private method.
</pre></div>
    </div>
   </div>
  </div>
 </div><?php manual_footer($setup); ?>