com doc/tr: update for sync with English docs.: language/attributes.xml language/oop5/decon.xml language/types/declarations.xml
[email protected] (Nilgün Belma Bugüner) Wed, 06 Jan 2021 00:38:20 +0000
| Newsgroups | php.doc.tr |
|---|---|
| Message-ID | <[email protected]> |
Commit: 5d04e430acb3190345499179b5ed57c449847b19 Author: Nilgün Belma Bugüner <[email protected]> Wed, 6 Jan 2021 03:38:20 +0300 Parents: 4841b61534898f9591ebc61dacd1d88ce3f33d05 Branches: master Link: http://git.php.net/?p=doc/tr.git;a=commitdiff;h=5d04e430acb3190345499179b5ed57c449847b19 Log: update for sync with English docs. Changed paths: A language/attributes.xml M language/oop5/decon.xml A language/types/declarations.xml
diff_5d04e430acb3190345499179b5ed57c449847b19.txt
(text/plain, 33.2 KB)
diff --git a/language/attributes.xml b/language/attributes.xml
new file mode 100644
index 00000000..db0f59c1
--- /dev/null
+++ b/language/attributes.xml
@@ -0,0 +1,392 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: e132ef28fdcd0a05280a15df68c2fda3c690ba1c Maintainer: nilgun Status: ready -->
+ <chapter xml:id="language.attributes" xmlns="http://docbook.org/ns/docbook">
+ <title>Öznitelikler</title>
+ <sect1 xml:id="language.attributes.overview">
+ <title>Özniteliklere giriş</title>
+ <?phpdoc print-version-for="attributes"?>
+
+ <para>
+ Öznitelikler, koddaki bildirimlerin üzerine yapılandırılmış, makine
+ tarafından okunabilir meta veri bilgilerinin eklenmesine izin verir:
+ Sınıflar, yöntemler, işlevler, değiştirgeler, özellikler ve sınıf
+ sabitleri bir özniteliğin hedefi olabilir. Özniteliklerle tanımlanan
+ meta veriler daha sonra <link linkend="book.reflection">Yansıtma
+ Arayüzleri</link> kullanılarak çalışma anında incelenebilir.
+ Bu nedenle öznitelikler, doğrudan koda gömülmüş bir yapılandırma dili
+ olarak düşünülebilir.
+ </para>
+
+ <para>
+ Özniteliklerle, bir özelliğin kapsamlı gerçeklenimi ile bir
+ uygulamadaki somut kullanımı ayrıştırılabilir. Bir bakıma arayüzler,
+ gerçeklenimleri ile karşılaştırılabilir. Ancak arayüzlerin ve
+ gerçeklenimlerin kodla ilgili olduğu yerlerde öznitelikler, ek bilgi
+ ve yapılandırmaya küçük açıklamalar eklemekle ilgilidir. Arayüzler
+ sınıflarla gerçeklenebilir, ancak öznitelikler ek olarak yöntemler,
+ işlevler, değiştirgeler, özellikler ve sınıf sabitleri üzerinde de
+ bildirilebilir. Bu nedenle arayüzlerden daha esnektir.
+ </para>
+
+ <para>
+ Öznitelik kullanımına basit bir örnek, öznitelikleri kullanmak için isteğe
+ bağlı yöntemlere sahip bir arayüzü dönüştürmektir.
+ <literal>ActionHandler</literal> arayüzünün bir uygulamadaki bir işlemi
+ yerine getirdiğini ve bu arayüzün bazı gerçeklenimlerinin ilklendirilmesi
+ gerekirken diğerlerine bunun gerekmediğini varsayalım.
+ <literal>ActionHandler</literal> arayüzünü gerçekleyen tüm sınıfların
+ <literal>setUp()</literal> yöntemini gerçeklemesi gerekirken, bunu
+ yapmak yerine, onun yerini alabilecek bir öznitelik kullanırız.
+ Bu yaklaşımın tek yararı, öznitelliğin birkaç kez kullanabilmesidir.
+ </para>
+
+ <example>
+ <title>- Bir arayüzün isteğe bağlı yöntemlerini özniteliklerle gerçeklemek
+ </title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+interface ActionHandler
+{
+ public function execute();
+}
+
+#[Attribute]
+class SetUp {}
+
+class CopyFile implements ActionHandler
+{
+ public string $fileName;
+ public string $targetDirectory;
+
+ #[SetUp]
+ public function fileExists()
+ {
+ if (!file_exists($this->fileName)) {
+ throw new RuntimeException("Dosya yok");
+ }
+ }
+
+ #[SetUp]
+ public function targetDirectoryExists()
+ {
+ mkdir($this->targetDirectory);
+ }
+
+ public function execute()
+ {
+ copy($this->fileName, $this->targetDirectory . '/' . basename($this->fileName));
+ }
+}
+
+function executeAction(ActionHandler $actionHandler)
+{
+ $reflection = new ReflectionObject($actionHandler);
+
+ foreach ($reflection->getMethods() as $method) {
+ $attributes = $method->getAttributes(SetUp::class);
+
+ if (count($attributes) > 0) {
+ $methodName = $method->getName();
+
+ $actionHandler->$methodName();
+ }
+ }
+
+ $actionHandler->execute();
+}
+
+$copyAction = new CopyFile();
+$copyAction->fileName = "/tmp/foo.jpg";
+$copyAction->targetDirectory = "/home/user";
+
+executeAction($copyAction);
+]]>
+ </programlisting>
+ </example>
+ </sect1>
+
+ <sect1 xml:id="language.attributes.syntax">
+ <title>Öznitelik Sözdizimi</title>
+
+ <para>
+ Öznitelik sözdizimi çeşitli parçalardan oluşur. İlk olarak, öznitelik
+ bildirimi her zaman bir #[ ile başlar ve bir ] biter. İçeride, virgüllerle
+ ayrılmış bir veya daha fazla öznitelik bulunur. Öznitelik adı,
+ <link linkend="language.namespaces.basics">İsim alanlarının kullanımı:
+ Temeller</link> bölümünde açıklandığı gibi nitelenmemiş, nitelenmiş
+ veya tam nitelenmiş olabilir. Özniteliğin değiştirgeleri isteğe bağlıdır,
+ ancak normalde parantez () içine alınır. Özniteliklerin değiştirgeleri
+ yalnızca değişmez değerler veya sabit ifadeleri olabilir. Hem konumsal
+ hem de isimli değiştirge sözdizimi kullanılabilir.
+ </para>
+
+ <para>
+ Öznitelik adları ve değiştirgeleri bir sınıfa çözümlenir, eğer
+ özniteliğin bir örneği yansıtma arayüzü aracılığıyla istenirse
+ değiştirgeler kurucuya iletilir. Her öznitelik için böyle bir
+ sınıf kullanılmalıdır.
+ </para>
+
+ <example>
+ <title>- Öznitelik Sözdizimi</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+// a.php
+namespace MyExample;
+
+use Attribute;
+
+#[Attribute]
+class MyAttribute
+{
+ const VALUE = 'value';
+
+ private $value;
+
+ public function __construct($value = null)
+ {
+ $this->value = $value;
+ }
+}
+
+// b.php
+
+namespace Another;
+
+use MyExample\MyAttribute;
+
+#[MyAttribute]
+#[\MyExample\MyAttribute]
+#[MyAttribute(1234)]
+#[MyAttribute(value: 1234)]
+#[MyAttribute(MyAttribute::VALUE)]
+#[MyAttribute(array("key" => "value"))]
+#[MyAttribute(100 + 200)]
+class Thing
+{
+}
+
+#[MyAttribute(1234), MyAttribute(5678)]
+class AnotherThing
+{
+}
+]]>
+ </programlisting>
+ </example>
+ </sect1>
+
+
+ <sect1 xml:id="language.attributes.reflection">
+ <title>Özniteliklerin Yansıtma Arayüzü ile Okunması</title>
+
+ <para>
+ Sınıflar, yöntemler, işlevler, değiştirgeler, özellikler ve sınıf
+ sabitlerinden özniteliklere erişmek için kullanılan yansıtma arayüzü, ilgili
+ Reflection nesnelerinin her birine <function>getAttributes</function>
+ yöntemini sağlar. Bu yöntem, öznitelik adı, değiştirgeler ve temsil
+ edilen özniteliğin bir örneğini örneklendirmek için sorgulanabilen
+ <classname>ReflectionAttribute</classname> örneklerini içeren bir
+ dizi döndürür.
+ </para>
+
+ <para>
+ Yansıtılan öznitelik temsilinin gerçek örnekten bu şekilde ayrılması,
+ programcının eksik öznitelik sınıfları, yanlış yazılmış veya eksik
+ değiştirgelerle ilgili hataları elde etme konusundaki denetimini artırır.
+ Öznitelik sınıfının nesneleri, yalnızca <function>newInstance</function>
+ çağrıldıktan sonra başlatılırsa değiştirgelerin doğru eşleşmesi sağlanır,
+ daha önce değil.
+ </para>
+
+ <example>
+ <title>- Özniteliklerin Yansıtma Arayüzü kullanılarak Okunması</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+#[Attribute]
+class MyAttribute
+{
+ public $value;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+}
+
+#[MyAttribute(value: 1234)]
+class Thing
+{
+}
+
+function dumpAttributeData($reflection) {
+ $attributes = $reflection->getAttributes();
+
+ foreach ($attributes as $attribute) {
+ var_dump($attribute->getName());
+ var_dump($attribute->getArguments());
+ var_dump($attribute->newInstance());
+ }
+}
+
+dumpAttributeData(new ReflectionClass(Thing::class));
+/*
+string(11) "MyAttribute"
+array(1) {
+ ["value"]=>
+ int(1234)
+}
+object(MyAttribute)#3 (1) {
+ ["value"]=>
+ int(1234)
+}
+*/
+
+]]>
+ </programlisting>
+ </example>
+
+ <para>
+ Yansıtma örneğindeki tüm öznitelikleri yinelemek yerine, yalnızca belirli
+ bir öznitelik sınıfı, sınıfın ismi değiştirge olarak aktarılarak okunabilir.
+ </para>
+
+ <example>
+ <title>- Yansıtma Arayüzünü kullanarak istenen özniteliklerin okunması</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+function dumpMyAttributeData($reflection) {
+ $attributes = $reflection->getAttributes(MyAttribute::class);
+
+ foreach ($attributes as $attribute) {
+ var_dump($attribute->getName());
+ var_dump($attribute->getArguments());
+ var_dump($attribute->newInstance());
+ }
+}
+
+dumpAttributeData(new ReflectionClass(Thing::class));
+]]>
+ </programlisting>
+ </example>
+ </sect1>
+
+ <sect1 xml:id="language.attributes.classes">
+ <title>Öznitelik Sınıflarının Bildirimi</title>
+
+ <para>
+ Zorunlu olmamakla birlikte, her öznitelik için gerçek bir sınıfın
+ oluşturulması önerilir. En basit durumda, bir use ifadesiyle küresel isim
+ alanından içe aktarılabilen #[Attribute] özniteliğinin bildirimi için
+ yalnızca boş bir sınıfa ihtiyaç vardır.
+ </para>
+
+ <example>
+ <title>- Özniteliklerin kullanılabileceği yerleri kısıtlamak için hedef
+ belirtiminin kullanımı</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+namespace Example;
+
+use Attribute;
+
+#[Attribute]
+class MyAttribute
+{
+}
+]]>
+ </programlisting>
+ </example>
+
+ <para>
+ Bir özniteliğin atanabileceği bildirim türünü kısıtlamak için, #[Attribute]
+ bildirimine ilk değiştirge olarak bir bit maskesi aktarılabilir.
+ </para>
+
+ <example>
+ <title>- Basit Öznitelik sınıfı</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+namespace Example;
+
+use Attribute;
+
+#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
+class MyAttribute
+{
+}
+]]>
+ </programlisting>
+
+ <para>
+ <classname>MyAttribute</classname> sınıfını başka bir türde bildirilmesi,
+ <function>ReflectionAttribute::newInstance</function> çağrısı sırasında bir
+ istisna oluşmasına sebep olur.
+ </para>
+ </example>
+
+ <para>
+ Öntanımlı olarak, bir öznitelik her bildirimde yalnızca bir kere
+ kullanılabilir. Özniteliğin bildirimlerde yinelenebilir olması isteniyorsa,
+ <literal>#[Attribute]</literal> bildiriminde bit maskesinin bir parçası
+ olarak belirtilmelidir.
+ </para>
+
+ <example>
+ <title>- Özniteliğin bir bildirimle defalarca kullanılabilmesi için
+ IS_REPEATABLE kullanımı</title>
+
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+namespace Example;
+
+use Attribute;
+
+#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
+class MyAttribute
+{
+}
+]]>
+ </programlisting>
+
+ </example>
+ </sect1>
+ </chapter>
+
+<!-- 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
+-->
diff --git a/language/oop5/decon.xml b/language/oop5/decon.xml
index 1f7d2772..2a0edf8e 100644
--- a/language/oop5/decon.xml
+++ b/language/oop5/decon.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: a6338d747762e36e01061eae19aadca4167375b6 Maintainer: nilgun Status: ready -->
+<!-- EN-Revision: e4963bb8a4ac3a7af25c0ed2baf74a17d010e2f1 Maintainer: nilgun Status: ready -->
<!-- CREDITS: tpug, sezer -->
<sect1 xml:id="language.oop5.decon" xmlns="http://docbook.org/ns/docbook">
<title>Kurucular ve Yıkıcılar</title>
diff --git a/language/types/declarations.xml b/language/types/declarations.xml
new file mode 100644
index 00000000..fb20a384
--- /dev/null
+++ b/language/types/declarations.xml
@@ -0,0 +1,820 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: 1ffbadf2906a5c85d2f9437b87da3e204ea41b7a Maintainer: nilgun Status: ready -->
+<sect1 xml:id="language.types.declarations">
+ <title>Tür Bildirimleri</title>
+
+ <para>
+ Tür bildirimleri işlev değiştirgelerine, dönüş değerlerine ve PHP 7.4.0'dan
+ itibaren sınıf özelliklerine eklenebilir. Değerin çağrı sırasında belirtilen
+ türde olmasını sağlarlar, aksi takdirde bir <classname>TypeError</classname>
+ oluşur.
+ </para>
+
+ <!-- Find better place where to put this note -->
+ <note>
+ <!-- TODO Link to covariance section -->
+ <para>
+ Bir ebeveyn yöntemi geçersiz kılarken, çocuğun yöntemi ebeveynin
+ herhangi bir dönüş türü bildirimiyle eşleşmelidir. Ebeveyn bir dönüş türü
+ tanımlamıyorsa, çocuk yöntem bunu yapabilir.
+ </para>
+ </note>
+
+ <sect2 xml:id="language.types.declarations.base">
+ <title>Tekil türler</title>
+ <informaltable>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>&Type;</entry>
+ <entry>&Description;</entry>
+ <entry>&Version;</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Sınıf/Arayüz Adı</entry>
+ <entry>
+ Değer, verilen sınıfın veya arabirimin bir örneği (&instanceof;)
+ olmalıdır.
+ </entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry><type>self</type></entry>
+ <entry>
+ Değer, yöntemin tanımlandığı sınıftan örneklenmiş (&instanceof;)
+ olmalıdır. Sadece sınıflarda kullanılabilir.
+ </entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry><type>array</type></entry>
+ <entry>
+ Değer <type>array</type> türünde olmalıdır.
+ </entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry><type>callable</type></entry>
+ <entry>
+ Değer <type>callable</type> türünde ve geçerli olmalıdır.
+ Bir sınıf özelliğinin tür bildirimi kullanılamaz.
+ </entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry><type>bool</type></entry>
+ <entry>
+ Değer mantıksal bir değer olmalıdır.
+ </entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry><type>float</type></entry>
+ <entry>
+ Değer kayan noktalı bir sayı olmalıdır.
+ </entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry><type>int</type></entry>
+ <entry>
+ Değer bir tamsayı olmalıdır.
+ </entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry><type>string</type></entry>
+ <entry>
+ Değer <type>string</type> türünde olmalıdır.
+ </entry>
+ <entry></entry>
+ </row>
+ <row>
+ <entry><type>iterable</type></entry>
+ <entry>
+ Değer <classname>Traversable</classname> sınıfının bir örneğı veya
+ dizisi olmalıdır.
+ </entry>
+ <entry>PHP 7.1.0</entry>
+ </row>
+ <row>
+ <entry><type>object</type></entry>
+ <entry>
+ Değer <type>object</type> türünde olmalıdır.
+ </entry>
+ <entry>PHP 7.2.0</entry>
+ </row>
+ <row>
+ <entry><type>mixed</type></entry>
+ <entry>
+ Değer, herhangi bir değer olabilir.
+ </entry>
+ <entry>PHP 8.0.0</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <warning>
+ <para>
+ Yukarıdaki, sayılarla ifade edilebilen türler için takma adlar
+ desteklenmez. Yapıldığı takdirde bunlar sınıf veya arayüz isimleri
+ olarak değerlendirilir. Örneğin, tür bildirimi olarak
+ <literal>boolean</literal> kullanmak, <type>bool</type> türünde bir
+ değer yerine, <literal>boolean</literal> sınıfının veya arayüzünün
+ örneği olan bir değer gerektirir:
+ </para>
+ <para>
+ <example>
+ <programlisting role="php">
+<![CDATA[
+<?php
+ function test(boolean $param) {}
+ test(true);
+?>
+]]>
+ </programlisting>
+ &example.outputs.8;
+ <screen>
+<![CDATA[
+Warning: "boolean" will be interpreted as a class name. Did you mean "bool"? Write "\boolean" to suppress this warning in /in/9YrUX on line 2
+
+Fatal error: Uncaught TypeError: test(): Argument #1 ($param) must be of type boolean, bool given, called in - on line 3 and defined in -:2
+Stack trace:
+#0 -(3): test(true)
+#1 {main}
+ thrown in - on line 2
+]]>
+ </screen>
+ </example>
+ </para>
+ </warning>
+
+ <sect3 xml:id="language.types.declarations.mixed">
+ <title>mixed</title>
+
+ <para>
+ <type>mixed</type> türü
+ <type class="union">
+ <type>array</type><type>bool</type><type>callable</type>
+ <type>int</type><type>float</type><type>object</type>
+ <type>resource</type><type>string</type><type>null</type>
+ </type>
+ <link linkend="language.types.declarations.union">birlik türüne</link>
+ eşdeğerdir. PHP 8.0.0 ve sonrasında kullanılabilir.
+ </para>
+ </sect3>
+
+ <sect3 xml:id="language.types.declarations.examples">
+ &reftitle.examples;
+ <example>
+ <title>- Temel sınıf türü bildirimi</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+class C {}
+class D extends C {}
+
+// Bu C ile genişletilmiyor.
+class E {}
+
+function f(C $c) {
+ echo get_class($c)."\n";
+}
+
+f(new C);
+f(new D);
+f(new E);
+?>
+]]>
+ </programlisting>
+ &example.outputs.8;
+ <screen>
+<![CDATA[
+C
+D
+
+Fatal error: Uncaught TypeError: f(): Argument #1 ($c) must be of type C, E given, called in /in/gLonb on line 14 and defined in /in/gLonb:8
+Stack trace:
+#0 -(14): f(Object(E))
+#1 {main}
+ thrown in - on line 8
+]]>
+ </screen>
+ </example>
+
+ <example>
+ <title>- Temel arayüz türü bildirimi</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+interface I { public function f(); }
+class C implements I { public function f() {} }
+
+// Bu I'yi gerçeklemiyor.
+class E {}
+
+function f(I $i) {
+ echo get_class($i)."\n";
+}
+
+f(new C);
+f(new E);
+?>
+]]>
+ </programlisting>
+ &example.outputs.8;
+ <screen>
+<![CDATA[
+C
+
+Fatal error: Uncaught TypeError: f(): Argument #1 ($i) must be of type I, E given, called in - on line 13 and defined in -:8
+Stack trace:
+#0 -(13): f(Object(E))
+#1 {main}
+ thrown in - on line 8
+]]>
+ </screen>
+ </example>
+
+ <example>
+ <title>- Temel dönüş türü bildirimi</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+function sum($a, $b): float {
+ return $a + $b;
+}
+
+// Dikkat bu bir float döndürmeyecek.
+var_dump(sum(1, 2));
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+float(3)
+]]>
+ </screen>
+ </example>
+
+ <example>
+ <title>- Bir nesne döndürmek</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+class C {}
+
+function getC(): C {
+ return new C;
+}
+
+var_dump(getC());
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+object(C)#1 (0) {
+}
+]]>
+ </screen>
+ </example>
+ </sect3>
+ </sect2>
+
+ <sect2 xml:id="language.types.declarations.nullable">
+ <title>Boş olabilen türler</title>
+
+ <para>
+ PHP 7.1.0 ve sonrasında, tür isminin önüne bir soru imi
+ (<literal>?</literal>) konarak, tür bildirimleri boş olabilir (nullable)
+ olarak imlenebilmektedir. Bu sözdizimi, değerin belirtilen türde veya &null;
+ olabileceğini belirtir.
+ </para>
+
+ <para>
+ <example>
+ <title>- Boş olabilen değiştirge türü bildirimi</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+class C {}
+
+function f(?C $c) {
+ var_dump($c);
+}
+
+f(new C);
+f(null);
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+object(C)#1 (0) {
+}
+NULL
+]]>
+ </screen>
+ </example>
+
+ <example>
+ <title>- Boş olabilen dönüş türü bildirimi</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+function get_item(): ?string {
+ if (isset($_GET['item'])) {
+ return $_GET['item'];
+ } else {
+ return null;
+ }
+}
+?>
+]]>
+ </programlisting>
+ </example>
+ </para>
+
+ <note>
+ <para>
+ PHP 7.1.0 öncesinde, <literal>null</literal>'u öntanımlı değer yaparak
+ boş olabilen değiştirgeler elde etmek mümkündü. Kalıtım sırasında
+ kesildiği için bu önerilmez.
+ </para>
+ <example>
+ <title>- Boş olabilen değiştirge yapmanın eski yolu</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+class C {}
+
+function f(C $c = null) {
+ var_dump($c);
+}
+
+f(new C);
+f(null);
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+object(C)#1 (0) {
+}
+NULL
+]]>
+ </screen>
+ </example>
+ </note>
+ </sect2>
+
+ <sect2 xml:id="language.types.declarations.union">
+ <title>Birleşim türleri</title>
+ <para>
+ Bir birleşim (union) türü bildirimi, tek bir tür yerine birden fazla türde
+ değer kabul eder. Birleşim türleri <literal>T1|T2|...</literal> sözdizimi
+ kullanılarak belirtilir. Birleşim türleri PHP 8.0.0 ve sonrasında
+ kullanılabilir.
+ </para>
+
+ <sect3 xml:id="language.types.declarations.union.nullable">
+ <title>Boş olabilen birleşim türleri</title>
+ <para>
+ Boş (<literal>null</literal>) tür, birleşimlerin bir parçası olarak
+ desteklenir, öyle ki <literal>T1|T2|null</literal> sözdizimi, boş
+ olabilen bir birleşim oluşturmak için kullanılabilir. Mevcut
+ <literal>?T</literal> gösterimi, yaygın <literal>T|null</literal>
+ durumu için bir kısaltma olarak kabul edilir.
+ </para>
+
+ <caution>
+ <simpara>
+ <literal>null</literal> tek başına bir tür olarak kullanılamaz.
+ </simpara>
+ </caution>
+ </sect3>
+
+ <sect3 xml:id="language.types.declarations.union.false">
+ <title>false sözde türü</title>
+ <para>
+ <literal>false</literal> değişmez türü, birleşimlerin bir parçası olarak
+ desteklenir ve tarihsel nedenlerden ötürü, birçok dahili işlev başarısızlık
+ durumunda <literal>null</literal> yerine <literal>false</literal> döndürür.
+ Böyle bir işleve klasik bir örnek <function>strpos</function>'dur.
+ </para>
+
+ <caution>
+ <simpara>
+ <literal>false</literal> tek başına bir tür olarak kullanılamaz (boş
+ olabilen tür dahil). Bu nedenle, <literal>false</literal>,
+ <literal>false|null</literal> ve <literal>?false</literal> ifadelerinin hiçbirine izin verilmez.
+ </simpara>
+ </caution>
+ <caution>
+ <simpara>
+ <literal>true</literal> tek başına türü mevcut <emphasis>değildir</emphasis>.
+ </simpara>
+ </caution>
+ </sect3>
+
+ <sect3 xml:id="language.types.declarations.union.redundant">
+ <title>Yinelenen ve artık türler</title>
+ <para>
+ Birleşim türü bildirimlerindeki basit hataları yakalamak için, sınıf
+ yüklemesi gerçekleştirilmeden algılanabilen artık türler bir derleme anı hatasıyla sonuçlanacaktır. Şunları içerir:
+
+ <itemizedlist>
+ <listitem>
+ <simpara>
+ Ad-çözümlemeli her tür yalnızca bir kere görünebilir. Örneğin,
+ <literal>int|string|INT</literal> birleşimi bir hatayla sonuçlanır.
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ Eğer <type>bool</type> kullanılmışsa, yanına <type>false</type> eklenemez.
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ Eğer <type>object</type> kullanılmışsa, yanına sınıf türleri eklenemez.
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ Eğer <type>iterable</type> kullanılmışsa, yanına <type>array</type>
+ ve <classname>Traversable</classname> eklenemez.
+ </simpara>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <note>
+ <simpara>
+ Bu, türün "en düşükte" olduğunu garanti etmez, çünkü bunu yapmak tüm
+ kullanılan sınıf türlerinin yüklenmesini gerektirecektir.
+ </simpara>
+ </note>
+
+ <para>
+ Örneğin, <literal>A</literal> ve <literal>B</literal> sınıfın diğer adları
+ ise, <literal>A|B</literal> sonradan <literal>A</literal> veya
+ <literal>B</literal>'ye indirgense bile meşru bir birleşim türü olarak kalır.
+ Benzer şekilde, <literal>B</literal> sınıfı <literal>A</literal>'yı
+ genişletirse, <literal>A|B</literal> de meşru bir birleşim türüdür,
+ ancak sadece <literal>A</literal>'ya indirgenebilir.
+
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php
+function foo(): int|INT {} // izin verilmez
+function foo(): bool|false {} // izin verilmez
+
+use A as B;
+function foo(): A|B {} // izin verilmez ("use" ad çözünürlüğünün bir parçasıdır)
+
+class_alias('X', 'Y');
+function foo(): X|Y {} // izin verilir (fazlalık sadece çalışma anında anlaşılır)
+?>
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ </sect3>
+
+ </sect2>
+
+ <sect2 xml:id="language.types.declarations.return-only">
+ <title>Dönüşe özgü türler</title>
+
+ <sect3 xml:id="language.types.declarations.void">
+ <title>void</title>
+ <para>
+ <literal>void</literal> işlevin bir değer döndürmediğini belirten bir
+ dönüş türüdür. Bundan dolayı birleşim türündeki bildirimlerde yer alamaz.
+ PHP 7.1.0 ve sonrasında geçerlidir.
+ </para>
+ </sect3>
+
+ <sect3 xml:id="language.types.declarations.static">
+ <title>static</title>
+ <para>
+ Değer, yöntemin çağrıldığı sınıf örneğinin örneklendiği sınıfın bir örneği
+ olmalıdır. PHP 8.0.0 ve sonrasında geçerlidir.
+ </para>
+ </sect3>
+ </sect2>
+
+ <sect2 xml:id="language.types.declarations.strict">
+ <title>Katı kodlama</title>
+
+ <para>
+ Öntanımlı olarak, PHP, eğer mümkünse, yanlış türdeki değerleri beklenen
+ sayıl tür bildirimine zorlar. Örneğin, <type>string</type> türünde bir
+ değer alması beklenen bir değiştirge için <type>int</type> değer verilen
+ bir işlev için değer <type>string</type> türüne zorlanır.
+ </para>
+
+ <para>
+ Katı kipi dosya bazında etkinleştirmek mümkündür. Katı kipte, yalnızca tür
+ bildirimine tam olarak karşılık gelen bir değer kabul edilir, aksi takdirde
+ bir <classname>TypeError</classname> istisnası oluşur. Bu kuralın tek
+ istisnası, bir <type>int</type> değerinin bir <type>float</type> tür
+ bildirimine aktarılmasıdır.
+ </para>
+
+ <warning>
+ <simpara>
+ Dahili işlevlerden gelen işlev çağrıları, <literal>strict_types</literal>
+ bildiriminden etkilenmeyecektir.
+ </simpara>
+ </warning>
+
+ <para>
+ Katı modu etkinleştirmek için, &declare; deyimi
+ <literal>strict_types</literal> bildirimi ile birlikte kullanılır.
+ </para>
+
+ <note>
+ <para>
+ Katı kodlama, katı kodlama etkinleştirilmiş dosya içinden yapılan işlev
+ çağrıları için geçerlidir, o dosya içinde bildirilen işlevler için geçerli
+ değildir. Katı-kodlama-etkin bir dosyada tanımlanan bir işleve,
+ katı-kodlama-etkin-olmayan bir dosyadan çağrı yapılırsa, çağrıcının
+ tercihine (zorlayıcı kodlamaya) saygı gösterilecek ve değer zorlanacaktır.
+ </para>
+ </note>
+
+ <note>
+ <para>
+ Katı kodlama sadece sayıl tür bildirimleri için tanımlanır.
+ </para>
+ </note>
+
+ <example>
+ <title>- Değiştirge değerleri için katı kodlama</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+declare(strict_types=1);
+
+function sum(int $a, int $b) {
+ return $a + $b;
+}
+
+var_dump(sum(1, 2));
+var_dump(sum(1.5, 2.5));
+?>
+]]>
+ </programlisting>
+ &example.outputs.8;
+ <screen>
+<![CDATA[
+int(3)
+
+Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 9 and defined in -:4
+Stack trace:
+#0 -(9): sum(1.5, 2.5)
+#1 {main}
+ thrown in - on line 4
+]]>
+ </screen>
+ </example>
+
+ <example>
+ <title>- Değiştirge değerleri için zorlayıcı kodlama</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+function sum(int $a, int $b) {
+ return $a + $b;
+}
+
+var_dump(sum(1, 2));
+
+// Değerler tamsayılara zorlanacaktır, sonuç değil: çıktıya bakın!
+var_dump(sum(1.5, 2.5));
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+int(3)
+int(3)
+]]>
+ </screen>
+ </example>
+
+ <example>
+ <title>- Dönüş değerleri için katı kodlama</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+declare(strict_types=1);
+
+function sum($a, $b): int {
+ return $a + $b;
+}
+
+var_dump(sum(1, 2));
+var_dump(sum(1, 2.5));
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+int(3)
+
+Fatal error: Uncaught TypeError: sum(): Return value must be of type int, float returned in -:5
+Stack trace:
+#0 -(9): sum(1, 2.5)
+#1 {main}
+ thrown in - on line 5
+]]>
+ </screen>
+ </example>
+ </sect2>
+
+ <sect2 xml:id="language.types.declarations.union.coercive">
+ <title>Birleşim türleriyle zorlayıcı kodlama</title>
+ <para>
+ Katı kodlama etkinleştirilmediğinde, sayıl tür bildirimleri sınırlı örtük
+ tür zorlamalarına tabidir. Değerin tam türü birleşimin parçası değilse,
+ hedef tür aşağıdaki tercih sırasına göre seçilir:
+
+ <orderedlist>
+ <listitem>
+ <simpara>
+ <type>int</type>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <type>float</type>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <type>string</type>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <type>bool</type>
+ </simpara>
+ </listitem>
+ </orderedlist>
+
+ Tür birleşiminde her ikisi de mevcutsa ve değer PHP'nin mevcut tür denetleme
+ yapısıyla bir türe zorlanabiliyorsa, o tür seçilir. Aksi takdirde bir sonraki
+ tür denenir.
+ </para>
+
+ <caution>
+ <para>
+ Bir istisna olarak, değer bir dizeyse ve hem int hem de float birleşimin
+ parçasıysa, tercih edilen tür, mevcut "sayısal dize" çözümlemesine göre
+ belirlenir. Örneğin, <literal>"42"</literal> için <type>int</type>,
+ <literal>"42.0"</literal> için <type>float</type> seçilir.
+ </para>
+ </caution>
+
+ <note>
+ <para>
+ Yukarıdaki tercih listesinin parçası olmayan türler, örtük zorlama için
+ uygun hedefler değildir. Özellikle, <literal>null</literal> ve
+ <literal>false</literal> türlere hiçbir örtük zorlama yapılmaz.
+ </para>
+ </note>
+
+ <example>
+ <title>- Birleşimin bir tür parçasına zorlanan türlere örnek</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+// int|string
+42 --> 42 // doğru tür
+"42" --> "42" // doğru tür
+new ObjectWithToString --> "Result of __toString()"
+ // nesne int ile hiç uyumlu değil, dizeye dönülür
+42.0 --> 42 // float, int ile uyumlu
+42.1 --> 42 // float, int ile uyumlu
+1e100 --> "1.0E+100" // float, int için çok büyük, dizeye dönülür
+INF --> "INF" // float, int için çok büyük, dizeye dönülür
+true --> 1 // bool, int ile uyumlu
+[] --> TypeError // array, int veya string ile uyumlu değil
+
+// int|float|bool
+"45" --> 45 // int sayısal dize
+"45.0" --> 45.0 // float sayısal dize
+
+"45X" --> true // sayısal dize değil, bool'a dönülür
+"" --> false // sayısal dize değil, bool'a dönülür
+"X" --> true // sayısal dize değil, bool'a dönülür
+[] --> TypeError // array, int float veya bool ile uyumlu değil
+?>
+]]>
+ </programlisting>
+ </example>
+ </sect2>
+
+<!-- TODO figure out what do to with these things -->
+ <sect2 xml:id="language.types.declarations.misc">
+ <title>Çeşitli</title>
+ <example>
+ <title>Başvuruyla aktarılan değiştirgeler</title>
+ <simpara>
+ Bildirilen başvuru değiştirgelerinin türleri işlev girişinde denetlenir, ancak işlev döndüğünde denetlenmez, bu nedenle işlev döndükten sonra değiştirgenin türü değişmiş olabilir.
+ </simpara>
+ <programlisting role="php">
+<![CDATA[
+<?php
+function array_baz(array &$param)
+{
+ $param = 1;
+}
+$var = [];
+array_baz($var);
+var_dump($var);
+array_baz($var);
+?>
+]]>
+ </programlisting>
+ &example.outputs.8;
+ <screen>
+<![CDATA[
+int(1)
+
+Fatal error: Uncaught TypeError: array_baz(): Argument #1 ($param) must be of type array, int given, called in - on line 9 and defined in -:2
+Stack trace:
+#0 -(9): array_baz(1)
+#1 {main}
+ thrown in - on line 2
+]]>
+ </screen>
+ </example>
+
+ <example>
+ <title>- <classname>TypeError</classname> yakalama</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+declare(strict_types=1);
+
+function sum(int $a, int $b) {
+ return $a + $b;
+}
+
+try {
+ var_dump(sum(1, 2));
+ var_dump(sum(1.5, 2.5));
+} catch (TypeError $e) {
+ echo 'Error: ', $e->getMessage();
+}
+?>
+]]>
+ </programlisting>
+ &example.outputs.8;
+ <screen>
+<![CDATA[
+int(3)
+Error: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 10
+]]>
+ </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
+-->