1
0
mirror of https://github.com/php/doc-tr.git synced 2026-03-24 07:12:18 +01:00
Files
archived-doc-tr/language/types/string.xml
2024-08-30 17:44:01 +03:00

1359 lines
40 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: affa37e16f562d9297e83b2e21ec416aadc8b72d Maintainer: nilgun Status: ready -->
<sect1 xml:id="language.types.string">
<title>string</title>
<para>
Bir dize <type>string</type> türünde bir sayıl değer olup bir dizi
tek baytlık karakterden oluşur. Yani, olası karakter sayısı 256'dan
ibarettir. Bu yüzden PHP Unicode için yerleşik desteğe sahip olamıyor.
<link linkend="language.types.string.details">Dize türünün ayrıntıları</link>
belgesine bakınız.
</para>
<note>
<simpara>
32 bitlik derlemelerde, dize uzunluğu en fazla 2GB (2147483647 bayt)
olabilir.
</simpara>
</note>
<sect2 xml:id="language.types.string.syntax">
<title>Sözdizimi</title>
<para>
<type>string</type> türünde bir sayıl dört şekilde belirtilebilir:
</para>
<itemizedlist>
<listitem>
<simpara>
<link linkend="language.types.string.syntax.single">tek tırnaklı dize
</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.string.syntax.double">çift tırnaklı dize
</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.string.syntax.heredoc">yorumlu metin
</link> (heredoc)
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.string.syntax.nowdoc">yorumsuz metin
</link> (nowdoc)
</simpara>
</listitem>
</itemizedlist>
<sect3 xml:id="language.types.string.syntax.single">
<title>Tek tırnaklı dizeler</title>
<para>
Bir dizeyi belirtmenin en basit yolu dizeyi tek tırnak
(<literal>'</literal>) imlerinin arasına almaktır.
</para>
<para>
Tek tırnaklı bir dize içinde tek tırnağı sayıl değeriyle kullanmak
isterseniz önüne bir tersbölü imi getirmelisiniz (<literal>\</literal>).
Bir tersbölü imini sayıl değeriyle kullanmak isterseniz onun da önüne bir
tersbölü imi getirmelisiniz (<literal>\\</literal>). Tersbölü imini
bunlardan başka bir karakterin önünde kullanırsanız, tersbölü imi
karakterle birlikte basılır. <literal>\r</literal> veya
<literal>\n</literal> gibi özel anlamı olan öncelemeler özel anlamı yoksayılarak olduğu gibi basılır.
</para>
<note>
<simpara>
<link linkend="language.types.string.syntax.double">çift tırnak</link> ve
<link linkend="language.types.string.syntax.heredoc">yorumlu metin</link>
sözdizimlerinin aksine, <link linkend="language.variables">değişkenler</link>
ve özel karakterlerin öncelemleri tek tırnaklı dizelerin içinde
kullanıldıklarında yorumlanmazlar.
</simpara>
</note>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
echo 'Bu basit bir dizedir';
echo 'Dizgelerin içinde satırsonu karakterlerini
tıpkı buradaki gibi
kullanabilirsiniz';
// Çıktısı: Arnold dedi ki: "I'll be back"
echo 'Arnold dedi ki: "I\'ll be back"';
// Çıktısı: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// Çıktısı: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// Çıktısı: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// Çıktısı: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
]]>
</programlisting>
</informalexample>
</sect3>
<sect3 xml:id="language.types.string.syntax.double">
<title>Çift tırnaklı dizeler</title>
<para>
Eğer bir dize çift tırnak (") içine alınmışsa PHP, aşağıdaki özel
karakter öncelemlerini yorumlayacaktır:
</para>
<table>
<title>Tersbölü ile öncelenmiş karakterler</title>
<tgroup cols="2">
<thead>
<row>
<entry>Öncelem</entry>
<entry>Anlamı</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>\n</literal></entry>
<entry>satırsonu (LF veya ASCII 10 (0x0A))</entry>
</row>
<row>
<entry><literal>\r</literal></entry>
<entry>satırbaşı (CR veya ASCII 13 (0x0D))</entry>
</row>
<row>
<entry><literal>\t</literal></entry>
<entry>yatay sekme (HT veya ASCII 9 (0x09))</entry>
</row>
<row>
<entry><literal>\v</literal></entry>
<entry>düşey sekme (VT veya ASCII 11 (0x0B))</entry>
</row>
<row>
<entry><literal>\e</literal></entry>
<entry>escape (ESC veya ASCII 27 (0x1B)</entry>
</row>
<row>
<entry><literal>\f</literal></entry>
<entry>sayfa ileri (FF veya ASCII 12 (0x0C))</entry>
</row>
<row>
<entry><literal>\\</literal></entry>
<entry>tersbölü</entry>
</row>
<row>
<entry><literal>\$</literal></entry>
<entry>dolar imi</entry>
</row>
<row>
<entry><literal>\"</literal></entry>
<entry>çift tırnak</entry>
</row>
<row>
<entry><literal>\[0-7]{1,3}</literal></entry>
<entry>
Sekizlik: Bu düzenli ifade ile eşleşen dizilim, karakterin sekizlik
gösterimi (örn, <literal>"\101" === "A"</literal>) olup bir bayta
sığmak için sessizce taşar (örn, <literal>"\400" === "\000"</literal>).
</entry>
</row>
<row>
<entry><literal>\x[0-9A-Fa-f]{1,2}</literal></entry>
<entry>
Onaltılık: Bu düzenli ifade ile eşleşen dizilim, karakterin onaltılık
gösterimidir (örn, <literal>"\x41" === "A"</literal>).
</entry>
</row>
<row>
<entry><literal>\u{[0-9A-Fa-f]+}</literal></entry>
<entry>
Unicode: Bu düzenli ifade ile eşleşen dizilim bir Unicode karakter
kodu olup, dizeye karakter kodunun UTF-8 gösterimini çıktılar.
Kod kaşlı ayraçlarla sarmalanmalıdır
(örn, <literal>"\u{41}" === "A"</literal>).
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Tersbölü imini bunlardan başka bir karakterin önünde kullanırsanız,
tersbölü imi karakterle birlikte basılır.
</para>
<para>
Çift tırnaklı dizelerin en önemli özelliği içerdiği değişkenlerin
yorumlanmasıdır. Bu konuda daha ayrıntılı bilgi edinmek için <link
linkend="language.types.string.parsing">Değişken çözümleme</link>
bölümüne bakınız.
</para>
</sect3>
<sect3 xml:id="language.types.string.syntax.heredoc">
<title>Yorumlu metinler</title>
<simpara>
Bir dizenin sınırlarını belirlemenin üçüncü yolu, <emphasis>yorumlu
metin</emphasis> sözdizimidir. Bir yorumlu metin daima
<literal>&lt;&lt;&lt;</literal> karakterleri ile başlar ve hemen ardından
bir betimleyici ve bir satırsonu karakteri gelir. Asıl dize satırsonu
karakterinden sonra yer alır. Dizgenin sonunu belirtmek üzere dizenin
sonuna, baştaki betimleyici konur.
</simpara>
<simpara>
Kapanış betimleyicisinin dizeden sonraki satırın başında olması
gerekmez. Boşluk veya sekme karakterleriyle girintilenebilir. Bu durumda
girinti miktarı dizedeki tüm satırlardan ayıklanır. PHP 7.3.0 öncesinde
kapanış betimleyicisinin satırın başında olması
<emphasis>gerekirdi</emphasis>.
</simpara>
<simpara>
Ayrıca, betimleyici PHP'deki diğer isimlere uygulanan kurallara uygun
olmalıdır: Sadece bir harfle veya alt çizgi imi ile başlayabilir; sadece
harfler, rakamlar veya alt çizgi imleri içerebilir.
</simpara>
<example>
<title>- PHP 7.3.0 ve sonrası için Yorumlu Metin örneği</title>
<programlisting role="php">
<![CDATA[
<?php
// girintisiz
echo <<<END
a
b
c
\n
END;
// 4 boşluk girintili
echo <<<END
a
b
c
END;
]]>
</programlisting>
&example.outputs.73;
<screen>
<![CDATA[
a
b
c
a
b
c
]]>
</screen>
</example>
<simpara>
Kapanış betimleyicisi, dizedeki tüm satırlardan daha uzun girintilenmişse
<classname>ParseError</classname> istisnası yavrulanır:
</simpara>
<example>
<title>- Kapanış betimleyicisi, dizedeki tüm satırlardan daha uzun girintilenmemeli</title>
<programlisting role="php">
<![CDATA[
<?php
echo <<<END
a
b
c
END;
]]>
</programlisting>
&example.outputs.73;
<screen>
<![CDATA[
PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4
]]>
</screen>
</example>
<simpara>
Kapanış betimleyicisi ve metin girintilenirken sekmeler kullanılabilir,
ancak sekmeler ve boşluklar birlikte kullanılmamalıdır. Böyle bir durumda
<classname>ParseError</classname> istisnası yavrulanır. Girinti için
sekmeleri ve boşlukları karıştırmak okunabilirliğe zararlı olduğundan bu
kısıtlamaya gidilmiştir.
</simpara>
<example>
<title>- Kapanış betimleyicisin girintilenirken sekmeler ve boşluklar
birlikte kullanılmamalı</title>
<programlisting role="php">
<![CDATA[
<?php
// Aşağıdaki kod çalışmaz.
// Metin boşluklarla kapanış betimleyici sekmelerle girintilenmiş
{
echo <<<END
a
END;
}
// Metinde boşluk ve sekmelerin karışık kullanımı
{
echo <<<END
a
END;
}
// Kapanış betimleyicide boşluk ve sekmelerin karışık kullanımı
{
echo <<<END
a
END;
}
]]>
</programlisting>
&example.outputs.73;
<screen>
<![CDATA[
PHP Parse error: Invalid indentation - tabs and spaces cannot be mixed in example.php line 8
]]>
</screen>
</example>
<simpara>
Kapanış betimleyicisinin noktalı virgül ve satırsonu ile sonlandırılması
gerekmez. Örneğin PHP 7.3.0 ve sonrasında aşağıdaki gibi bir kod çalışır:
</simpara>
<example>
<title>- Kapanış betimleyicisinden sonra devam eden ifade</title>
<programlisting role="php">
<![CDATA[
<?php
$values = [<<<END
a
b
c
END, 'd e f'];
var_dump($values);
]]>
</programlisting>
&example.outputs.73;
<screen>
<![CDATA[
array(2) {
[0] =>
string(11) "a
b
c"
[1] =>
string(5) "d e f"
}
]]>
</screen>
</example>
<warning>
<simpara>
Kapanış betimleyicisi satırın hemen başındaysa başka bir sözcüğün parçası
olup olmadığında bakılmaksızın kapanış betimleyici olarak ele alınır ve
<classname>ParseError</classname> istisnasına sebep olur.
</simpara>
<example>
<title>- Metin içindeki kapanış betimleyici dizesi ParseError yavrulatır</title>
<programlisting role="php">
<![CDATA[
<?php
$values = [<<<END
a
b
END ING
END, 'd e f'];
]]>
</programlisting>
&example.outputs.73;
<screen>
<![CDATA[
PHP Parse error: syntax error, unexpected identifier "ING", expecting "]" in example.php on line 6
]]>
</screen>
</example>
<simpara>
Bu sorundan kaçınmak için basit bir kurala uymak yeterlidir:
<emphasis>betimleyiciyi metin gövdesi içinde görünenlerden seçme.</emphasis>.
</simpara>
</warning>
<warning>
<simpara>
PHP 7.3.0 öncesinde, kapanış betimleyicisinin bulunduğu satırda
betimleyicinin hemen ardına konan <emphasis>muhtemel</emphasis> bir
noktalı virgül (<literal>;</literal>) dışında hiçbir karakter
bulunmaması çok önemli olup buna özellikle dikkat etmelisiniz. Yani,
betimleyici özellikle <emphasis>girintilenmemeli</emphasis>; noktalı
virgülden önce ve sonra herhangi bir boşluk karakteri bulunmamalıdır.
Ayrıca, kapanış betimleyicisinden hemen önce gelen karakterin yerel
işletim sistemine özgü satırsonu karakteri olması çok önemlidir.
Bu karakter Unix ve macOS için <literal>\n</literal>'dir. Kapanış
betimleyicisinden (ve olası noktalı virgül karakterinden) sonraki
karakter de böyle bir satırsonu karakteri olmalıdır.
</simpara>
<simpara>
Eğer bu kurallara uyulmaz ve kapanış betimleyicisinin etrafı temiz
tutulmazsa kapanış betimleyicisi algılanamayacağından PHP kapanış
betimleyicisini aramaya devam edecektir. Eğer dosyanın sonuna kadar
uygun bir kapanış betimleyicisi bulunamazsa son satırda bir çözümleme
hatası oluşacaktır.
</simpara>
<para>
Yorumlu metinler sınıf özelliklerini ilklendirmek için kullanılamazlar.
PHP 5.3'ten beri bu sınırlama sadece değişken içeren yorumlu metinler
için geçerlidir. Bunun yerine
<link linkend="language.types.string.syntax.nowdoc">yorumsuz metinler
</link>kullanılabilir.
</para>
<example>
<title>- PHP 7.3.0 öncesi için geçersiz örnek</title>
<programlisting role="php">
<!-- This is an INVALID example -->
<![CDATA[
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
// Betimleyici girintilenmez
?>
]]>
</programlisting>
</example>
<example>
<title>- PHP 7.3.0 öncesi için bile geçerli örnek</title>
<programlisting role="php">
<!-- This is a VALID example -->
<![CDATA[
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
]]>
</programlisting>
</example>
<para>
Değişken içeren yorumlu metinler sınıf özelliklerini ilklendirmek için
kullanılamaz.
</para>
</warning>
<para>
Yorumlu metinler tıpkı çift tırnaklı dizeler gibi davranırlar. Yorumlu
metin çift tırnaklar arasına alınmaz ve metin içindeki çift tırnak
imlerinin tersbölü ile öncelenmesi gerekmez, ancak yukarıda çift tırnaklı
dizeler için belirtilen öncelem kodları kullanılabilir. Değişkenler
yorumlanır, fakat yorumlanan metin içinde yer alan karmaşık değişkenler
ifade edilirken dizelerde dikkate alınması gerekenler yorumlu metinlerde
de dikkate alınmalıdır.
</para>
<example>
<title>- Yorumlu metin örneği</title>
<programlisting role="php">
<![CDATA[
<?php
$str = <<<EOD
Yorumlu metin sözdizimi
kullanılarak çok sayıda
satıra bölünmüş dize örneği.
EOD;
/* Değişkenlerin de kullanıldığı daha karmaşık bir örnek */
class foo
{
var $foo;
var $bar;
function __construct()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Kimimben';
echo <<<EOT
Adım "$name" ve işim $foo->foo basmak.
Şimdi {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41\n
EOT;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Adım "Kimimben" ve işim Foo basmak.
Şimdi Bar2 basıyorum.
Bu büyük 'A' basmalı: A]]>
</screen>
</example>
<para>
Ayrıca işlev bağımsız değişkeninde veri aktarırken de yorumlu metin
kullanılabilir:
</para>
<example>
<title>- Bağımsız değişkenlerde yorumlu metin kullanımı</title>
<programlisting role="php">
<![CDATA[
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
]]>
</programlisting>
</example>
<para>
Statik değişkenleri ve sınıf özelliklerini veya
sabitlerini yorumlu metin sözdizimini kullanarak ilklendirmek mümkündür:
</para>
<example>
<title>- Statik değer olarak yorumlu metin kullanımı</title>
<programlisting role="php">
<![CDATA[
<?php
// Statik değişkenler
function foo()
{
static $bar = <<<LABEL
Burada hiçbir şey yok...
LABEL;
}
// Sınıf özellikleri ve sabitleri
class foo
{
const BAR = <<<FOOBAR
Sınıf sabiti örneği
FOOBAR;
public $baz = <<<FOOBAR
Özellik örneği
FOOBAR;
}
?>
]]>
</programlisting>
</example>
<para>
Yorumlu metinlerin açılış betimleyicisi
seçimlik olarak çift tırnaklarla kapatılabilir:
</para>
<example>
<title>- Yorumlu metin bildiriminde çift tırnak kullanımı</title>
<programlisting role="php">
<![CDATA[
<?php
echo <<<"TIRNAKLI"
Merhaba Dünya!
TIRNAKLI;
?>
]]>
</programlisting>
</example>
</sect3>
<sect3 xml:id="language.types.string.syntax.nowdoc">
<title>Yorumsuz metinler</title>
<para>
Yorumlu metinlerin çift tırnaklı dizelere karşılık gelmesi gibi yorumsuz
metinler de tek tırnaklı dizelere karşılık gelir. Yorumsuz metinler de
yorumlular gibi belirtilir ama, <emphasis>yorumsuz metin içinde çözümleme
yapılmaz</emphasis>. Yorumsuz metinler, PHP kodlarını veya büyük metin
bloklarını herhangi bir önlem almaksızın içine yerleştirmek için
elverişlidirler. Belirtilen metin bloğunun çözümlenmemesinden dolayı
SGML'nin <literal>&lt;![CDATA[ ]]&gt;</literal> oluşumu ile benzer
özelliklere sahiptir.
</para>
<para>
Yorumsuz metin de yorumlu metindeki <literal>&lt;&lt;&lt;</literal>
dizesini kullanır fakat betimleyicisi tek tırnak içine alınır; yani,
şuna benzer: <literal>&lt;&lt;&lt;'EOT'</literal>. Yorumlu metin için
geçerli tüm diğer kurallar yorumsuz metin için de geçerlidir; özellikle
de kapanış betimleyici ile ilgili olanlar.
</para>
<example>
<title>- Yorumsuz metin örneği</title>
<programlisting role="php">
<![CDATA[
<?php
$str = <<<'EOD'
Yorumlu metin sözdizimi kullanılarak çok sayıda satıra bölünmüş
dize örneği. Tersbölüler daima birebir ele alınır,
örn, \\ and \'
EOD;
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Yorumlu metin sözdizimi kullanılarak çok sayıda satıra bölünmüş
dize örneği. Tersbölüler daima birebir ele alınır,
örn, \\ and \'
]]>
</screen>
</example>
<example>
<title>- Değişkenli yorumsuz metin örneği</title>
<programlisting role="php">
<![CDATA[
<?php
class foo
{
public $foo;
public $bar;
function __construct()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Kimimben';
echo <<<'EOT'
İsmim "$name" ve işim $foo->foo basmak.
Artık {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41
EOT;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
İsmim "$name" ve işim $foo->foo basmak.
Artık {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41]]>
</screen>
</example>
<example>
<title>- Statik veri örneği</title>
<programlisting role="php">
<![CDATA[
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
]]>
</programlisting>
</example>
</sect3>
<sect3 xml:id="language.types.string.parsing">
<title>Değişken çözümleme</title>
<simpara>
Bir dize çift tırnaklar arasında veya bir yorumlu metin olarak
belirtilmişse içindeki <link linkend="language.variables"
>değişkenler</link> çözümlenir.
</simpara>
<simpara>
İki sözdizimi türü vardır: Biri <link
linkend="language.types.string.parsing.simple">basit</link>, diğeri <link
linkend="language.types.string.parsing.complex">karmaşık</link>. Basit
sözdizimi en çok kullanılanı ve elverişli olanıdır; bir değişken, bir
dizi değeri veya bir nesne özelliğini bir dize içinde en az çabayla
kullanmayı sağlar.
</simpara>
<simpara>
Karmaşık sözdizimi ifadeyi sarmalayan kaşlı ayraçlar biçiminde kendini
gösterir.
</simpara>
<sect4 xml:id="language.types.string.parsing.simple">
<title>Basit Sözdizimi</title>
<simpara>
Çözümleyici, bir dolar imine (<literal>$</literal>) rastlandığında,
geçerli bir değişken ismi oluşturmak için alabildiği bütün dizecikleri
açgözlülükle toplar. Değişken isminin kaşlı ayraçlar arasına alınması
ismin sonunun açıkça belirtilmesini sağlar.
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$juice = "apple";
echo "He drank some $juice juice.".PHP_EOL;
// "s" değişken ismi olarak geçerli karakterdir fakat, $juice değişkendir.
echo "He drank some juice made of $juices.";
// Kaşlı ayraçların içine alınarak değişken isminin bitimi açıkça belirtilmiş
echo "He drank some juice made of ${juice}s.";
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
He drank some apple juice.
He drank some juice made of .
He drank some juice made of apples.
]]>
</screen>
</informalexample>
<simpara>
Bir dizi indisi veya bir nesne özelliği de benzer şekilde
çözümlenebilir. Dizi indislerinde indis sonunu, kapayan köşeli ayraç
(<literal>]</literal>) belirler. Aynı kural, basit değişkenler olarak
nesne özelliklerine de uygulanır.
</simpara>
<example><title>- Basit sözdizimi örneği</title>
<programlisting role="php">
<![CDATA[
<?php
$juices = array("apple", "orange", "koolaid1" => "purple");
echo "He drank some $juices[0] juice.".PHP_EOL;
echo "He drank some $juices[1] juice.".PHP_EOL;
echo "He drank some $juices[koolaid1] juice.".PHP_EOL;
class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";
public $smith = "Smith";
}
$people = new people();
echo "$people->john drank some $juices[0] juice.".PHP_EOL;
echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert greeted the two $people->smiths."; // Won't work
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
He drank some apple juice.
He drank some orange juice.
He drank some purple juice.
John Smith drank some apple juice.
John Smith then said hello to Jane Smith.
John Smith's wife greeted Robert Paulsen.
Robert Paulsen greeted the two .
]]>
</screen>
</example>
<simpara>
PHP 7.1.0 ve sonrasında <emphasis>negatif</emphasis> sayısal indisler
desteklenir.
</simpara>
<example><title>- Negatif sayısal indisler</title>
<programlisting role="php">
<![CDATA[
<?php
$string = 'string';
echo "The character at index -2 is $string[-2].", PHP_EOL;
$string[-3] = 'o';
echo "Changing the character at index -3 to o gives $string.", PHP_EOL;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
The character at index -2 is n.
Changing the character at index -3 to o gives strong.
]]>
</screen>
</example>
<simpara>
Bunlardan daha karmaşık herşey için karmaşık sözdizimini kullanmalısınız.
</simpara>
</sect4>
<sect4 xml:id="language.types.string.parsing.complex">
<title>Karmaşık (kaşlı ayraçlı) sözdizimi</title>
<simpara>
Buna karmaşık denmesinin sebebi sözdiziminin karmaşıklığı değil,
karmaşık ifadelerin kullanımını mümkün kılmasıdır.
</simpara>
<simpara>
Herhangi bir sayıl değer, dizi elemanı veya nesne özelliği bir dize
içinde bu sözdizimi ile yer alabilir. İfade dize dışındaki gösterimiyle
yazılıp <literal>{</literal> ve <literal>}</literal> arasına alınır.
<literal>{</literal> öncelenemeyeceğinden bu sözdizimi sadece
<literal>$</literal> iminin <literal>{</literal> iminin hemen ardında
yer aldığı durumlarda tanınır. <literal>{\$</literal> kullanımı
<literal>{$</literal> imlerinin kendilerinin alınmasıyla sonuçlanır.
Bazı örnekler:
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Tüm hataları görelim
error_reporting(E_ALL);
$şahane = 'harika';
// Çalışmaz, çıktısı: Bu çok { harika}
echo "Bu çok { $şahane}";
// Çalışır, çıktısı: Bu çok harika
echo "Bu çok {$şahane}";
// Çalışır
echo "Bu karenin bir kenarı {$square->width}00 santimetre uzunluktadır.";
// Çalışır, tırnaklı anahtarlar sadece kaşlı ayraç sözdizimi kullanılarak çalışır
echo "Bu çalışır: {$arr['key']}";
// Çalışır
echo "Bu çalışır: {$arr[4][3]}";
// $foo[bar] bir dize dışında neden yanlışsa bu da o yüzden yanlıştır.
// PHP önce foo adında bir sabit arar, bulamazsa hata oluşur.
// Sabit bulunursa, değeri (foo'nun kendisi değil) dizi indisinde kullanılır.
echo "Bu yanlış: {$arr[foo][3]}";
// Çalışır. Çok boyutlu dizileri dizelerin içinde kullanılırken,
// dizileri daima kaşlı ayraçlar arasına alın.
echo "Bu çalışır: {$arr['foo'][3]}";
// Çalışır.
echo "Bu çalışır: " . $arr['foo'][3];
echo "Bu da çalışır: {$obj->values[3]->name}";
echo "$name adlı değişkenin değeri: {${$name}}";
echo "Adı getName() işlevinin dönüş değeri olan değişkenin değeri: {${getName()}}";
echo "Adı \$object->getName() yönteminin dönüş değeri olan değişkenin değeri: {${$object->getName()}}";
// Çalışmaz, çıktısı: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
// Çalışmaz, çıktısı: C:\folder\{harika}.txt
echo "C:\folder\{$şahane}.txt"
// Çalışır, çıktısı: C:\folder\harika.txt
echo "C:\\folder\\{$şahane}.txt"
?>
]]>
</programlisting>
</informalexample>
<para>
Bu sözdizimini kullanan dizeler içindeki değişkenler üzerinden de sınıf
özelliklerine erişmek mümkündür.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->{$baz[1]}}\n";
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
I am bar.
I am bar.
]]>
</screen>
</informalexample>
<note>
<para>
<literal>{$}</literal> içindeki işlev ve yöntem çağrılarından,
statik sınıf değişkenlerinden ve sınıf sabitlerinden erişilen değer,
dizenin tanımlandığı etki alanındaki bir değişkenin ismi olarak
yorumlanır. Kaşlı ayraçların tek başına kullanımı
(<literal>{}</literal>), statik sınıf değişkenlerinin veya sınıf
sabitlerinin değerlerine veya işlev ve yöntemlerin dönüş değerlerine
erişim için kullanılmaz.
</para>
</note>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Tüm hatalar gösterilsin.
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// Bu çalışır; çıktısı: I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";
// Bu da çalışır; çıktısı: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
]]>
</programlisting>
</informalexample>
</sect4>
</sect3>
<sect3 xml:id="language.types.string.substr">
<title>Dizge erişimi ve karaktere göre değişiklik</title>
<para>
Dizgelerin içindeki karakterlere, dizilerin köşeli ayraçları arasında
karakterin dizinin başlangıcından itibaren (ilk karakterin indisi sıfır
olmak üzere) kaçıncı karakter olduğu belirtilerek ($dize[42] gibi)
erişilebilir veya o karakterde değişiklik yapılabilir. Dizgeler bu
nedenle bir karakter dizisi olarak düşünülür. 1 karakterden fazlasını elde
etmek veya yer değiştirmek isterseniz <function>substr</function> ve
<function>substr_replace</function> işlevlerini kullanabilirsiniz.
</para>
<note>
<simpara>
PHP 7.1.0 ve sonrasında, negatif dize başlangıçları da desteklenmektedir.
Öncesinde, bunların okunması boş bir dizeyle ve <constant>E_NOTICE</constant>
çıktılanmasıyla, yazılması ise dizenin olduğu gibi bırakılması ve
<constant>E_WARNING</constant> çıktılanması ile sonuçlanırdı.
</simpara>
</note>
<note>
<simpara>
PHP 8.0.0 öncesinde, dizge karakterlerine ayrıca
<varname>$str{42}</varname> biçeminde kaşlı ayraçlar kullanılarak da
erişilebiliyordu. Bu tür kaşlı ayraç kullanımı PHP 7.4.0 itibariyle
önerilmemekte olup PHP 8.0.0 ve sonrasında desteklenmemektedir.
</simpara>
</note>
<warning>
<simpara>
Karakter indisi olarak dizenin uzunluğundan büyük bir değer belirtmek,
dizenin sonuna boşlukların eklenmesine sebep olur. Tamsayı olmayan
indis değerleri tamsayıya dönüştürülür. Kuraldışı indis belirtimi
<constant>E_WARNING</constant>'e sebep olur.
Atanmış bir dizenin sadece ilk karakteri kullanılır.
PHP 7.1.0 ve sonrasında, boş dize ataması ölümcül hata ile sonuçlanır.
Evvelce, bir NULL bayt atanırdı.
</simpara>
</warning>
<warning>
<simpara>
Dahili olarak, PHP dizeleri bayt dizileridir. Sonuç olarak, dizi ayraçları
kullanarak bir dizeye erişmek ve değişklik yapmak, çok baytlı gösterimde
güvenli değildir. Bu işlem dizelere sadece ASCII gibi tek baytlık
kodlamalarda yapılmalıdır.
</simpara>
</warning>
<note>
<simpara>
PHP 7.1.0 ve sonrasında, boş dize üzerinde boş indis işleci kullanımı
ölümcül hataya yol açar. Evvelce, boş dize sessizce bir diziye
dönüştürülürdü.
</simpara>
</note>
<example>
<title>- Bazı dize örnekleri</title>
<programlisting role="php">
<![CDATA[
<?php
// Dizgenin ilk karakterini alalım
$str = 'This is a test.';
$first = $str[0];
// Dizgenin üçüncü karakterini alalım
$third = $str[2];
// Dizgenin son karakterini alalım
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// Dizgenin son karakterini değiştirelim
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
]]>
</programlisting>
</example>
<para>
Dizi başlangıçları ya tamsayı ya da tamsayı benzeri dize olmalıdır,
aksi takdirde bir uyarı yavrulanır.
</para>
<example>
<title>- Geçersiz dize başlangıçları örneği</title>
<programlisting role="php">
<![CDATA[
<?php
$str = 'abc';
var_dump($str['1']);
var_dump(isset($str['1']));
var_dump($str['1.0']);
var_dump(isset($str['1.0']));
var_dump($str['x']);
var_dump(isset($str['x']));
var_dump($str['1x']);
var_dump(isset($str['1x']));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(1) "b"
bool(true)
Warning: Illegal string offset '1.0' in /tmp/t.php on line 7
string(1) "b"
bool(false)
Warning: Illegal string offset 'x' in /tmp/t.php on line 9
string(1) "a"
bool(false)
string(1) "b"
bool(false)
]]>
</screen>
</example>
<note>
<para>
Dize değişmezleri içindeki karakterlere <literal>[]</literal> veya
<literal>{}</literal> kullanılarak erişilebilir.
</para>
</note>
<note>
<para>
<literal>{}</literal> sözdizimini kullanarak dize değişmezleri içindeki
karakterlere erişim PHP 7.4'te kullanımdan kaldırılmıştır. PHP 8.0'da
ise tamemen kaldırılmıştır.
</para>
</note>
</sect3>
</sect2><!-- end syntax -->
<sect2 xml:id="language.types.string.useful-funcs">
<title>Kullanışlı işlevler ve işleçler</title>
<para>
Dizgeler '.' (nokta) işleci kullanılarak ardarda eklenebilir. '+'
(toplama) işlecinin bu amaçla kullanımının yararsız oluşuna dikkat ediniz.
Daha ayrıntılı bilgi edinmek için <link
linkend="language.operators.string">Dizge İşleçleri</link> belgesine
bakınız.
</para>
<para>
Dizgelerde değişiklik yapmak için çok sayıda yararlı işlev mevcuttur.
</para>
<simpara>
Genel işlevler için <link linkend="ref.strings">Dize İşlevleri</link>ne,
ileri düzey bul ve değiştir işlevselliği için <link
linkend="ref.pcre">Perl uyumlu düzenli ifade işlevleri</link>ne bakınız.
</simpara>
<simpara>
Ayrıca, <link linkend="ref.url">URL dizeleri için işlevler</link> ve
dizeleri şifrelemek veya şifrelerini çözmek için
<link linkend="ref.sodium">Sodium</link> ve
<link linkend="ref.hash">Hash</link> işlevleri vardır.
</simpara>
<simpara>
Son olarak, <link linkend="ref.ctype">karakter türü işlevleri</link>ne de
bakabilirsiniz.
</simpara>
</sect2>
<sect2 xml:id="language.types.string.casting">
<title>Dizgeye dönüşüm</title>
<para>
Bir değer bir dizeye <literal>(string)</literal> tür çarpıtması veya
<function>strval</function> işleviyle dönüştürülür. Bir dizenin gerekli
olduğu ifade bağlamlarında dizeye dönüşüm otomatik olarak gerçekleşir.
Bu genellikle, <function>echo</function> veya <function>print</function>
işlevleri kullanılırken veya bir değişken bir dize ile karşılaştırılırken
gerçekleşir. Aşağıdakilere, <link linkend="language.types">Türler</link>
ve <link linkend="language.types.type-juggling">Tür Dönüşümü</link>
bölümlerinde daha ayrıntılı değinilmiştir. Ayrıca,
<function>settype</function> işlevine de bakabilirsiniz.
</para>
<para>
<type>bool</type> türündeki &true; değeri <type>string</type>
türündeki <literal>"1"</literal> değerine dönüştürülür.
<type>bool</type> türündeki &false; değeri <type>string</type>
türündeki <literal>""</literal> değerine (boş dizeye) dönüştürülür. Bu
şekilde, <type>bool</type> ve <type>string</type> değerler arasında
her iki yönde de dönüşüm yapılabilmektedir.
</para>
<para>
<type>integer</type> veya <type>float</type> türünde bir değerin
<type>string</type> türüne dönüşümü sayının dizesel gösterimiyle (üstel
gösterim dahil) sonuçlanır. Kayan noktalı sayılar üstel gösterim
kullanılarak dönüştürülebilir (<literal>4.1E+6</literal> gibi).
</para>
<note>
<para>
PHP 8.0.0 itibariyle, ondalık nokta karakteri daima
noktadır ("<literal>.</literal>"). PHP 8.0.0 öncesinde
betiğin çalıştığı yerele (LC_NUMERIC) özgüdür.
Bakınız: <function>setlocale</function> işlevi.
</para>
</note>
<para>
Diziler daima <literal>"Array"</literal> dizesine dönüştürülür; bundan
dolayı <function>echo</function> ve <function>print</function> bir dizinin
içeriğini kendiliklerinden gösteremezler. Tek bir dizi elemanını
görüntüleyebilmek için <literal>echo $arr['foo']</literal> gibi bir oluşum
kullanınız. İçeriğin tamamının görüntülenebilmesiyle ilgili ipuçları için
aşağıya bakınız.
</para>
<para>
<type>object</type> türleri <type>string</type> türüne dönüştürmek için
<link linkend="language.oop5.magic">__toString</link> sihirli yöntemi
kullanılmalıdır.
</para>
<para>
<type>resource</type> türler daima <literal>"Resource id #1"</literal>
benzeri bir dizeye dönüştürülürler; buradaki <literal>1</literal>,
özkaynağa PHP tarafından çalışma anında atanan eşsiz bir sayıdır.
Bu dizenin tam yapısı değişikliğe konu olduğundan güvenilmemelidir ve değişime
tabi tutulmalıdır. Çalıştırılan bir betiğin (bir sayfa isteği veya CLI işlemi)
ömrü boyunca, belirli bir özkaynak için daima benzersiz olacak ve yeniden
kullanılabilir olmayacaktır. Özkaynağın türünü
öğrenmek için <function>get_resource_type</function> işlevini kullanınız.
</para>
<para>
&null; daima boş bir dizeye dönüştürülür.
</para>
<para>
Yukarıda bahsedildiği gibi, bir diziyi, nesneyi veya özkaynağı doğrudan
dönüştürmek, bunların değerleri hakkında işe yarar hiçbir bilgi sağlamaz.
Bu tür içerikleri daha verimli şekilde incelemek isterseniz
<function>print_r</function> ve <function>var_dump</function> işlevlerine
bakınız.
</para>
<para>
Çoğu PHP değeri kalıcı olarak saklamak amacıyla dizelere
dönüştürülebilir. Bu yönteme dizeleştirme adı verilir ve
<function>serialize</function> işlevi tarafından gerçekleştirilir.
</para>
</sect2>
<sect2 xml:id="language.types.string.details">
<title>String Türü ve Ayrıntılar</title>
<para>
PHP'de <type>string</type> türü bir bayt dizisi ve tampon uzumlığunu
belirten bir tamsayı olarak gerçeklenmiştir. Bu baytların nasıl
karakterlere dönüştüğü hakkında bir bilgiye sahip değildir, bu görev
yazılımcıya bırakılmıştır. Bir dizeyi oluşturan değerlerle ilgili bir
sınırlama yoktur. Özellikle <literal>0</literal> değerli baytlara (NUL
baytlar) dizenin her yerinde izin verilir. (Bununla birlikte, bu kılavuzda
"ikil olarak güvenli" olmadığı belirtilen bir kaç işlev, dizeleri, NULL
baytından sonra verileri yok sayan kitaplıklara dağıtabilir.)
</para>
<para>
<type>string</type> türünün bu doğası, PHP'de neden ayrı bir bayt türünün
olmadığınııklar; bu rolü dizeler üstlenir. Örneğin metin veri
döndürmeyen işlevler, ham veriyi bir ağ soketinden okuyup yine de dize
döndürecektir.
</para>
<para>
PHP dizelere belli bir karakter kodlaması dayatmaz, dizelerin nasıl
baytlara dönüştüğü merak edilebilir. Örneğin, <literal>"á"</literal>
dizesi <literal>"\xE1"</literal> (ISO-8859-1),
<literal>"\xC3\xA1"</literal> (UTF-8, C form),
<literal>"\x61\xCC\x81"</literal> (UTF-8, D form) olarak mı yoksa olası
başka bir gösterime göre mi kodlanacak? Bunun yanıtı, betiğin karakter
kodlaması neyse ona göre karakterler kodlanır, olacaktır. Bu bakımdan,
betik örneğin ISO-8859-1'de yazılmışsa dize de ISO-8859-1'de kodlanacaktır.
Ancak, Zend Çokbaytlılık etkinse bu uygulanmaz; bu durumda betik keyfi bir
kodlamada (açıkça belirtilmiş veya algılanmış olabilir) yazılabilir ve
ardından belli bir dahili kodlamaya (dizeler için kullanılacak kodlama)
dönüştürülebilir. Betiğin kodlanmasında (veya dahili kodlamada, Zend
Çokbaytlılık etkin olmalıdır) bazı kısıtlamalar olduğunu unutmayın.
Bu hemen hemen her zaman, bu kodlamanın UTF-8 veya ISO-8859-1 gibi
ASCII'nin uyumlu bir üst kümesi olması gerektiği anlamına gelir. Bununla
birlikte, büyük/küçük harf durumlarında aynı bayt değerlerinin
kullanılabildiği durum bağımlı kodlamaların sorunlu olabileceğini unutmayın.
</para>
<para>
Şüphesiz, kullanışlı olmak noktasında, metinler üzerinde çalışan işlevler
dizenin nasıl kodlanacağına ilşkin bazı varsayımlarda bulunabilir.
Ne yazık ki, işlevler arasında bu konuda çok farklı varsayımlar mevcuttur:
</para>
<itemizedlist>
<listitem>
<simpara>
Bazı işlevler dizenin tek baytlı bir kodlamayla kodlanacağını varsayar,
fakat bu baytları belli karakterlere yorumlama gereği duymazlar.
<function>substr</function>, <function>strpos</function>,
<function>strlen</function> ve <function>strcmp</function> işlevleri bu
durumdadır. Bu işlevlerin bellek tamponlarında, yani baytlar ve bayt
adresleriyle çalıştıkları için böyle oldukları düşünülebilir.
</simpara>
</listitem>
<listitem>
<simpara>
Diğer bir işlev grubu, dizgenin kodlamasının aktarıldığını ya da bir
öntanımlı kodlamanın olduğunu varsayar.
<link linkend="book.mbstring">mbstring</link> eklentisindeki işlevler
ve <function>htmlentities</function> böyledir.
</simpara>
</listitem>
<listitem>
<simpara>
Bir başka işlev grubu geçerli yereli kullanır (bak
<function>setlocale</function>), fakat bayt bayt çalışır.
</simpara>
</listitem>
<listitem>
<simpara>
Son grup, dizenin belli bir kodlamayı, normal olarak UTF-8 kullandığını
varsayar. <link linkend="book.intl">intl</link> ve
<link linkend="book.pcre">PCRE</link> eklentilerindeki işlevlerin çoğu
böyledir (PCRE eklentilerindeki işlevlerde sadece <literal>u</literal>
değiştircisi kullanıldığında).
</simpara>
</listitem>
</itemizedlist>
<para>
Sonuç olarak, Unicode kullanarak doğru programların yazılması, çalışmayan
ve büyük olasılıkla verileri bozacak işlevlerden itinayla kaçınmaya ve
bunun yerine doğru davranan, genellikle <link linkend="book.intl">intl</link>
ve <link linkend="book.mbstring">mbstring</link> eklentilerindeki işlevleri
kullanmaya bağlıdır. Bununla birlikte, Unicode kodlamaları işleyebilen
işlevleri kullanmak sadece başlangıçtır. Dilin sağladığı işlevler ne olursa
olsun, asıl olan Unicode belirtimini bilmektir. Örneğin, sadece büyük ve
küçük harfler olduğunu varsayan bir yazılım yanlış kabul yapıyor demektir.
</para>
</sect2>
</sect1><!-- end string -->
<!-- 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
-->