mirror of
https://github.com/php/doc-tr.git
synced 2026-03-23 23:02:09 +01:00
381 lines
9.8 KiB
XML
381 lines
9.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 3d522c890d98c563bb283cf89ec5da5f535cfb8f Maintainer: nilgun Status: ready -->
|
||
<!-- CREDITS: tpug, sezer -->
|
||
<sect1 xml:id="language.oop5.interfaces" xmlns="http://docbook.org/ns/docbook">
|
||
<title>Nesne Arayüzleri</title>
|
||
<para>
|
||
Nesne arayüzleri, bir sınıfın gerçeklemesi gereken yöntemlerin
|
||
belirtildiği kodu, bu yöntemlerin nasıl gerçekleneceğini tanımlamaksızın
|
||
oluşturmanıza imkan sağlar. Arayüzler, sınıflar ve niteliklerle aynı isim
|
||
alanını paylaşır, bu nedenle aynı adı kullanmayabilirler.
|
||
</para>
|
||
<para>
|
||
Arayüzler, sınıflardan farklı olarak <literal>class</literal> yerine
|
||
<literal>interface</literal> anahtar sözcüğü kullanılarak ve içeriğinde
|
||
hiçbir tanımlı yöntem olmaksızın tanımlanırlar.
|
||
</para>
|
||
<para>
|
||
Bir arayüzdeki tüm yöntemler, arayüzün doğası gereği <code>public</code>
|
||
olarak bildirilmelidir.
|
||
</para>
|
||
<para>
|
||
Uygulamada, arayüzler birbirlerini tamamlayan iki amaca hizmet eder::
|
||
</para>
|
||
<simplelist>
|
||
<member>
|
||
Geliştiricilerin, aynı arayüzü veya arayüzleri gerçekledikleri için
|
||
birbirlerinin yerine kullanılabilecek farklı sınıflardan nesneler
|
||
oluşturabilmelerini sağlamak. Böylece, kullanıldıkları kodda herhangi bir
|
||
değişiklik yapılmasına gerek kalmadan bu farklı gerçeklenimler arasında
|
||
geçiş yapılabilir. Yaygın bir örnek, çoklu veritabanı erişim hizmetleri,
|
||
çoklu ödeme ağ geçitleri veya farklı önbelleğe alma stratejileridir.
|
||
</member>
|
||
<member>
|
||
Nesnenin başka ne yapabileceğini veya nasıl uygulandığını umursamadan,
|
||
bir işlev veya yöntemin arayüze uyan bir bağımsız değişkeni kabul etmesini ve
|
||
üzerinde çalışmasını sağlamak. Bu arayüzler, davranışın önemini açıklamak
|
||
için genellikle <literal>Iterable</literal> (Yinelenebilir),
|
||
<literal>Cacheable</literal> (Önbelleğe Alınabilir),
|
||
<literal>Renderable</literal> (Yorumlanabilir) vb. şeklinde adlandırılır.
|
||
</member>
|
||
</simplelist>
|
||
<para>
|
||
Arayüzler, bu yöntemleri gerçeklemek için sınıfların gerçeklenmesini
|
||
gerektiren <link linkend="language.oop5.magic">sihirli yöntemler</link>
|
||
tanımlayabilir.
|
||
</para>
|
||
<note>
|
||
<para>
|
||
Destekleniyor olsa bile, arayüzlere <link
|
||
linkend="language.oop5.decon.constructor">kurucuların</link> dahil
|
||
edilmesi kesinlikle önerilmez. Bunu yapmak, arayüzü gerçekleyen nesnenin
|
||
esnekliğini önemli ölçüde azaltır. Ek olarak, kurucular, tutarsız ve
|
||
beklenmeyen davranışlara neden olabilecek miras alma kuralları tarafından
|
||
zorlanmaz.
|
||
</para>
|
||
</note>
|
||
<sect2 xml:id="language.oop5.interfaces.implements">
|
||
<title><code>implements</code> işleci</title>
|
||
<para>
|
||
Bir arayüzü gerçeklemek için, <literal>implements</literal> işleci
|
||
kullanılır. Arayüzdeki tüm yöntemler bir sınıf içersinde
|
||
gerçeklenmelidir; aksi takdirde bir ölümcül hata alırsınız. Bir sınıfın,
|
||
aralarına virgül koyarak birden fazla arayüzü gerçeklemesi sağlanabilir.
|
||
</para>
|
||
<warning>
|
||
<para>
|
||
Bir arayüzü gerçekleyen bir sınıf, bağımsız değişkenleri için
|
||
arayüzdekinden farklı bir ad kullanabilir. Bununla birlikte, PHP 8.0'dan
|
||
itibaren dil, <link linkend="functions.named-arguments">isimli bağımsız
|
||
değişkenleri</link> desteklemektedir, bu da çağrıcıların arayüzdeki
|
||
bağımsız değişken adına güvenebileceği anlamına gelir. Bu nedenle,
|
||
geliştiricilerin gerçeklenen arayüzle aynı bağımsız değişken adlarını
|
||
kullanmaları şiddetle tavsiye edilir.
|
||
</para>
|
||
</warning>
|
||
<note>
|
||
<para>
|
||
Arayüzler, sınıflar gibi <link linkend="language.oop5.inheritance">
|
||
extends</link> işleciyle genişletilebilir.
|
||
</para>
|
||
</note>
|
||
<note>
|
||
<para>
|
||
Bir sınıf bir arayüzü gerçeklerken, bunu <link
|
||
linkend="language.oop.lsp">bağımsız değişken adı ve sırası arayüzle
|
||
uyumlu</link> yöntemler kullanarak yapmalıdır. Bir sınıf, aynı adlı
|
||
yöntem bildiren birden çok arayüz gerçekleyebilir. Bu durumda gerçeklenim,
|
||
tüm arayüzler için <link linkend="language.oop.lsp">bağımsız değişken adı
|
||
ve sırası uyumluk kurallarına</link> uygun olmalıdır. Böylece, <link
|
||
linkend="language.oop5.variance">özgüllük</link> uygulanabilir olur.
|
||
</para>
|
||
</note>
|
||
</sect2>
|
||
<sect2 xml:id="language.oop5.interfaces.constants">
|
||
<title>Sabitler</title>
|
||
<para>
|
||
Arayüzlerin sabitlerinin olması mümkündür. Arayüz sabitleri, tıpkı
|
||
<link linkend="language.oop5.constants">sınıf sabitleri</link> gibi
|
||
çalışır. PHP 8.1.0 öncesinde, kendilerini miras alan sınıflar veya
|
||
arayüzler tarafından geçersiz kılınamazlardı.
|
||
</para>
|
||
</sect2>
|
||
<sect2 xml:id="language.oop5.interfaces.examples">
|
||
&reftitle.examples;
|
||
<example xml:id="language.oop5.interfaces.examples.ex1">
|
||
<title>- Arayüz örneği</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
// 'Template' arayüzünü tanımlayalım
|
||
interface Template
|
||
{
|
||
public function setVariable($name, $var);
|
||
public function getHtml($template);
|
||
}
|
||
|
||
// Arayüzü gerçekleyelim
|
||
// Bu çalışacaktır
|
||
class WorkingTemplate implements Template
|
||
{
|
||
private $vars = [];
|
||
|
||
public function setVariable($name, $var)
|
||
{
|
||
$this->vars[$name] = $var;
|
||
}
|
||
|
||
public function getHtml($template)
|
||
{
|
||
foreach($this->vars as $name => $value) {
|
||
$template = str_replace('{' . $name . '}', $value, $template);
|
||
}
|
||
|
||
return $template;
|
||
}
|
||
}
|
||
|
||
// Bu çalışmayacaktır
|
||
// Ölümcül hata: BadTemplate sınıfı 1 soyut yöntem içermektedir
|
||
// dolayısıyla soyut olarak tanımlanması gerekir (Template::getHtml)
|
||
class BadTemplate implements Template
|
||
{
|
||
private $vars = [];
|
||
|
||
public function setVariable($name, $var)
|
||
{
|
||
$this->vars[$name] = $var;
|
||
}
|
||
}
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<example xml:id="language.oop5.interfaces.examples.ex2">
|
||
<title>- Genişletilebilir Arayüzler</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
interface A
|
||
{
|
||
public function foo();
|
||
}
|
||
|
||
interface B extends A
|
||
{
|
||
public function baz(Baz $baz);
|
||
}
|
||
|
||
// Bu çalışır
|
||
class C implements B
|
||
{
|
||
public function foo()
|
||
{
|
||
}
|
||
|
||
public function baz(Baz $baz)
|
||
{
|
||
}
|
||
}
|
||
|
||
// Bu çalışmaz, ölümcül hatayla sonuçlanır
|
||
class D implements B
|
||
{
|
||
public function foo()
|
||
{
|
||
}
|
||
|
||
public function baz(Foo $foo)
|
||
{
|
||
}
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<example xml:id="language.oop5.interfaces.examples.variance.multiple.interfaces">
|
||
<title>- Çoklu arayüzlerle özgüllük uyumluluğu</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
class Foo {}
|
||
class Bar extends Foo {}
|
||
|
||
interface A {
|
||
public function myfunc(Foo $arg): Foo;
|
||
}
|
||
|
||
interface B {
|
||
public function myfunc(Bar $arg): Bar;
|
||
}
|
||
|
||
class MyClass implements A, B
|
||
{
|
||
public function myfunc(Foo $arg): Bar
|
||
{
|
||
return new Bar();
|
||
}
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<example xml:id="language.oop5.interfaces.examples.ex3">
|
||
<title>- Çok sayıda arayüz oluşturma</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
interface A
|
||
{
|
||
public function foo();
|
||
}
|
||
|
||
interface B
|
||
{
|
||
public function bar();
|
||
}
|
||
|
||
interface C extends A, B
|
||
{
|
||
public function baz();
|
||
}
|
||
|
||
class D implements C
|
||
{
|
||
public function foo()
|
||
{
|
||
}
|
||
|
||
public function bar()
|
||
{
|
||
}
|
||
|
||
public function baz()
|
||
{
|
||
}
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<example xml:id="language.oop5.interfaces.examples.ex4">
|
||
<title>- Arayüzler ve sabitleri</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
interface A
|
||
{
|
||
const B = 'Arayüz sabiti';
|
||
}
|
||
|
||
// Şunu basar: Arayüz sabiti
|
||
echo A::B;
|
||
|
||
|
||
class B implements A
|
||
{
|
||
const B = 'Sınıf sabiti';
|
||
}
|
||
|
||
// Şunu basar: Sınıf sabiti
|
||
// PHP 8.1.0 öncesinde, sabitler geçersiz kılınamadığından bu çalışmazdı.
|
||
echo B::B;
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<example xml:id="language.oop5.interfaces.examples.ex5">
|
||
<title>- Soyut sınıflı arayüzler</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
interface A
|
||
{
|
||
public function foo(string $s): string;
|
||
|
||
public function bar(int $i): int;
|
||
}
|
||
|
||
// Bir soyut sınıf bir arayüzün sadece bir bölümünü gerçekleyebilir.
|
||
// Kalanını soyut sınıfı genişleten sınıflar gerçeklemelidir.
|
||
abstract class B implements A
|
||
{
|
||
public function foo(string $s): string
|
||
{
|
||
return $s . PHP_EOL;
|
||
}
|
||
}
|
||
|
||
class C extends B
|
||
{
|
||
public function bar(int $i): int
|
||
{
|
||
return $i * 2;
|
||
}
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<example xml:id="language.oop5.interfaces.examples.ex6">
|
||
<title>- Aynı anda genişletme ve gerçekleme</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
class One
|
||
{
|
||
/* ... */
|
||
}
|
||
|
||
interface Usable
|
||
{
|
||
/* ... */
|
||
}
|
||
|
||
interface Updatable
|
||
{
|
||
/* ... */
|
||
}
|
||
|
||
// Burada sözcük sırası önemli: 'extends' önce gelmeli.
|
||
class Two extends One implements Usable, Updatable
|
||
{
|
||
/* ... */
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<para>
|
||
Bir arayüz tür bildirimiyle belli bir nesnenin belli yöntemleri içermesini
|
||
sağlayabilir. Ayrıca bakınız:
|
||
<link linkend="language.operators.type">instanceof</link> işleci ve
|
||
<link linkend="language.types.declarations">Tür Bildirimleri</link>.
|
||
</para>
|
||
</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
|
||
-->
|