<?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 => 'ja',
  ),
  'this' => 
  array (
    0 => 'language.oop5.visibility.php',
    1 => 'アクセス権',
    2 => 'アクセス権',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'クラスとオブジェクト',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.decon.php',
    1 => 'コンストラクタとデストラクタ',
  ),
  'next' => 
  array (
    0 => 'language.oop5.inheritance.php',
    1 => 'オブジェクトの継承',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'language/oop5/visibility.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.visibility" class="sect1">
  <h2 class="title">アクセス権</h2>
  <p class="para">
   プロパティ、メソッドまたは (PHP 7.1.0 以降) 定数のアクセス権 (visibility) は、
   キーワード: <code class="literal">public</code>, <code class="literal">protected</code>
   または <code class="literal">private</code> を指定することにより定義できます。
   public 宣言されたクラスのメンバーには、どこからでもアクセス可能です。
   protected 宣言されたメンバーには、
   そのクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセスできます。
   private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできます。
  </p>

  <div class="sect2" id="language.oop5.visibility-members">
   <h3 class="title">プロパティのアクセス権</h3>
  <p class="para">
   クラスのプロパティは、public, private, または protected
   として定義することができます。
   アクセス権を明示的に指定しない場合、
   そのプロパティは public として定義されます。
  </p>
  <div class="example" id="example-1">
   <p><strong>例1 プロパティの宣言</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/**<br /> * MyClass の定義<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$public </span><span style="color: #007700">= </span><span style="color: #DD0000">'Public'</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">$protected </span><span style="color: #007700">= </span><span style="color: #DD0000">'Protected'</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">$private </span><span style="color: #007700">= </span><span style="color: #DD0000">'Private'</span><span style="color: #007700">;<br /><br />    function </span><span style="color: #0000BB">printHello</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">public</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protected</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">private</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">public</span><span style="color: #007700">; </span><span style="color: #FF8000">// 動作します<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">protected</span><span style="color: #007700">; </span><span style="color: #FF8000">// 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">private</span><span style="color: #007700">; </span><span style="color: #FF8000">// Fatal エラー<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">printHello</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Public、Protected そして Private を表示します<br /><br /><br />/**<br /> * MyClass2 の定義<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// public および protected プロパティは再定義できますが、<br />    // 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">// 動作します<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 エラー<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">private</span><span style="color: #007700">; </span><span style="color: #FF8000">// 未定義です<br /></span><span style="color: #0000BB">$obj2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">printHello</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Public2, Protected2, 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">非対称可視性プロパティ</h4>
    <p class="simpara">
     PHP 8.4 から、オブジェクトのプロパティは非対称に
     アクセス権を設定できるようになりました。
     読み取り(<code class="literal">get</code>)と書き込み(<code class="literal">set</code>)に
     異なるスコープを設定できます。具体的には、<code class="literal">set</code> のアクセス権が
     メインのアクセス権より広くならない限り、
     別々に指定できます。
    </p>
    <div class="example" id="example-2">
     <p><strong>例2 非対称可視性プロパティ</strong></p>
     <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></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">// 致命的なエラー<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">// OK<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">// OK<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pubYear</span><span style="color: #007700">; </span><span style="color: #FF8000">// 致命的なエラー<br /><br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">title </span><span style="color: #007700">= </span><span style="color: #DD0000">'How not to PHP'</span><span style="color: #007700">; </span><span style="color: #FF8000">// 致命的なエラー<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">author </span><span style="color: #007700">= </span><span style="color: #DD0000">'Pedro H. Peterson'</span><span style="color: #007700">; </span><span style="color: #FF8000">// 致命的なエラー<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pubYear </span><span style="color: #007700">= </span><span style="color: #0000BB">2023</span><span style="color: #007700">; </span><span style="color: #FF8000">// 致命的なエラー<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    <p class="simpara">
     PHP 8.5 以降では、
     <code class="literal">set</code>
     はクラスの static プロパティにも適用できるようになりました。
    </p>
    <div class="example" id="example-3">
     <p><strong>例3 Asymmetric Static Property Visibility</strong></p>
     <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></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>上の例の出力は以下となります。</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
1
Fatal error: Uncaught Error: Cannot modify private(set) property Manager::$calls from global scope in /some/file.php
</pre></div>
     </div>
    </div> 
    <p class="para">非対称可視性プロパティにはいくつかの注意点があります:</p>
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       型付きプロパティのみが、<code class="literal">set</code> のアクセス権を個別に指定できます。
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       <code class="literal">set</code> のアクセス権は、<code class="literal">get</code> と同じか、
       より厳しくなければなりません。つまり、
       <code class="code">public protected(set)</code> および <code class="code">protected protected(set)</code>
       は許可されますが、<code class="code">protected public(set)</code> は構文エラーになります。
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       プロパティが <code class="literal">public</code> の場合、メインのアクセス権は
       省略できます。つまり、<code class="code">public private(set)</code> と <code class="code">private(set)</code> は
       同じ結果になります。
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       <code class="literal">private(set)</code> のアクセス権を持つプロパティは
       自動的に <code class="literal">final</code> となり、子クラスで再宣言できません。
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       プロパティへのリファレンスを取得する場合、<code class="literal">get</code> ではなく <code class="literal">set</code> のアクセス権に従います。
       これは、リファレンスを使用してプロパティの値を変更できるためです。
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       同様に、配列プロパティへの書き込みを試みると、内部的には <code class="literal">get</code> と
       <code class="literal">set</code> の両方の操作が行われます。そのため、常により厳しい <code class="literal">set</code>
       のアクセス権に従います。
      </span>
     </li>
    </ul>
    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <span class="simpara">
      アクセス権を set する宣言に、スペースは許されません。
      <code class="literal">private(set)</code> は正しい宣言です。
      <code class="literal">private( set )</code> は正しくないので、
      パースエラーになります。
     </span>
    </p></blockquote>
    <p class="simpara">
     クラスが別のクラスを継承するとき、子クラスは
     <code class="literal">final</code> でない任意のプロパティを再定義できます。その際、
     新しいアクセス権が親クラスと同じか広い場合に限り、
     メインのアクセス権または <code class="literal">set</code>
     のアクセス権を広げることができます。ただし、
     <code class="literal">private</code> プロパティがオーバーライドされると、
     実際には親のプロパティを変更するのではなく、
     異なる内部名を持つ新しいプロパティを作成することに注意してください。
    </p>
    <div class="example" id="example-4">
     <p><strong>例4 非対称可視性プロパティの継承</strong></p>
     <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></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。読み取りのアクセス権が広く、書き込みは同じだから。<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。読み取りのアクセス権は同じで、書き込みが広いから。<br />    </span><span style="color: #007700">public protected(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">int $pubYear</span><span style="color: #007700">; </span><span style="color: #FF8000">// 致命的なエラー。private(set) プロパティは 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">メソッドのアクセス権</h3>
   <p class="para">
    クラスメソッドは、public, private, または protected
    として定義します。アクセス権を明示せずに宣言したメソッドは、
    public となります。
   </p>
   <div class="example" id="example-5">
    <p><strong>例5 メソッドの宣言</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/**<br /> * MyClass の定義<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// public コンストラクタの宣言<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">// public メソッドの宣言<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">// protected メソッドの宣言<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">// private メソッドの宣言<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">// これは 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">// 動作します<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 エラー<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 エラー<br /></span><span style="color: #0000BB">$myclass</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Public、Protected および Private が動作します<br /><br /><br />/**<br /> * MyClass2 の定義<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// これは 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 エラー<br />    </span><span style="color: #007700">}<br />}<br /><br /></span><span style="color: #0000BB">$myclass2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$myclass2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">MyPublic</span><span style="color: #007700">(); </span><span style="color: #FF8000">// 動作します<br /></span><span style="color: #0000BB">$myclass2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">Foo2</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Public および Protected は動作しますが、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">定数のアクセス権</h3>
   <p class="para">
    PHP 7.1.0 以降では、クラスの定数は public, private, protected
    として定義できるようになりました。
    明示的に公開範囲のキーワードを明示的に宣言しない定数は、public として定義されます。
   </p>
   <div class="example" id="example-6">
    <p><strong>例6 PHP 7.1.0 以降での定数の宣言</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/**<br /> * MyClass を定義する<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// public な定数を宣言する<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">// protected な定数を宣言する<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">// private な定数を宣言する<br />    </span><span style="color: #007700">private const </span><span style="color: #0000BB">MY_PRIVATE </span><span style="color: #007700">= </span><span style="color: #DD0000">'private'</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PUBLIC</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PROTECTED</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PRIVATE</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$myclass </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PUBLIC</span><span style="color: #007700">; </span><span style="color: #FF8000">// 動作します<br /></span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PROTECTED</span><span style="color: #007700">; </span><span style="color: #FF8000">// 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">// 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">// Public, Protected, Private のいずれでも動作します<br /><br /><br />/**<br /> * MyClass2 を定義する<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// これは 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 エラー<br />    </span><span style="color: #007700">}<br />}<br /><br /></span><span style="color: #0000BB">$myclass2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass2</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">MyClass2</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_PUBLIC</span><span style="color: #007700">; </span><span style="color: #FF8000">// 動作します<br /></span><span style="color: #0000BB">$myclass2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo2</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Public, Protected では動作しますが、Private では動作しません<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">他のオブジェクトからのアクセス権</h3>
   <p class="para">
    同じ型のオブジェクト間では、たとえ同一のインスタンスでなくても
    お互いの private メンバーや protected メンバーにアクセスすることができます。
    これは、そのオブジェクトの内部ではオブジェクトの実装の詳細が既知であるからです。
   </p>
   <div class="example" id="example-7">
    <p><strong>例7 同じ型のオブジェクトの private メンバーへのアクセス</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">// private プロパティを変更することができます<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">// private メソッドをコールすることもできます<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>上の例の出力は以下となります。</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
string(5) &quot;hello&quot;
Accessed the private method.
</pre></div>
    </div>
   </div>
  </div>
 </div><?php manual_footer($setup); ?>