<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Visibility</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.oop5.decon.html">Constructors and Destructors</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.oop5.inheritance.html">Object Inheritance</a></div> <div class="up"><a href="language.oop5.html">Classes and Objects</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="language.oop5.visibility" class="sect1"> <h2 class="title">Visibility</h2> <p class="para"> The visibility of a property or method can be defined by prefixing the declaration with the keywords <em class="emphasis">public</em>, <em class="emphasis">protected</em> or <em class="emphasis">private</em>. Class members declared public can be accessed everywhere. Members declared protected can be accessed only within the class itself and by inherited 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 must be defined as public, private, or protected. If declared using <em class="emphasis">var</em>, the property will be defined as public. </p> <p class="para"> <div class="example" id="example-187"> <p><strong>Example #1 Property declaration</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?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">-></span><span style="color: #0000BB">public</span><span style="color: #007700">;<br /> echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">protected</span><span style="color: #007700">;<br /> echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></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">-></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">-></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">-></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 method, but not private<br /> </span><span style="color: #007700">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">-></span><span style="color: #0000BB">public</span><span style="color: #007700">;<br /> echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">protected</span><span style="color: #007700">;<br /> echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></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">-></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">-></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">-></span><span style="color: #0000BB">printHello</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Shows Public, Protected2, Undefined<br /><br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </p> <blockquote class="note"><p><strong class="note">Note</strong>: <span class="simpara"> The PHP 4 method of declaring a variable with the <em class="emphasis">var</em> keyword is still supported for compatibility reasons (as a synonym for the public keyword). In PHP 5 before 5.1.3, its usage would generate an <strong><code>E_STRICT</code></strong> warning. </span> </p></blockquote> </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> <p class="para"> <div class="example" id="example-188"> <p><strong>Example #2 Method Declaration</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?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">-></span><span style="color: #0000BB">MyPublic</span><span style="color: #007700">();<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">MyProtected</span><span style="color: #007700">();<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></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">-></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">-></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">-></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">-></span><span style="color: #0000BB">MyPublic</span><span style="color: #007700">();<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">MyProtected</span><span style="color: #007700">();<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></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">-></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">-></span><span style="color: #0000BB">testPrivate</span><span style="color: #007700">();<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></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">-></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">?></span> </span> </code></div> </div> </div> </p> </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-189"> <p><strong>Example #3 Accessing private members of the same object type</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?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">-></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">-></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">-></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">-></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">-></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">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> string(5) "hello" Accessed the private method. </pre></div> </div> </div> </div> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.oop5.decon.html">Constructors and Destructors</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.oop5.inheritance.html">Object Inheritance</a></div> <div class="up"><a href="language.oop5.html">Classes and Objects</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>