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/interfaces.xml
2023-09-04 10:35:14 +03:00

381 lines
9.8 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: 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
-->