<?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 => 'tr',
  ),
  'this' => 
  array (
    0 => 'language.oop5.variance.php',
    1 => '&Ccedil;ok &Ouml;zg&uuml;ll&uuml;k ve Az &Ouml;zg&uuml;ll&uuml;k',
    2 => '&Ccedil;ok &Ouml;zg&uuml;ll&uuml;k ve Az &Ouml;zg&uuml;ll&uuml;k',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Sınıflar ve Nesneler',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.serialization.php',
    1 => 'Nesne Dizgeleştirme',
  ),
  'next' => 
  array (
    0 => 'language.oop5.lazy-objects.php',
    1 => 'Lazy Objects',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'tr',
    'path' => 'language/oop5/variance.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.variance" class="sect1">
 <h2 class="title">Çok Özgüllük ve Az Özgüllük</h2>

 <p class="para">
  PHP 7.2.0&#039;da, bir çocuk yöntem bağımsız değişkenlerindeki tür sınırlamaları
  kaldırılarak az özgüllüklere kısmen girildi. PHP 7.4.0&#039;dan itibaren,
  az ve çok özgüllüklere tam destek eklendi.
 </p>
 <p class="para">
  Çok özgüllük, bir çocuk yöntemin ebeveyn yönteminden daha özellikli bir
  tür döndürmesine izin verir. Buna karşın, az özgüllük, bir bağımsız değişkenin
  bir çocuk yöntemin içinde ebeveyndekinden daha az özellikli olmasına izin
  verir.
 </p>
 <p class="para">
  Aşağıdaki durumda tür belirtiminin daha belirgin olduğu varsayılır:
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
      <a href="language.types.type-system.php#language.types.type-system.composite.union" class="link">Birleşim
       türlerinden</a> bir türü çıkarmak.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <a href="language.types.type-system.php#language.types.type-system.composite.intersection" class="link">Kesişim
      türlerine</a> bir türü eklemek.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Bir sınıf türü yerine çocuk sınıf türü belirtmek.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="type"><a href="language.types.iterable.php" class="type iterable">iterable</a></span> yerine <span class="type"><a href="language.types.array.php" class="type array">array</a></span> veya
     <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span> belirtmek.
    </span>
   </li>
  </ul>
  Tersi doğruysa, o tür sınıfının daha az belirgin olduğu varsayılır.
 </p>

 <div class="sect2" id="language.oop5.variance.covariance">
  <h3 class="title">Çok Özgüllük</h3>

  <p class="para">
   Çok özgüllüğün nasıl çalıştığını göstermek için, basit bir soyut
   ebeveyn sınıf olarak <var class="varname">Hayvan</var> sınıfı oluşturulup
   <var class="varname">Kedi</var> ve <var class="varname">Köpek</var> çocuk sınıflarına
   genişletildi.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">abstract class </span><span style="color: #0000BB">Hayvan<br /></span><span style="color: #007700">{<br />    protected </span><span style="color: #0000BB">string $isim</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">string $isim</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$isim</span><span style="color: #007700">;<br />    }<br /><br />    abstract public function </span><span style="color: #0000BB">konuş</span><span style="color: #007700">();<br />}<br /><br />class </span><span style="color: #0000BB">Köpek </span><span style="color: #007700">extends </span><span style="color: #0000BB">Hayvan<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">konuş</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">name </span><span style="color: #007700">. </span><span style="color: #DD0000">" havlar"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Kedi </span><span style="color: #007700">extends </span><span style="color: #0000BB">Hayvan<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">konuş</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">name </span><span style="color: #007700">. </span><span style="color: #DD0000">" miyavlar"</span><span style="color: #007700">;<br />    }<br />}</span></span></code></div>
   </div>

  </div>

  <p class="para">
   Bu örnekte yöntemlerin hiçbiri değer döndürmemektedir.
   <var class="varname">Hayvan</var>, <var class="varname">Kedi</var> ve
   <var class="varname">Köpek</var> sınıfı türünde yeni bir nesne döndüren birkaç
   arayüz eklenecektir.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">HayvanYuvası<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sahiplen</span><span style="color: #007700">(</span><span style="color: #0000BB">string $isim</span><span style="color: #007700">): </span><span style="color: #0000BB">Hayvan</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">KediYuvası </span><span style="color: #007700">implements </span><span style="color: #0000BB">HayvanYuvası<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sahiplen</span><span style="color: #007700">(</span><span style="color: #0000BB">string $isim</span><span style="color: #007700">): </span><span style="color: #0000BB">Kedi </span><span style="color: #FF8000">// Hayvan türünde bir sınıf yerine Kedi türünde bir sınıf döner<br />    </span><span style="color: #007700">{<br />        return new </span><span style="color: #0000BB">Kedi</span><span style="color: #007700">(</span><span style="color: #0000BB">$isim</span><span style="color: #007700">);<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">KöpekYuvası </span><span style="color: #007700">implements </span><span style="color: #0000BB">HayvanYuvası<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">sahiplen</span><span style="color: #007700">(</span><span style="color: #0000BB">string $isim</span><span style="color: #007700">): </span><span style="color: #0000BB">Köpek </span><span style="color: #FF8000">// Hayvan türünde bir sınıf yerine Köpek türünde bir sınıf döner<br />    </span><span style="color: #007700">{<br />        return new </span><span style="color: #0000BB">Köpek</span><span style="color: #007700">(</span><span style="color: #0000BB">$isim</span><span style="color: #007700">);<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$mırnav </span><span style="color: #007700">= (new </span><span style="color: #0000BB">KediYuvası</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">sahiplen</span><span style="color: #007700">(</span><span style="color: #DD0000">"Tekir"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$mırnav</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">konuş</span><span style="color: #007700">();<br />echo </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$kuçu </span><span style="color: #007700">= (new </span><span style="color: #0000BB">KöpekYuvası</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">sahiplen</span><span style="color: #007700">(</span><span style="color: #DD0000">"Çomar"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$kuçu</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">konuş</span><span style="color: #007700">();</span></span></code></div>
   </div>

   <p class="para">
Yukarıdaki örneğin çıktısı:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Tekir miyavlar
Çomar havlar
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect2" id="language.oop5.variance.contravariance">
  <h3 class="title">Az Özgüllük</h3>

  <p class="para">
   <var class="varname">Hayvan</var>, <var class="varname">Kedi</var> ve
   <var class="varname">Köpek</var> sınıflarıyla önceki örneğe devam ederek, bunlara
   <var class="varname">Yem</var> ve <var class="varname">HayvanYemi</var> sınıflarını dahil
   edip <var class="varname">Hayvan</var> soyut sınıfına
   <var class="varname">ye(HayvanYemi $yem)</var> yöntemini ekleyelim.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Yem </span><span style="color: #007700">{}<br /><br />class </span><span style="color: #0000BB">HayvanYemi </span><span style="color: #007700">extends </span><span style="color: #0000BB">Yem </span><span style="color: #007700">{}<br /><br />abstract class </span><span style="color: #0000BB">Hayvan<br /></span><span style="color: #007700">{<br />    protected </span><span style="color: #0000BB">string $isim</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">string $isim</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$isim</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">ye</span><span style="color: #007700">(</span><span style="color: #0000BB">HayvanYemi $yem</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">name </span><span style="color: #007700">. </span><span style="color: #DD0000">" " </span><span style="color: #007700">. </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$yem</span><span style="color: #007700">) . </span><span style="color: #DD0000">"yer"</span><span style="color: #007700">;<br />    }<br />}</span></span></code></div>
   </div>

  </div>

  <p class="para">
   Az özgüllüğün davranışını görmek için, herhangi bir
   <var class="varname">Yem</var> türü nesneye izin vermek için <var class="varname">Köpek</var>
   sınıfında <var class="varname">ye</var> yöntemi geçersiz kılınır.
   <var class="varname">Kedi</var> sınıfı değişmeden kalır.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Köpek </span><span style="color: #007700">extends </span><span style="color: #0000BB">Hayvan<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">ye</span><span style="color: #007700">(</span><span style="color: #0000BB">Yem $yem</span><span style="color: #007700">) {<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">. </span><span style="color: #DD0000">" " </span><span style="color: #007700">. </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$yem</span><span style="color: #007700">) . </span><span style="color: #DD0000">"yer"</span><span style="color: #007700">;<br />    }<br />}</span></span></code></div>
   </div>

  </div>

  <p class="para">
   Aşağıdaki örnek az özgüllüğün davranışını gösterir:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$mırnav </span><span style="color: #007700">= (new </span><span style="color: #0000BB">KediYuvası</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">sahiplen</span><span style="color: #007700">(</span><span style="color: #DD0000">"Tekir"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$kediYemi </span><span style="color: #007700">= new </span><span style="color: #0000BB">HayvanYemi</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$mırnav</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ye</span><span style="color: #007700">(</span><span style="color: #0000BB">$kediYemi</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$kuçu </span><span style="color: #007700">= (new </span><span style="color: #0000BB">KöpekYuvası</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">sahiplen</span><span style="color: #007700">(</span><span style="color: #DD0000">"Çomar"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$kemik </span><span style="color: #007700">= new </span><span style="color: #0000BB">Yem</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$kuçu</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ye</span><span style="color: #007700">(</span><span style="color: #0000BB">$kemik</span><span style="color: #007700">);</span></span></code></div>
   </div>

   <p class="para">
Yukarıdaki örneğin çıktısı:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Tekir HayvanYemi yer
Çomar Yem yer
</pre></div>
   </div>

   <p class="para">
    Peki $mırnav $kemik <span class="methodname"><strong>ye()</strong></span>meye çalışırsa ne olur?
   </p>

   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">$mırnav-&gt;ye($kemik);</span></code></div>
   </div>

   <p class="para">
Yukarıdaki örneğin çıktısı:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught TypeError: Argument 1 passed to Hayvan::ye() must be an instance of HayvanYemi, instance of Yem given
Türkçesi: Ölümcül hata: ... : Hayvan::ye() yöntemine aktarılan 1. bağımsız değişken
bir HayvanYemi örneği olmalı, Yem örneği verildi
</pre></div>
   </div>
  </div>
 </div>
</div><?php manual_footer($setup); ?>