mirror of
https://github.com/php/doc-tr.git
synced 2026-03-23 23:02:09 +01:00
334 lines
11 KiB
XML
334 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 2ab7e9d763666526942ed4477c4f876beb160892 Maintainer: nilgun Status: ready -->
|
||
<!-- CREDITS: tpug, sezer -->
|
||
<sect1 xml:id="language.oop5.overloading" xmlns="http://docbook.org/ns/docbook">
|
||
<title>Aşırı Yükleme</title>
|
||
<para>
|
||
PHP'deki aşırı yükleme, bir sınıfın özelliklerini ve yöntemlerini dinamik
|
||
olarak <quote>oluşturmak</quote> anlamına gelmektedir. Bu dinamik öğeler,
|
||
çeşitli eylem türleri için sınıf içinde oluşturulabilen sihirli
|
||
yöntemler üzerinden işleme sokulurlar.
|
||
</para>
|
||
<para>
|
||
Aşırı yükleme yöntemleri, henüz bildirilmemiş veya geçerli etki alanında
|
||
<link linkend="language.oop5.visibility">görünür</link> olmayan özellik ve
|
||
yöntemlerle etkileşilmek istendiğinde çağrılırlar. Bu bölümün kalanında
|
||
bu bildirim ve görünürlükle ilgili durumdan bahsederken
|
||
<quote>erişilemeyen özellikler</quote> ve
|
||
<quote>erişilemeyen yöntemler</quote> terimlerini kullanacağız.
|
||
</para>
|
||
<para>
|
||
Tüm aşırı yükleme yöntemlerinin <literal>public</literal> olarak
|
||
tanımlanması gerekir.
|
||
</para>
|
||
<para>
|
||
Bu sihirli yöntemlerin bağımsız değişkenlerinin hiçbiri <link
|
||
linkend="functions.arguments.by-reference">gönderimli olarak
|
||
aktarılamaz</link>.
|
||
</para>
|
||
<note>
|
||
<para>
|
||
PHP'nin <quote>aşırı yükleme</quote> konusundaki yorumu çoğu nesne
|
||
yönelimli dilden farklıdır. Aşırı yükleme geleneksel olarak, dile, farklı
|
||
miktar ve türde bağımsız değişkene sahip aynı isimde çok sayıda yönteme sahip
|
||
olabilme yeteneği sağlar.
|
||
</para>
|
||
</note>
|
||
|
||
<sect2 xml:id="language.oop5.overloading.members">
|
||
<title>Özelliklerde aşırı yükleme</title>
|
||
|
||
<methodsynopsis xml:id="object.set">
|
||
<modifier>public</modifier> <type>void</type><methodname>__set</methodname>
|
||
<methodparam><type>string</type><parameter>isim</parameter></methodparam>
|
||
<methodparam><type>mixed</type><parameter>değer</parameter></methodparam>
|
||
</methodsynopsis>
|
||
<methodsynopsis xml:id="object.get">
|
||
<modifier>public</modifier> <type>mixed</type><methodname>__get</methodname>
|
||
<methodparam><type>string</type><parameter>isim</parameter></methodparam>
|
||
</methodsynopsis>
|
||
<methodsynopsis xml:id="object.isset">
|
||
<modifier>public</modifier> <type>bool</type><methodname>__isset</methodname>
|
||
<methodparam><type>string</type><parameter>isim</parameter></methodparam>
|
||
</methodsynopsis>
|
||
<methodsynopsis xml:id="object.unset">
|
||
<modifier>public</modifier> <type>void</type><methodname>__unset</methodname>
|
||
<methodparam><type>string</type><parameter>isim</parameter></methodparam>
|
||
</methodsynopsis>
|
||
|
||
<para>
|
||
<link linkend="object.set">__set()</link> erişilemeyen (protected veya
|
||
private) veya varolmayan özelliklere veri yazarken çalıştırılır.
|
||
</para>
|
||
|
||
<para>
|
||
<link linkend="object.get">__get()</link> erişilemeyen (protected veya
|
||
private) veya varolmayan özelliklerden veri okurken devreye sokulur.
|
||
</para>
|
||
|
||
<para>
|
||
<link linkend="object.isset">__isset()</link> erişilemeyen (protected veya
|
||
private) veya varolmayan özellikler için <function>isset</function> veya
|
||
<function>empty</function> çağrıldığında tetiklenir.
|
||
</para>
|
||
|
||
<para>
|
||
<link linkend="object.unset">__unset()</link> erişilemeyen (protected veya
|
||
private) veya varolmayan özellikler için <function>unset</function>
|
||
kullanıldığında çağrılır.
|
||
</para>
|
||
<para>
|
||
<varname>$isim</varname> bağımsız değişkeni etkileşime girilecek özelliğin
|
||
ismidir. <link linkend="object.set">__set()</link> yönteminin
|
||
<varname>$değer</varname> bağımsız değişkeni, <varname>$isim</varname> adlı
|
||
özelliğe atanacak değeri belirler.
|
||
</para>
|
||
<para>
|
||
Özellikler üzerindeki aşırı yükleme sadece nesne bağlamında çalışır. Bu
|
||
sihirli yöntemler statik bağlamda tetiklenmeyecektir. Bu bakımdan, bu
|
||
yöntemler <link linkend="language.oop5.static">static</link>
|
||
bildirilmemelidir. Sihirli aşırı yükleme yöntemleri
|
||
<link linkend="language.oop5.static">static</link>
|
||
bildirilirse bir uyarı çıktılar.
|
||
</para>
|
||
|
||
<note>
|
||
<para>
|
||
PHP'nin atama işlecini ele alış yönteminden dolayı
|
||
<link linkend="object.set">__set()</link> yönteminin dönüş değeri
|
||
yoksayılır. Benzer şekilde,
|
||
<literal><![CDATA[ $a = $obj->b = 8; ]]></literal> örneğindeki
|
||
gibi zincirleme atamalarda
|
||
<link linkend="object.get">__get()</link> asla çağrılmaz.
|
||
</para>
|
||
</note>
|
||
|
||
<note>
|
||
<para>
|
||
PHP aşırı yüklü bir yöntemi aynı aşırı yüklü yöntemin içinden çağırmaz.
|
||
Yani, <link linkend="object.get">__get()</link> içinde
|
||
<code>return $this->foo</code> yazılırsa <literal>null</literal> dönecek
|
||
ve <link linkend="object.get">__get()</link> işlevini ikinci kez
|
||
çağırmak yerine <literal>foo</literal> diye bir özellik tanımlı
|
||
olmadığından bir <constant>E_WARNING</constant> tetiklenecektir.
|
||
Ancak, aşırı yüklü yöntemler örtük olarak başka aşırı yüklü yöntemleri
|
||
çağırabilir (<link linkend="object.set">__set()</link>'i tetikleyen
|
||
<link linkend="object.get">__get()</link> gibi).
|
||
</para>
|
||
</note>
|
||
|
||
<example>
|
||
<title>- <link linkend="object.get">__get()</link>,
|
||
<link linkend="object.set">__set()</link>,
|
||
<link linkend="object.isset">__isset()</link> ve
|
||
<link linkend="object.unset">__unset()</link> ile
|
||
aşırı yükleme örneği</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
class ÖzellikSınama
|
||
{
|
||
/* Aşırı yüklemeye konu veriler burada. */
|
||
private $veri = array();
|
||
|
||
/* Bildirilmiş özellikler için aşırı yükleme kullanılmaz. */
|
||
public $bildirilmiş = 1;
|
||
|
||
/* Aşırı yükleme sadece sınıf dışından erişilemeyen özellikler içindir.
|
||
*/
|
||
private $gizli = 2;
|
||
|
||
public function __set($isim, $değer)
|
||
{
|
||
echo "'$isim' adlı özelliğe '$değer' atanıyor.\n";
|
||
$this->veri[$isim] = $değer;
|
||
}
|
||
|
||
public function __get($isim)
|
||
{
|
||
echo "'$isim' adlı özelliğin değeri isteniyor\n";
|
||
if (array_key_exists($isim, $this->veri)) {
|
||
return $this->veri[$isim];
|
||
}
|
||
|
||
$trace = debug_backtrace();
|
||
trigger_error(
|
||
$trace[0]['file'] . ' dosyasının ' .
|
||
$trace[0]['line'] . '. satırında ' .
|
||
'__get() ile tanımsız özellik istendi: ' . $isim,
|
||
E_USER_NOTICE);
|
||
return null;
|
||
}
|
||
|
||
/** PHP 5.1.0'dan itibaren */
|
||
public function __isset($isim)
|
||
{
|
||
echo "'$isim' atanmış mı?\n";
|
||
return isset($this->veri[$isim]);
|
||
}
|
||
|
||
/** PHP 5.1.0'dan itibaren */
|
||
public function __unset($isim)
|
||
{
|
||
echo "'$name' siliniyor\n";
|
||
unset($this->veri[$isim]);
|
||
}
|
||
|
||
/** Sihirli bir yöntem değil; sadece örnek olsun diye. */
|
||
public function gizliyiOku()
|
||
{
|
||
return $this->gizli;
|
||
}
|
||
}
|
||
|
||
|
||
echo "<pre>\n";
|
||
|
||
$obj = new ÖzellikSınama;
|
||
|
||
$obj->a = 1;
|
||
echo $obj->a . "\n\n";
|
||
|
||
var_dump(isset($obj->a));
|
||
unset($obj->a);
|
||
var_dump(isset($obj->a));
|
||
echo "\n";
|
||
|
||
echo $obj->bildirilmiş . "\n\n";
|
||
|
||
echo "'gizli' isimli 'private' özellik ile bir deneme yapalım:\n";
|
||
echo "'private' özellikler sadece sınıf içinde görünürdürler,\n";
|
||
echo "bu yüzden __get() kullanılmaz...\n";
|
||
echo $obj->gizliyiOku() . "\n";
|
||
echo "'private' özellikler sınıf dışında görünür değildirler,\n";
|
||
echo "dolayısıyla __get() kullanılır...\n";
|
||
echo $obj->gizli . "\n";
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen role="php">
|
||
<![CDATA[
|
||
'a' adlı özelliğe '1' atanıyor.
|
||
'a' adlı özelliğin değeri isteniyor
|
||
1
|
||
|
||
'a' atanmış mı?
|
||
bool(true)
|
||
'' siliniyor
|
||
'a' atanmış mı?
|
||
bool(false)
|
||
|
||
1
|
||
|
||
'gizli' isimli 'private' özellik ile bir deneme yapalım:
|
||
'private' özellikler sadece sınıf içinde görünürdürler,
|
||
bu yüzden __get() kullanılmaz...
|
||
2
|
||
'private' özellikler sınıf dışında görünür değildirler,
|
||
dolayısıyla __get() kullanılır...
|
||
'gizli' adlı özelliğin değeri isteniyor
|
||
|
||
Notice: <dosya> dosyasının 71. satırında __get() ile tanımsız özellik istendi: gizli
|
||
]]>
|
||
</screen>
|
||
|
||
</example>
|
||
</sect2>
|
||
|
||
<sect2 xml:id="language.oop5.overloading.methods">
|
||
<title>Yöntemlerde aşırı yükleme</title>
|
||
|
||
<methodsynopsis xml:id="object.call">
|
||
<modifier>public</modifier> <type>mixed</type><methodname>__call</methodname>
|
||
<methodparam><type>string</type><parameter>isim</parameter></methodparam>
|
||
<methodparam><type>array</type><parameter>bağımsız_değişkenler</parameter></methodparam>
|
||
</methodsynopsis>
|
||
<methodsynopsis xml:id="object.callstatic">
|
||
<modifier>public static</modifier> <type>mixed</type><methodname>__callStatic</methodname>
|
||
<methodparam><type>string</type><parameter>isim</parameter></methodparam>
|
||
<methodparam><type>array</type><parameter>bağımsız_değişkenler</parameter></methodparam>
|
||
</methodsynopsis>
|
||
|
||
<para>
|
||
<link linkend="object.call">__call()</link>, erişilemeyen yöntemler bir
|
||
nesne bağlamından çağrıldığında tetiklenir.
|
||
</para>
|
||
|
||
<para>
|
||
<link linkend="object.callstatic">__callStatic()</link>, erişilemeyen
|
||
yöntemler statik bir bağlamdan çağrıldığında tetiklenir.
|
||
</para>
|
||
|
||
<para>
|
||
<varname>$isim</varname> bağımsız değişkeni çağrılan yöntemin ismidir.
|
||
<varname>$bağımsız_değişkenler</varname> bağımsız değişkeni ise
|
||
<varname>$isim</varname> adlı yönteme aktarılan bağımsız değişkenleri içeren
|
||
numararalı bir dizidir.
|
||
</para>
|
||
|
||
<example>
|
||
<title>- <link linkend="object.call">__call()</link> ve
|
||
<link linkend="object.callstatic">__callStatic()</link>
|
||
ile aşırı yüklü örneklenmiş yöntemler</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
class YöntemSınama
|
||
{
|
||
public function __call($isim, $bağımsız_değişkenler)
|
||
{
|
||
// Bilgi: $isim değeri büyük-küçük harfe duyarlıdır.
|
||
echo "Nesnenin '$isim' yöntemi çağrılıyor: "
|
||
. implode(', ', $bağımsız_değişkenler). "\n";
|
||
}
|
||
|
||
public static function __callStatic($isim, $bağımsız_değişkenler)
|
||
{
|
||
// Bilgi: $isim değeri büyük-küçük harfe duyarlıdır.
|
||
echo "Statik yöntem '$isim' çağrılıyor: "
|
||
. implode(', ', $bağımsız_değişkenler). "\n";
|
||
}
|
||
}
|
||
|
||
$obj = new YöntemSınama;
|
||
$obj->deneBakalım('nesne bağlamında');
|
||
|
||
YöntemSınama::deneBakalım('statik bağlamda');
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen role="php">
|
||
<![CDATA[
|
||
Nesnenin 'deneBakalım' yöntemi çağrılıyor: nesne bağlamında
|
||
Statik yöntem 'deneBakalım' çağrılıyor: statik bağlamda
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
|
||
</sect2>
|
||
|
||
</sect1>
|
||
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|