downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

array> <float
Last updated: Fri, 13 Nov 2009

view this page in

string

Bir dizge string türünde bir sayıl değer olup bir dizi karakterden oluşur. PHP 6 öncesi her karakter tek bayt ile ifade ediliyordu. Yani, olası karakter sayısı 256'dan ibaretti. Bu yüzden PHP Evrenkod için yerleşik desteğe sahip olamıyordu. Temel Evrenkod işlevselliği hakkında bilgi edinmek için utf8_encode() ve utf8_decode() işlevlerine bakınız.

Bilginize: Bir dizgenin çok büyük olması bir sorun teşkil etmez. PHP, string türünde bir değer için boyut sınırlaması yapmaz; tek sınırlama PHP'nin çalıştığı makinede PHP'nin kullanımına ayrılan bellek miktarıdır.

Sözdizimi

string türünde bir sayıl dört şekilde belirtilebilir:

Tek tırnaklı dizgeler

Bir dizgeyi belirtmenin en basit yolu dizgeyi tek tırnak (') imlerinin arasına almaktır.

Tek tırnaklı bir dizge içinde tek tırnağı sayıl değeriyle kullanmak isterseniz önüne bir tersbölü imi getirmelisiniz (\). Bir tersbölü imini sayıl değeriyle kullanmak isterseniz onun da önüne bir tersbölü imi getirmelisiniz (\\). Tersbölü imini bunlardan başka bir karakterin önünde kullanırsanız, tersbölü imi karakterle birlikte basılır.

Bilginize: Diğer iki sözdiziminin aksine, değişkenler ve özel karakterlerin öncelemleri tek tırnaklı dizgelerin içinde kullanıldıklarında yorumlanmazlar.

<?php
echo 'Bu basit bir dizgedir';

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';
?>

Çift tırnaklı dizgeler

Eğer bir dizge çift tırnak (") içine alınmışsa PHP, aşağıdaki özel karakter öncelemlerini yorumlayacaktır:

Tersbölü ile öncelenmiş karakterler
Öncelem Anlamı
\n satırsonu (LF veya ASCII 10 (0x0A))
\r satırbaşı (CR veya ASCII 13 (0x0D))
\t yatay sekme (HT veya ASCII 9 (0x09))
\v düşey sekme (VT veya ASCII 11 (0x0B)) (PHP 5.2.5 ve sonrası)
\f sayfa ileri (FF veya ASCII 12 (0x0C)) (PHP 5.2.5 ve sonrası)
\\ tersbölü
\$ dolar imi
\" çift tırnak
\[0-7]{1,3} Bu düzenli ifade ile eşleşen dizilim, karakterin sekizlik gösterimidir.
\x[0-9A-Fa-f]{1,2} Bu düzenli ifade ile eşleşen dizilim, karakterin onaltılık gösterimidir.

Tersbölü imini bunlardan başka bir karakterin önünde kullanırsanız, tersbölü imi karakterle birlikte basılır. PHP 5.1.1'den önce, \{$var} içindeki tersbölü imi basılmıyordu.

Çift tırnaklı dizgelerin en önemli özelliği içerdiği değişkenlerin yorumlanmasıdır. Bu konuda daha ayrıntılı bilgi edinmek için Değişken çözümleme bölümüne bakınız.

Yorumlu metinler

Bir dizgenin sınırlarını belirlemenin üçüncü yolu, yorumlu metin sözdizimidir. Bir yorumlu metin daima <<< karakterleri ile başlar ve hemen ardından bir betimleyici ve bir satırsonu karakteri gelir. Asıl dizge satırsonu karakterinden sonra yer alır. Dizgenin sonunu belirtmek üzere dizgenin sonuna, baştaki betimleyici konur.

Kapanış betimleyicisinin dizgeden sonraki satırın başında olması gerekir. 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.

Uyarı

Kapanış betimleyicisinin bulunduğu satırda betimleyicinin hemen ardına konan noktalı virgül (;) dışında hiçbir karakter bulunmaması çok önemli olup buna özellikle dikkat etmelisiniz. Yani, betimleyici özellikle girintilenmemeli; 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 Mac OS X için \n'dir. Kapanış betimleyicisinden (ve olası noktalı virgül karakterinden) sonraki karakter de böyle bir satırsonu karakteri olmalıdır.

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.

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 yorumsuz metinler kullanılabilir.

Örnek 1 - Geçersiz örnek

<?php
class foo {
    public 
$bar = <<<EOT
bar
EOT;
}
?>

Yorumlu metinler tıpkı çift tırnaklı dizgeler 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ı dizgeler 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 dizgelerde dikkate alınması gerekenler yorumlu metinlerde de dikkate alınmalıdır.

Örnek 2 - Yorumlu metin örneği

<?php
$str 
= <<<EOD
Yorumlu metin sözdizimi
kullanılarak Ã§ok sayıda
satıra bölünmüş dizge Ã¶rneÄŸi.
EOD;

/* DeÄŸiÅŸkenlerin de kullanıldığı daha karmaşık bir Ã¶rnek */
class foo
{
    var 
$foo;
    var 
$bar;

    function 
foo()
    {
        
$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;
?>

Yukarıdaki örneğin çıktısı:

Adım "Kimimben" ve işim Foo basmak.
Şimdi Bar2 basıyorum.
Bu büyük 'A' basmalı: A

Ayrıca işlev değiştirgesinde veri aktarırken de yorumlu metin kullanılabilir:

Örnek 3 - Değiştirgelerde yorumlu metin kullanımı

<?php
var_dump
(array(<<<EOD
foobar!
EOD
));
?>

PHP 5.3.0'dan itibaren, duruk değişkenleri ve sınıf özelliklerini veya sabitlerini yorumlu metin sözdizimini kullanarak ilklendirmek mümkündür:

Örnek 4 - Duruk değer olarak yorumlu metin kullanımı

<?php
// Duruk 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;
}
?>

PHP 5.3.0 ile ayrıca, yorumlu metinlerin bildiriminde çift tırnak kullanımı olasılığı da dikkate alınmıştır:

Örnek 5 - Yorumlu metin bildiriminde çift tırnak kullanımı

<?php
echo <<<"TIRNAKLI"
Merhaba Dünya!
TIRNAKLI;
?>

Bilginize: Yorumlu metin desteÄŸi PHP 4'te eklenmiÅŸtir.

Yorumsuz metinler

Yorumlu metinlerin çift tırnaklı dizgelere karşılık gelmesi gibi yorumsuz metinler de tek tırnaklı dizgelere karşılık gelir. Yorumsuz metinler de yorumlular gibi belirtilir ama, yorumsuz metin içinde çözümleme yapılmaz. 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 <![CDATA[ ]]> oluşumu ile benzer özelliklere sahiptir.

Yorumsuz metin de yorumlu metindeki <<< dizgesini kullanır fakat betimleyicisi tek tırnak içine alınır; yani, şuna benzer: <<<'EOT'. 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.

Örnek 6 - Yorumsuz metin örneği

<?php
$str 
= <<<'EOD'
Yorumlu metin sözdizimi
kullanılarak Ã§ok sayıda
satıra bölünmüş dizge Ã¶rneÄŸi.
EOD;

/* DeÄŸiÅŸkenli daha karmaşık bir Ã¶rnek. */
class foo
{
    public 
$foo;
    public 
$bar;

    function 
foo()
    {
        
$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;
?>

Yukarıdaki örneğin çıktısı:

İsmim "$name" ve işim $foo->foo basmak.
Artık {$foo->bar[1]} basıyorum.
Bu büyük 'A' basmalı: \x41

Bilginize: Yorumlu metinlerin aksine yorumsuz metinler herhangi bir duruk veri bağlamında kullanılabilirler. Sınıf özelliklerini veya sabitlerini yorumsuz metin kullanarak ilklendirme örneği:

Örnek 7 - Duruk veri örneği

<?php
class foo {
    public 
$bar = <<<'EOT'
bar
EOT;
}
?>

Bilginize: Yorumlu metin desteÄŸi PHP 5.3.0'da eklenmiÅŸtir.

Değişken çözümleme

Bir dizge çift tırnaklar arasında veya bir yorumlu metin olarak belirtilmişse içindeki değişkenler çözümlenir.

İki sözdizimi türü vardır: Biri basit, diğeri karmaşık. 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 dizge içinde en az çabayla kullanmayı sağlar.

Karmaşık sözdizimi PHP4'ten itibaren kullanılmakta olup ifadeyi sarmalayan kaşlı ayraçlar biçiminde kendini gösterir.

Basit Sözdizimi

Çözümleyici, bir dolar imine ($) rastlandığında, geçerli bir değişken ismi oluşturmak için alabildiği bütün dizgecikleri 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.

<?php
$bira 
'Bira';
echo 
"$bira'nın tadı berbattır"// Ã§alışır; "'" deÄŸiÅŸken adında geçersizdir
echo "$biralar geldi";   // Ã§alışmaz; 'lar' deÄŸiÅŸken isminde geçerlidir
                         // ama deÄŸiÅŸken "$biralar" deÄŸildir.
echo "${bira}lar geldi"// Ã§alışır
echo "{$bira}lar geldi"// Ã§alışır
?>

Bir dizi indisi veya bir nesne özelliği de benzer şekilde çözümlenebilir. Dizi indislerinde indis sonunu, kapayan köşeli ayraç (]) belirler. Aynı kural, basit değişkenler olarak nesne özelliklerine de uygulanır.

<?php
// Bu Ã¶rnekler dizge içinde dizi kullanımına Ã¶zgüdür.
// Dizilerin dizgesel anahtarları daima tırnak içine alınır,
// bu amaçla kaÅŸlı ayraçlar kullanılmaz.

// Bütün hataları görelim
error_reporting(E_ALL);

$meyve = array('çilek' => 'kırmızı''muz' => 'sarı');

// Ã‡alışır, fakat bunun dizge dışında farklı Ã§alışacağına dikkat edin
echo "Bir muz $meyve[muz] renktedir.";

// Ã‡alışır
echo "Bir muz {$meyve['muz']} renktedir.";

// Ã§alışır, fakat PHP aÅŸağıda açıklandığı gibi Ã¶nce muz adında bir sabit arar
echo "Bir muz {$meyve[muz]} renktedir.";

// Ã‡alışmaz, kaÅŸlı ayraç kullanın. Bir Ã§Ã¶zümleme hatasına yol açar.
echo "Bir muz $meyve['muz'] renktedir.";

// Ã‡alışır
echo "Bir muz " $meyve['muz'] . " renktedir.";

// Ã‡alışır
echo "Bu karenin bir kenarı $square->width metre uzunluktadır.";

// Ã‡alışmaz. Ã‡Ã¶züm için karmaşık sözdizimine bakın.
echo "Bu karenin bir kenarı $square->width00 santimetre uzunluktadır.";
?>

Bunlardan daha karmaşık herşey için karmaşık sözdizimini kullanmalısınız.

Karmaşık (kaşlı ayraçlı) sözdizimi

Buna karmaşık denmesinin sebebi sözdiziminin karmaşıklığı değil, karmaşık ifadelerin kullanımını mümkün kılmasıdır.

Aslında, isim alanındaki her değer, bir dizge içinde bu sözdizimi ile yer alabilir. İfade basitçe dizge dışındaki gösterimiyle yazılıp { ve } arasına alınır. { öncelenemeyeceğinden bu sözdizimi sadece $ iminin { iminin hemen ardında yer aldığı durumlarda tanınır. {\$ kullanımı bir sayıl {$ alınmasıyla sonuçlanır. Bazı örnekler:

<?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}";
echo 
"Bu Ã§ok ${ÅŸahane}";

// Ã‡alışır
echo "Bu karenin bir kenarı {$square->width}00 santimetre uzunluktadır.";

// Ã‡alışır
echo "Bu Ã§alışır: {$arr[4][3]}";

// $foo[bar] bir dizge dışında neden yanlışsa bu da o yüzden yanlıştır.
// Yani, bu yine de Ã§alışır fakat PHP Ã¶nce foo adında bir sabit
// arayacağından Ã§alışır; bununla birlikte E_NOTICE seviyesinde
// bir hata oluÅŸacaktır (tanımsız sabit).
echo "Bu yanlış: {$arr[foo][3]}";

// Ã‡alışır. Ã‡ok boyutlu dizileri dizgelerin 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()}}";
?>

Bu sözdizimini kullanan dizgeler içindeki değişkenler üzerinden de sınıf özelliklerine erişmek mümkündür.

<?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";
?>

Yukarıdaki örneğin çıktısı:


I am bar.
I am bar.

Bilginize: İşlev ve yöntem çağrılarının, duruk sınıf değişkenlerinin ve sınıf sabitlerinin {$} içinde çağrılması PHP 5'ten beri çalışmaktadır. Erişilen değer, dizgenin tanımlandığı etki alanındaki bir değişkenin ismi olarak yorumlanır. Kaşlı ayraçların tek başına kullanımı ({}), duruk 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.

<?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";
?>

Dizge erişimi ve karaktere göre değişiklik

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 ($dizge[42] gibi) erişilebilir veya o karakterde değişiklik yapılabilir. Dizgeler bu nedenle bir karakter dizisi olarak düşünülür.

Bilginize: Dizge karakterlerine ayrıca $str{42} biçeminde kaşlı ayraçlar kullanılarak da erişilebilirse de bu sözdiziminin kullanımı PHP 5.3.0 itibariyle önerilmemektedir. Bu amaçla kaşlı ayraçları değil, daima köşeli ayraçları tercih edin; örnek: $str[42].

Uyarı

Karakter indisi olarak dizgenin uzunluğundan büyük bir değer belirtmek, dizgenin sonuna boşlukların eklenmesine sebep olur. Tamsayı olmayan indis değerleri tamsayıya dönüştürülür. Kuraldışı indis belirtimi E_NOTICE'e sebep olur. Yazma sırasında negatif indisler bir E_NOTICE çıktılanmasına sebep olurken okuma işlemi boş dizge okunmasıyla sonuçlanır. Atanmış bir dizgenin sadece ilk karakteri kullanılır. Boş dizge atamak NULL atamasıyla sonuçlanır.

Örnek 8 - Bazı dizge örnekleri

<?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';

?>

Bilginize: Diğer türlerdeki değişkenlere [] veya {} kullanarak erişme çabası NULL dönmesiyle sonuçlanır.

Kullanışlı işlevler ve işleçler

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 Dizge İşleçleri belgesine bakınız.

Dizgelerde değişiklik yapmak için çok sayıda yararlı işlev mevcuttur.

Genel işlevler için Dizge İşlevlerine, ileri düzey bul ve değiştir işlevselliği için düzenli ifade işlevlerine veya Perl uyumlu düzenli ifade işlevlerine bakınız.

Ayrıca, URL dizgeleri için işlevler ve dizgeleri şifrelemek veya şifrelerini çözmek için mcrypt ve mhash işlevleri vardır.

Son olarak, karakter türü işlevlerine de bakabilirsiniz.

Dizgeye dönüşüm

Bir değer bir dizgeye (string) tür çarpıtması veya strval() işleviyle dönüştürülür. Bir dizgenin gerekli olduğu ifade bağlamlarında dizgeye dönüşüm özdevinimli olarak gerçekleşir. Bu genellikle, echo() veya print() işlevleri kullanılırken veya bir değişken bir dizge ile karşılaştırılırken gerçekleşir. Aşağıdakilere, Türler ve Tür Dönüşümü bölümlerinde daha ayrıntılı değinilmiştir. Ayrıca, settype() işlevine de bakabilirsiniz.

boolean türündeki TRUE değeri string türündeki "1" değerine dönüştürülür. boolean türündeki FALSE değeri string türündeki "" değerine (boş dizgeye) dönüştürülür. Bu şekilde, boolean ve string değerler arasında her iki yönde de dönüşüm yapılabilmektedir.

integer veya float türünde bir değerin string türüne dönüşümü sayının dizgesel gösterimiyle (üstel gösterim dahil) sonuçlanır. Kayan noktalı sayılar üstel gösterim kullanılarak dönüştürülebilir (4.1E+6 gibi).

Bilginize: Ondalık nokta karakteri betiğin çalıştığı yerele (LC_NUMERIC) özgüdür. Bakınız: setlocale() işlevi.

Diziler daima "Array" dizgesine dönüştürülür; bundan dolayı echo() ve print() bir dizinin içeriğini kendiliklerinden gösteremezler. Tek bir dizi elemanını görüntüleyebilmek için echo $arr['foo'] 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.

object türler PHP 4'te daima "Object" dizgesine dönüştürülür. Nesne özelliklerinin değerlerini hata ayıklama amacıyla basmak için aşağıdaki paragrafı okuyunuz. Nesne sınıfının ismini öğrenmek için get_class() işlevini kullanınız. PHP 5 itibariyle, uygulanabildiği takdirde, __toString yöntemi kullanılır.

resource türler daima "Resource id #1" benzeri bir dizgeye dönüştürülürler; buradaki 1, özkaynağa PHP tarafından çalışma anında atanan eşsiz bir sayıdır. Bu yapıya güvenmeseniz iyi olur; ilerde değişebilir. Özkaynağın türünü öğrenmek için get_resource_type() işlevini kullanınız.

NULL daima boş bir dizgeye dönüştürülür.

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 print_r() ve var_dump() işlevlerine bakınız.

Çoğu PHP değeri kalıcı olarak saklamak amacıyla dizgelere dönüştürülebilir. Bu yönteme dizgeleştirme adı verilir ve serialize() işlevi tarafından gerçekleştirilir. Eğer PHP motoru WDDX desteğiyle derlenmişse PHP değerleri ayrıca iyi biçimli XML metin olarak da dizgeleştirilebilir.

Dizgelerin sayılara dönüşümü

Bir dizge, sayısal bir bağlamda değerlendirildiğinde sonuçlanacak değer ve türün nasıl belirleneceği aşağıda açıklanmıştır.

Dizge, '.', 'e' veya 'E' karakterlerini içermiyorsa ve sayısal değeri PHP_INT_MAX ile tanımlanan genişlikte bir tamsayı ise string tür bir integer tür olarak, aksi takdirde bir float olarak değerlendirilir.

Değerin dizgenin başında belirtileceği varsayılır. Eğer dizge geçerli bir sayısal veri ile başlıyorsa sayısal değer olarak bu kullanılır. Aksi takdirde değer 0 (sıfır) olacaktır. Geçerli sayısal veri isteğe bağlı bir işaret ile başlar, bir veya daha fazla sayıda rakam ile isteğe bağlı bir ondalık nokta içerebilir ve isteğe bağlı bir üstel gösterimle sona erer. Üs, 'e' veya 'E' harfini takibeden bir veya daha fazla rakamdan oluşur.

<?php
$foo 
"10.5";                // $foo float'tır (11.5)
$foo "-1.3e3";              // $foo float'tır (-1299)
$foo "bob-1.3e3";           // $foo integer'dir (1)
$foo "bob3";                // $foo integer'dir (1)
$foo "10 Small Pigs";       // $foo integer'dir (11)
$foo "10.2 Little Piggies"// $foo float'tır (14.2)
$foo "10.0 pigs " 1;          // $foo float'tır (11)
$foo "10.0 pigs " 1.0;        // $foo float'tır (11)
?>

Bu dönüşüm nakkında daha ayrıntılı bilgi edinmek için strtod(3) Unix kılavuz sayfasına bakınız.

Bu bölümdeki örneklerden birini denemek isterseniz örnekleri kopyala/yapıştır yöntemiyle aşağıdaki satıra yerleştirip neler olup bittiğini görebilirsiniz:

<?php
echo "\$foo==$foo; " gettype ($foo) . " türündedir<br />\n";
?>

Tamsayıya dönüştürerek C'deki gibi bir karakterin kodunu alabilmeyi beklemeyin. Karakter/ASCII kod dönüşümleri için ord() ve chr() işlevlerini kullanınız.



array> <float
Last updated: Fri, 13 Nov 2009
 
add a note add a note User Contributed Notes
string
shd at earthling dot net
20-Oct-2009 09:54
If you want a parsed variable surrounded by curly braces, just double the curly braces:

<?php
  $foo
= "bar";
  echo
"{{$foo}}";
?>

will just show {bar}. The { is special only if followed by the $ sign and matches one }. In this case, that applies only to the inner braces. The outer ones are not escaped and pass through directly.
deminy at deminy dot net
17-Sep-2009 04:08
Although current documentation says 'A string literal can be specified in four different ways: ...', actually there is a fifth way to specify a (binary) string:

<?php $binary = b'This is a binary string'; ?>

The above statement declares a binary string using the 'b' prefix, which is available since PHP 5.2.1. However, it will only have effect as of PHP 6.0.0, as noted on http://www.php.net/manual/en/function.is-binary.php .
Liesbeth
03-Sep-2009 08:54
If you need to emulate a nowdoc in PHP < 5.3, try using HTML mode and output capturing. This way '$' or '\n' in your string won't be a problem anymore (but unfortunately, '<?' will be).

<?php

// Start of script

ob_start(); ?>
  A text with 'quotes'
    and $$$dollars$$$.
<?php $input = ob_get_contents(); ob_end_clean();

// Do what you want with $input
echo "<pre>" . $input . "</pre>";

?>
headden at karelia dot ru
20-Jun-2009 07:43
Here is an easy hack to allow double-quoted strings and heredocs to contain arbitrary expressions in curly braces syntax, including constants and other function calls:

<?php

// Hack declaration
function _expr($v) { return $v; }
$_expr = '_expr';

// Our playground
define('qwe', 'asd');
define('zxc', 5);

$a=3;
$b=4;

function
c($a, $b) { return $a+$b; }

// Usage
echo "pre {$_expr(1+2)} post\n"; // outputs 'pre 3 post'
echo "pre {$_expr(qwe)} post\n"; // outputs 'pre asd post'
echo "pre {$_expr(c($a, $b)+zxc*2)} post\n"; // outputs 'pre 17 post'

// General syntax is {$_expr(...)}
?>
Jarobman
21-Mar-2009 09:20
One thing I have noticed (using PHP 5.2.4) is that alphanumeric text starting with letters or underscore without spaces and operators in PHP code without single or double quotes is interpreted as a string.  I noticed this when trying to access a member variable from an object and getting an integer returned on what I thought should have been a syntax error.  The text cannot correspond to most PHP keywords since that would generate a fatal error.

<?php
class MyObject
{
    private
$__internal_array = array();
   
//insert code for overloading __get(), __set(), etc. to
    //access items from $__internal_array
}

$object = new MyObject();

//thought this would give a syntax error, put param returned an int somehow
some_function($object-membervar);

//correct
echo hiImAString;

//correct
echo hello.world._6789;

//correct
thisisastandalonestring;

//correct, outputs 0
echo string+anotherstring-yetanotherstring;

//correct, outputs 1concatenated
echo true.false.concatenated;

//incorrect, syntax error
echo cantdothis.1234567890;

//incorrect, syntax error, use of PHP keywords
echo try.and.do.this.if.you.can.else.break;
?>

Any other combination of the above with operators and other special characters will generate fatal errors.  I think it would be the opinion of many people that this form of a string is not at all practical and should never be used at all.  Personally, I think this looks like a bug, but I could be wrong.  However, this is something else one could watch out for when debugging since this is hard to pick up in code especially when expecting integer or boolean values.

Cheers,
Jarobman
cvolny at gmail dot com
03-Dec-2008 07:43
I commented on a php bug feature request for a string expansion function and figured I should post somewhere it might be useful:

using regex, pretty straightforward:
<?php
function stringExpand($subject, array $vars) {
   
// loop over $vars map
   
foreach ($vars as $name => $value) {
       
// use preg_replace to match ${`$name`} or $`$name`
       
$subject = preg_replace(sprintf('/\$\{?%s\}?/', $name), $value,
$subject);
    }
   
// return variable expanded string
   
return $subject;
}
?>

using eval() and not limiting access to only certain variables (entire current symbol table including [super]globals):

<?php
function stringExpandDangerous($subject, array $vars = array(), $random = true) {
   
       
// extract $vars into current symbol table
       
extract($vars);
       
       
$delim;
       
// if requested to be random (default), generate delim, otherwise use predefined (trivially faster)
       
if ($random)
           
$delim = '___' . chr(mt_rand(65,90)) . chr(mt_rand(65,90)) . chr(mt_rand(65,90)) . chr(mt_rand(65,90)) . chr(mt_rand(65,90)) . '___';
        else
           
$delim = '__ASDFZXCV1324ZXCV__'// button mashing...
       
        // built the eval code
       
$statement = "return <<<$delim\n\n" . $subject . "\n$delim;\n";
       
       
// execute statement, saving output to $result variable
       
$result = eval($statement);
       
       
// if eval() returned FALSE, throw a custom exception
       
if ($result === false)
            throw new
EvalException($statement);
       
       
// return variable expanded string
       
return $result;
    }
?>

I hope that helps someone, but I do caution against using the eval() route even if it is tempting.  I don't know if there's ever a truely safe way to use eval() on the web, I'd rather not use it.
Obeliks
16-Nov-2008 04:21
Expectedly <?php $string[$x] ?> and <?php substr($string, $x, 1) ?> will yield the same result... normally!

However, when you turn on the  Function Overloading Feature (http://de.php.net/manual/en/mbstring.overload.php), this might not be true!

If you use this Overloading Feature with 3rd party software, you should check for usage of the String access operator, otherwise you might be in for some nasty surprises.
Salil Kothadia
15-Oct-2008 08:33
An interesting finding about Heredoc "syntax error, unexpected $end".
I got this error because I did not use the php close tag "?>" and I had no code after the heredoc code.

foo1.php code gives "syntax error, unexpected $end".
But in foo2.php and foo3.php, when you add a php close tag or when you have some more code after heredoc it works fine.

Example Code:
foo1.php
1. <?php
2. $str
= <<<EOD
3. Example of string
4. spanning multiple lines
5. using heredoc syntax.
6. EOD;
7.

foo2.php
1. <?php
2. $str = <<<EOD
3. Example of string
4. spanning multiple lines
5. using heredoc syntax.
6. EOD;
7.
8. echo $str;
9.

foo3.php
1. <?php
2. $str = <<<EOD
3. Example of string
4. spanning multiple lines
5. using heredoc syntax.
6. EOD;
7. ?>
steve at mrclay dot org
30-Sep-2008 08:33
Simple function to create human-readably escaped double-quoted strings for use in source code or when debugging strings with newlines/tabs/etc.

<?php
function doubleQuote($str) {
   
$ret = '"';
    for (
$i = 0, $l = strlen($str); $i < $l; ++$i) {
       
$o = ord($str[$i]);
        if (
$o < 31 || $o > 126) {
            switch (
$o) {
                case
9: $ret .= '\t'; break;
                case
10: $ret .= '\n'; break;
                case
11: $ret .= '\v'; break;
                case
12: $ret .= '\f'; break;
                case
13: $ret .= '\r'; break;
                default:
$ret .= '\x' . str_pad(dechex($o), 2, '0', STR_PAD_LEFT);
            }
        } else {
            switch (
$o) {
                case
36: $ret .= '\$'; break;
                case
34: $ret .= '\"'; break;
                case
92: $ret .= '\\\\'; break;
                default:
$ret .= $str[$i];
            }
        }
    }
    return
$ret . '"';
}
?>
chAlx at findme dot if dot u dot need
11-Sep-2008 03:42
To save Your mind don't read previous comments about dates  ;)

When both strings can be converted to the numerics (in ("$a" > "$b") test) then resulted numerics are used, else FULL strings are compared char-by-char:

<?php
var_dump
('1.22' > '01.23'); // bool(false)
var_dump('1.22.00' > '01.23.00'); // bool(true)
var_dump('1-22-00' > '01-23-00'); // bool(true)
var_dump((float)'1.22.00' > (float)'01.23.00'); // bool(false)
?>
harmor
01-Sep-2008 10:05
So you want to get the last character of a string using "String access and modification by character"?  Well negative indexes are not allowed so $str[-1] will return an empty string.

<?php
//Tested using: PHP 5.2.5

$str = 'This is a test.';

$last = $str[-1];                  //string(0) ""
$realLast = $str[strlen($str)-1];  //string(1) "."
$substr = substr($str,-1);         //string(1) "."

echo '<pre>';
var_dump($last);
var_dump($realLast);
var_dump($substr);
nullhility at gmail dot com
06-Jun-2008 07:40
It's also valuable to note the following:

<?php
${date("M")} = "Worked";
echo ${
date("M")};
?>

This is perfectly legal, anything inside the braces is executed first, the return value then becomes the variable name. Echoing the same variable variable using the function that created it results in the same return and therefore the same variable name is used in the echo statement. Have fun ;).
sk89q
30-Apr-2008 07:46
<?php
$F
= "F";
function
F($s) { return $s; }
$filename = '<some code>';
echo
"{$F(htmlspecialchars($filename))}";
?>
yuku
01-Apr-2008 02:21
This example of the heredoc has wrong output:
Code: This should print a capital 'A': \x41
Output should be: This should print a capital 'A': A

The example of the nowdoc has wrong code:
Code: This should not print a capital 'A': x41
That should be: This should not print a capital 'A': \x41
chris at chrisstockton dot org
24-Mar-2008 02:58
For anyone who reads Evan K, please note that:
// a string to test, and show the before and after
$before = 'Quantity:\t500\nPrice:\t$5.25 each';
$after = expand_escape($before);
var_dump($before, $after);

Is identical to (note all I added was a backslash before $):
$before = "Quantity:\t500\nPrice:\t\$5.25 each";
var_dump($before);

So its definitely better to escape a dollar instead of all the overhead of his regex and evals and such, although clever completely unnecessary.

-Chris
Evan K
28-Feb-2008 09:03
I encountered the odd situation of having a string containing unexpanded escape sequences that I wanted to expand, but also contained dollar signs that would be interpolated as variables.  "$5.25\n", for example, where I want to convert \n to a newline, but don't want attempted interpolation of $5.

Some muddling through docs and many obscenties later, I produced the following, which expands escape sequences in an existing string with NO interpolation.

<?php

// where we do all our magic
function expand_escape($string) {
    return
preg_replace_callback(
       
'/\\\([nrtvf]|[0-7]{1,3}|[0-9A-Fa-f]{1,2})?/',
       
create_function(
           
'$matches',
           
'return ($matches[0] == "\\\\") ? "" : eval( sprintf(\'return "%s";\', $matches[0]) );'
       
),
       
$string
   
);
}

// a string to test, and show the before and after
$before = 'Quantity:\t500\nPrice:\t$5.25 each';
$after = expand_escape($before);
var_dump($before, $after);

/* Outputs:
string(34) "Quantity:\t500\nPrice:\t$5.25 each"
string(31) "Quantity:    500
Price:    $5.25 each"
*/

?>
dot dot dot dot dot alexander at gmail dot com
07-Feb-2008 06:31
I think there's not that much to string comparison as claiming date recognition:

It's simply comparing ordinal values of the characters from the {0} to the {strlen-1} one.
In this case
<?php
$a
= '2007-11-06 15:17:48';
$b = '2007-11-05 15:17:48';

var_dump($a > $b);
?>
mArIo@luigi ~ $: php test.php
bool(true)
here all characters match till it reaches position 9 (the "day")
there, 6 has a bigger ord()inal value than 5

<?php
$a
= 'January 25th, 2008 00:23:38';
$b = 'Janury 24th, 2008 00:23:37'; // ($a > $b) === false
?>
Here when we reach 'r' in "Janury" we see that "a" is "less" than "r" so the example would evaluate as ($a < $b) === true

Here:
<?php
$a
= 'February 1st, 2008 00:23:38';
$b = 'January 25th, 2008 00:23:38';
?>
as expected the letter "F" comes before "J" as an ordinal character, so $a is less than $b
 Even here:
<?php
var_dump
('Z' > 'M'); //bool(true)
?>
it gets confirmed that the string comparison operators >, <, =>, =<, == just do a ordinal character comparison starting from position {0} to the first difference or the end of the string.
topnotcher at mail dot uri dot edu
28-Jan-2008 04:25
@qriz at example dot com

Numerical comparisons, such as <, > are simply _NOT_ valid on strings.  Thus, before a comparison can be made by a numerical comparison operator, the operands must be _casted_ to a numerical type (either float or int).  What I was attempting to say in my previous post is that >, < are date-aware; the tests I included were examples, and not intended to represent the full scope of my comparison.

"Works correctly since there is a comparing between strings. The comparisson is done on the last number/letter (since thats the only thing that is difference in the string) and that is in this case: the 9 and 8."

What you say here is mere assumption; a few quick tests show that this is indeed not the case.  If PHP indeed compares only the last character in the string, then the following assertion should be false:

test.php:
<?php
$a
= '2007-11-06 15:17:48';
$b = '2007-11-05 15:17:48';

var_dump($a > $b);
?>
mArIo@luigi ~ $: php test.php
bool(true)

Further, consider the following choices for $a and $b, which, as expected, demonstrate that the <, > operators can indeed understand date formats:

<?php
$a
= 'January 25th, 2008 00:23:37';
$b = 'January 24th, 2008 00:23:38'; // ($a > $b) === true, but 8
?>

If you remain unconvinced, consider what happens if I spell January incorrectly:

<?php
$a
= 'January 25th, 2008 00:23:38';
$b = 'Janury 24th, 2008 00:23:37'; // ($a > $b) === false
?>

Looks like it can understand ISO 8601 date formats? (for more information, see http://en.wikipedia.org/wiki/ISO_8601)

Further investigation yields that this doesn't even work as it should:
<?php
$a
= 'February 1st, 2008 00:23:38';
$b = 'January 25th, 2008 00:23:38';

var_dump($a > $b); //bool(false)

var_dump(strtotime($a)); //int(1201843418)
var_dump(strtotime($b)); //int(1201238618)
var_dump(strtotime($a) - strtotime($b)); //int(604800)
?>
Keeping $b constant and varying the month in $a shows that this comparison correctly interprets the date with the following months: January,March,May,June,July,September,October,November.  Interestingly enough, these are all the months having the property that ord($a[0]) >= ord($b[0]).

<?php
var_dump
('Z' > 'M'); //bool(true)
?>

Conclusion:
The <,> comparison operators definitely have functionality that is undocumented, including date awareness; however, this functionality may not always work as expected and should not be trusted for portability.
yuchunjiang at gmail dot com
23-Jan-2008 02:38
this is the sql string that use the variable and and \' and function.It generate the correct result.
 
$sql1=<<<EOT
INSERT INTO hp_visitHistory ( col1,col2,col3)
VALUES ( NOW(), '{$col2}', '{$_SERVER['REQUEST_URI']}')
EOT;
echo $sql1;
qriz at example dot com
13-Nov-2007 05:54
<?php
$a
= '2007-11-05 15:17:49';
$b = '2007-11-05 15:17:48';

$bool = $a > $b;

var_dump($bool); //bool(true)
?>

works correctly since there is a comparing between strings. The comparisson is done on the last number/letter (since thats the only thing that is difference in the string) and that is in this case: the 9 and 8.

8 > 9 = true

if you want to compare the string as pure numbers then you must type cast it to numbers or type juggle it:

<?php
$a
= '2007-11-05 15:17:49';
$b = '2007-11-05 15:17:48';

$bool1 = ($a + 0) > ($b + 0);      // 2007 > 2007
$bool2 = (int) $a > (int) $b;        // 2007 > 2007
$bool3 = intval($a) > intval($b);  // 2007 > 2007

var_dump($bool1,$bool2,$bool3); //bool(false)
?>
topnotcher at mail dot uri dot edu
06-Nov-2007 12:48
I have come across this several times, and as far as I can tell, the < and > operators have undocumented functionality when it comes to comparing strings.  Consider the following script:

<?php
$a
= '2007-11-05 15:17:49';
$b = '2007-11-05 15:17:48';

$bool = $a > $b;

var_dump($bool); //bool(true)

/**
 * The manual tells us that $a and $b should be
 * truncated at -, thus giving a floating-point value of 2007.
 * But (2007 > 2007) === false...
 */
$a = (float)$a;
$b = (float)$b;

var_dump($a); //float(2007);
var_dump($b); //float(2007);

/**
 * And the manual is right. So why does it correctly
 * compare the dates (which should be treated
 * as normal strings? Clearly some hidden functionality...
 */
rkfranklin+php at gmail dot com
26-Sep-2007 07:35
If you want to use a variable in an array index within a double quoted string you have to realize that when you put the curly braces around the array, everything inside the curly braces gets evaluated as if it were outside a string.  Here are some examples:

<?php
$i
= 0;
$myArray[Person0] = Bob;
$myArray[Person1] = George;

// prints Bob (the ++ is used to emphasize that the expression inside the {} is really being evaluated.)
echo "{$myArray['Person'.$i++]}<br>";

// these print George
echo "{$myArray['Person'.$i]}<br>";
echo
"{$myArray["Person{$i}"]}<br>";

// These don't work
echo "{$myArray['Person$i']}<br>";
echo
"{$myArray['Person'$i]}<br>";

// These both throw fatal errors
// echo "$myArray[Person$i]<br>";
//echo "$myArray[Person{$i}]<br>";
?>
michael at mahemoff dot com
07-Jul-2007 07:51
Heredocs can be used for more than just echoing or setting variables - use them whenever you want to include a string.

function header() {
  return <<<EOT
    <html>
      <head>
        <title>This is my heredoc</title>
      </head>
      <body>
EOT;

Also, note the strict syntax:
- No semicolon after initial EOT (think of the heredoc as a literal string arg - you wouldn't want a semicolon in front of it, would you?)
- BUT need semicolon after final EOT (the command is finished here)
- Final EOT is on the left margin - don't indent it!
php at craigbuchek dot com
03-Jul-2007 09:32
Function calls within double-quote variable interpolation work in PHP 5, but not quite as you'd expect. Basically the function has to be a variable function. I.e. a variable that holds the name of a function. So if you've got a function named 'x' that you want to call, you'll have to assign the function name to a variable. It's easiest to just assign it to a variable with the same name:

function x () { return 4; }
$x = 'x';
echo "x = {$x()}";

I'm not sure what the point of that is though, since it would be easier to do it this way:

function x () { return 4; }
$x = x();
echo "x = $x";
Richard Neill
01-Jun-2007 03:31
Unlike bash, we can't do
  echo "\a"       #beep!

Of course, that would be rather meaningless for PHP/web, but it's useful for PHP-CLI. The solution is simple:  echo "\x07"
og at gams dot at
26-Apr-2007 12:06
easy transparent solution for using constants in the heredoc format:
DEFINE('TEST','TEST STRING');

$const = get_defined_constants();

echo <<<END
{$const['TEST']}
END;

Result:
TEST STRING
penda ekoka
24-Apr-2007 05:14
error control operator (@) with heredoc syntax:

the error control operator is pretty handy for supressing minimal errors or omissions. For example an email form that request some basic non mandatory information to your users. Some may complete the form, other may not. Lets say you don't want to tweak PHP for error levels and you just wish to create some basic template that will be emailed to the admin with the user information submitted. You manage to collect the user input in an array called $form:

<?php
// creating your mailer
$mailer = new SomeMailerLib();
$mailer->from = ' System <mail@yourwebsite.com>';
$mailer->to = 'admin@yourwebsite.com';
$mailer->subject = 'New user request';
// you put the error control operator before the heredoc operator to suppress notices and warnings about unset indices like this
$mailer->body = @<<<FORM
Firstname = {$form['firstname']}
Lastname =
{$form['lastname']}
Email =
{$form['email']}
Telephone =
{$form['telephone']}
Address =
{$form['address']}
FORM;

?>
php at moechofe dot com
01-Apr-2007 03:44
A simple benchmark to check differents about :
- simple and double quote concatenation and
- double quote and heredoc replacement

<?php

function test_simple_quote_concat()
{
 
$b = 'string';
 
$a  = ' string'.$b.' string'.$b.' srting'.$b;
 
$a .= ' string'.$b.' string'.$b.' string'.$b;
 
$a .= ' string'.$b.' string'.$b.' string'.$b;
 
$a .= ' string'.$b.' string'.$b.' string'.$b;
 
$a .= ' string'.$b.' string'.$b.' string'.$b;
 
$a .= ' string'.$b.' string'.$b.' string'.$b;
 
$a .= ' string'.$b.' string'.$b.' string'.$b;
 
$a .= ' string'.$b.' string'.$b.' string'.$b;
}

function
test_double_quote_concat()
{
 
$b = "string";
 
$a  = " string".$b." string".$b." string".$b;
 
$a .= " string".$b." string".$b." string".$b;
 
$a .= " string".$b." string".$b." string".$b;
 
$a .= " string".$b." string".$b." string".$b;
 
$a .= " string".$b." string".$b." string".$b;
 
$a .= " string".$b." string".$b." string".$b;
 
$a .= " string".$b." string".$b." string".$b;
 
$a .= " string".$b." string".$b." string".$b;
}

function
test_double_quote_replace()
{
 
$b = "string";
 
$a = " string$b string$b string$b
string$b string$b string$b
string$b string$b string$b
string$b string$b string$b
string$b string$b string$b
string$b string$b string$b
string$b string$b string$b
string$b string$b string$b"
;
}

function
test_eot_replace()
{
 
$b = <<<EOT
string
EOT;
 
$a = <<<EOT
string{$b} string{$b} string{$b}
string
{$b} string{$b} string{$b}
string
{$b} string{$b} string{$b}
string
{$b} string{$b} string{$b}
string
{$b} string{$b} string{$b}
string
{$b} string{$b} string{$b}
string
{$b} string{$b} string{$b}
string
{$b} string{$b} string{$b}
EOT;
}

$iter = 2000;

for(
$i=0; $i<$iter; $i++ )
 
test_simple_quote_concat();

for(
$i=0; $i<$iter; $i++ )
 
test_double_quote_concat();

for(
$i=0; $i<$iter; $i++ )
 
test_double_quote_replace();

for(
$i=0; $i<$iter; $i++ )
 
test_eot_replace();

?>

I've use xdebug profiler to obtain the followed results:

test_simple_quote_concat : 173ms
test_double_quote_concat : 161ms
test_double_quote_replace : 147ms
test_eot_replace : 130ms
bryant at zionprogramming dot com
27-Feb-2007 08:16
As of (at least) PHP 5.2, you can no longer convert an object to a string unless it has a __toString method. Converting an object without this method now gives the error:

PHP Catchable fatal error:  Object of class <classname> could not be converted to string in <file> on line <line>

Try this code to get the same results as before:

<?php

if (!is_object($value) || method_exists($value, '__toString')) {
   
$string = (string)$value;
} else {
   
$string = 'Object';
}

?>
fmouse at fmp dot com
21-Feb-2007 06:20
It may be obvious to some, but it's convenient to note that variables _will_ be expanded inside of single quotes if these occur inside of a double-quoted string.  This can be handy in constructing exec calls with complex data to be passed to other programs.  e.g.:

$foo = "green";
echo "the grass is $foo";
the grass is green

echo 'the grass is $foo';
the grass is $foo

echo "the grass is '$foo'";
the grass is 'green'
bishop
28-Mar-2006 08:58
You may use heredoc syntax to comment out large blocks of code, as follows:
<?php
<<<_EOC
    // end-of-line comment will be masked... so will regular PHP:
    echo ($test == 'foo' ? 'bar' : 'baz');
    /* c-style comment will be masked, as will other heredocs (not using the same marker) */
    echo <<<EOHTML
This is text you'll never see!       
EOHTML;
    function defintion($params) {
        echo 'foo';
    }
    class definition extends nothing     {
       function definition($param) {
          echo 'do nothing';
       }      
    }

    how about syntax errors?; = gone, I bet.
_EOC;
?>

Useful for debugging when C-style just won't do.  Also useful if you wish to embed Perl-like Plain Old Documentation; extraction between POD markers is left as an exercise for the reader.

Note there is a performance penalty for this method, as PHP must still parse and variable substitute the string.
webmaster at rephunter dot net
30-Nov-2005 04:57
Use caution when you need white space at the end of a heredoc. Not only is the mandatory final newline before the terminating symbol stripped, but an immediately preceding newline or space character is also stripped.

For example, in the following, the final space character (indicated by \s -- that is, the "\s" is not literally in the text, but is only used to indicate the space character) is stripped:

$string = <<<EOT
this is a string with a terminating space\s
EOT;

In the following, there will only be a single newline at the end of the string, even though two are shown in the text:

$string = <<<EOT
this is a string that must be
followed by a single newline

EOT;
DELETETHIS dot php at dfackrell dot mailshell dot com
01-Nov-2005 04:05
Just some quick observations on variable interpolation:

Because PHP looks for {? to start a complex variable expression in a double-quoted string, you can call object methods, but not class methods or unbound functions.

This works:

<?php
class a {
    function
b() {
        return
"World";
    }
}
$c = new a;
echo
"Hello {$c->b()}.\n"
?>

While this does not:

<?php
function b() {
    return
"World";
}
echo
"Hello {b()}\n";
?>

Also, it appears that you can almost without limitation perform other processing within the argument list, but not outside it.  For example:

<?
$true = true;
define("HW", "Hello World");
echo "{$true && HW}";
?>

gives: Parse error: parse error, unexpected T_BOOLEAN_AND, expecting '}' in - on line 3

There may still be some way to kludge the syntax to allow constants and unbound function calls inside a double-quoted string, but it isn't readily apparent to me at the moment, and I'm not sure I'd prefer the workaround over breaking out of the string at this point.
lelon at lelon dot net
27-Oct-2004 07:01
You can use the complex syntax to put the value of both object properties AND object methods inside a string.  For example...
<?php
class Test {
    public
$one = 1;
    public function
two() {
        return
2;
    }
}
$test = new Test();
echo
"foo {$test->one} bar {$test->two()}";
?>
Will output "foo 1 bar 2".

However, you cannot do this for all values in your namespace.  Class constants and static properties/methods will not work because the complex syntax looks for the '$'.
<?php
class Test {
    const
ONE = 1;
}
echo
"foo {Test::ONE} bar";
?>
This will output "foo {Test::one} bar".  Constants and static properties require you to break up the string.
Jonathan Lozinski
06-Aug-2004 07:03
A note on the heredoc stuff.

If you're editing with VI/VIM and possible other syntax highlighting editors, then using certain words is the way forward.  if you use <<<HTML for example, then the text will be hightlighted for HTML!!

I just found this out and used sed to alter all EOF to HTML.

JAVASCRIPT also works, and possibly others.  The only thing about <<<JAVASCRIPT is that you can't add the <script> tags..,  so use HTML instead, which will correctly highlight all JavaScript too..

You can also use EOHTML, EOSQL, and EOJAVASCRIPT.
www.feisar.de
28-Apr-2004 02:49
watch out when comparing strings that are numbers. this example:

<?php

$x1
= '111111111111111111';
$x2 = '111111111111111112';

echo (
$x1 == $x2) ? "true\n" : "false\n";

?>

will output "true", although the strings are different. With large integer-strings, it seems that PHP compares only the integer values, not the strings. Even strval() will not work here.

To be on the safe side, use:

$x1 === $x2
atnak at chejz dot com
11-Apr-2004 10:53
Here is a possible gotcha related to oddness involved with accessing strings by character past the end of the string:

$string = 'a';

var_dump($string[2]);  // string(0) ""
var_dump($string[7]);  // string(0) ""
$string[7] === '';  // TRUE

It appears that anything past the end of the string gives an empty string..  However, when E_NOTICE is on, the above examples will throw the message:

Notice:  Uninitialized string offset:  N in FILE on line LINE

This message cannot be specifically masked with @$string[7], as is possible when $string itself is unset.

isset($string[7]);  // FALSE
$string[7] === NULL;  // FALSE

Even though it seems like a not-NULL value of type string, it is still considered unset.
dandrake
19-Jan-2004 11:41
By the way, the example with the "\n" sequence will insert a new line in the html code, while the output will be decided by the HTML syntax. That's why, if you use

<?
 echo "Hello \n World";
?>

the browser will receive the HTML code on 2 lines
but his output on the page will be shown on one line only.
To diplay on 2 lines simply use:

<?
 echo "Hello <br>World";
?>

like in HTML.
philip at cornado dot com
12-Apr-2003 12:37
Note that in PHP versions 4.3.0 and 4.3.1, the following provides a bogus E_NOTICE (this is a known bug):

echo "$somearray['bar']";

This is accessing an array inside a string using a quoted key and no {braces}.  Reading the documention shows all the correct ways to do this but the above will output nothing on most systems (most have E_NOTICE off) so users may be confused.  In PHP 4.3.2, the above will again yield a parse error.
03-Mar-2003 06:04
Regarding "String access by character":

Apparently if you edit a specific character in a string, causing the string to be non-continuous, blank spaces will be added in the empty spots.

echo '<pre>';
$str = '0123';
echo "$str\n";
$str[4] = '4';
echo "$str\n";
$str[6] = '6';
echo "$str\n";

This will output:
0123
01234
01234 6
Notice the blank space where 5 should be.
vallo at cs dot helsinki dot fi
04-Nov-2002 01:41
Even if the correct way to handle variables is determined from the context, some things just doesn't work without doing some preparation.

I spent several hours figuring out why I couldn't index a character out of a string after doing some math with it just before. The reason was that PHP thought the string was an integer!

$reference = $base + $userid;
.. looping commands ..
$chartohandle = $reference{$last_char - $i};

Above doesn't work. Reason: last operation with $reference is to store a product of an addition -> integer variable. $reference .=""; (string catenation) had to be added before I got it to work:

$reference = $base + $userid;
$reference .= "";
.. looping commands ..
$chartohandle = $reference{$last_char - $i};

Et voilá! Nice stream of single characters.
guidod at gmx dot de
23-Jul-2002 06:26
PHP's double-quoted strings are inherently ill-featured - they will be a problem especially with computed code like in /e-evals with preg_replace.

bash and perl follow the widely accepted rule that all backslashes will escape the nextfollowing char, and nonalpha-chars will always get printed there as themselves whereas (the unescaped chars might have special meaning in regex). Anyway, it is a great way to just escape all nonalpha chars that you uncertain about whether they have special meaning in some places, and ye'll be sure they will get printed literal.

Furthermore, note that \{ sequence is not mentioned in the  escape-char table! You'll get to know about it only "complex (curly) syntax". This can even more be a problem with evals, as they behave rather flaky like it _cannot_ be accomodated for computed code. Try all variants of `echo "hello \{\$world}"` removing one or more of the chars in the \{\$ part - have fun!

array> <float
Last updated: Fri, 13 Nov 2009
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites