1
0
mirror of https://github.com/php/doc-tr.git synced 2026-03-23 23:02:09 +01:00
Files
archived-doc-tr/language/oop5/overloading.xml
2022-12-18 21:12:05 +03:00

334 lines
11 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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>ı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>
ı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>ı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ıı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
ı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
-->