koddla

Yazılımcıları bilgi ile güçlendirir.

PHP Veri Türleri

PHP zayıf tiplemeli bir dildir. Veri türlerinin açıkça bildirilmesini gerektirmez. Değişkenin kullanıldığı bağlam veri türünü belirler; dönüştürme otomatik olarak yapılır:

$a = "2";             // string 
$a = $a + 2;          // integer (4) 
$a = $a + 0.5;        // float (4.5)
$a = 1 + "2 oranges"; // integer (3)
$a = false;           // boolean

Şİmdi bu veri türlerine ve diğerlerine kısaca değinelim.

Boolean

Boolean, doğru veya yanlış olarak gösterilen iki değere sahip bir türdür.

Bu kod $foo değerini true ve $bar değerini false olarak ayarlar:

$foo = true;
$bar = false;

true ve false büyük/küçük harfe duyarlı değildir, bu nedenle TRUE ve FALSE de kullanılabilir, hatta FaLsE bile mümkündür. Küçük harf kullanımı en yaygın olanıdır ve PSR-2 gibi çoğu kod stili kılavuzunda tavsiye edilir.

Boole’lar bunun gibi if deyimlerinde kullanılabilir:

if ($foo) { //eşdeğer yazım: if($foo == true)
    echo "true";
}

PHP’nin zayıf tiplemeli olması nedeniyle, yukarıdaki $foo değeri true veya false dışında bir değer ise, otomatik olarak boolean bir değere zorlanır.

Aşağıdaki değerler false ile sonuçlanır:

  • bir sıfır değeri: 0 (tamsayı), 0.0 ( float) veya ‘0’ (string)
  • boş bir ” dizesi veya [] dizisi
  • null (ayarlanmamış bir değişkenin içeriği veya bir değişkene atanmış)

Başka herhangi bir değer true ile sonuçlanır.

Bu esnek karşılaştırmadan kaçınmak için, değer ve türü karşılaştıran === kullanarak güçlü karşılaştırmayı zorunlu kılabilirsiniz. Ayrıntılar için aşağıda Veri Türlerinin Karşılaştırması bölümüne bakın.

Bir türü boolean’a dönüştürmek için, türden önce (bool) veya (boolean) dönüştürmesini kullanabilirsiniz.

var_dump((bool) "1"); //true

veya boolval işlevini çağırın:

var_dump( boolval("1") ); // true

Bir Boolean değerini string’e dönüştürme (false değerinin boş bir dize verdiğine dikkat edin):

var_dump( (string) true ); // string(1) "1"
var_dump( (string) false ); // string(0) ""

Bir Boolean’ı tamsayıya dönüştürme:

var_dump( (int) true ); // int(1)
var_dump( (int) false ); // int(0)

Bunun tersinin de mümkün olduğunu unutmayın:

var_dump((bool) "");        // bool(false)
var_dump((bool) 1);         // bool(true)

Ayrıca sıfır olmayan tüm değerler true döndürür:

var_dump((bool) -2);        // bool(true)
var_dump((bool) "foo");     // bool(true)
var_dump((bool) 2.3e5);     // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) "false");   // bool(true)

Integer – Tamsayı

PHP’de tamsayılar doğal olarak 2 tabanında (ikili), 8 tabanında (sekizli), 10 tabanında (ondalık) veya 16 tabanında (onaltılık) belirtilebilir.

$my_decimal = 42;
$my_binary = 0b101010;
$my_octal = 052;
$my_hexadecimal = 0x2a;

echo ($my_binary + $my_octal) / 2;
// Çıktı her zaman ondalık olarak verilir: 42

Tamsayılar platforma bağlı olarak 32 veya 64 bit uzunluğundadır. PHP_INT_SIZE sabiti tamsayı boyutunu bayt cinsinden tutar. PHP_INT_MAX ve (PHP 7.0’dan beri) PHP_INT_MIN de mevcuttur.

printf("Tamsayılar %d bit uzunluğundadır" . PHP_EOL, PHP_INT_SIZE * 8);
printf("%d'ye kadar çıkabilirler" . PHP_EOL, PHP_INT_MAX);

Tamsayı değerleri gerektiğinde float, boolean ve stringlerden otomatik olarak oluşturulur. Açık bir dönüşüm gerekiyorsa, bu (int) veya (integer) cast ile yapılabilir:

$my_numeric_string = "123";
var_dump($my_numeric_string);
// Çıktı: string(3) "123"
$my_integer = (int)$my_numeric_string;
var_dump($my_integer);
// Çıktı: int(123)

Tamsayı taşması, bir floata dönüştürülerek ele alınabilir:

$too_big_integer = PHP_INT_MAX + 7;
var_dump($too_big_integer);
// Çıktı: float(9.2233720368548E+18)

PHP’de tamsayı bölme işleci yoktur, ancak float kısmını atarak her zaman ‘yuvarlanmış’ örtük bir dönüşüm simüle edilebilir. PHP sürüm 7’den itibaren bir tamsayı bölme işlevi eklenmiştir.

$not_an_integer = 25 / 4;
var_dump($not_an_integer);
// Çıktı: float(6.25)
var_dump((int) (25 / 4)); // (see note below)
// Çıktı: int(6)
var_dump(intdiv(25 / 4)); // as of PHP7
// Çıktı: int(6)

(25 / 4) etrafındaki ekstra parantezlerin (int) dönüştürme işleminin bölme işleminden daha yüksek önceliğe sahip olması nedeniyle gerekli olduğuna dikkat edin)

Float

$float = 0.123;

Tarihsel nedenlerden dolayı, bir float durumunda gettype() tarafından sadece “float” değil, “double” döndürülür

Floatlar, düz tamsayılardan daha fazla çıktı hassasiyetine izin veren noktalı sayılardır.

PHP’nin değişken türlerini esnek bir şekilde aktarması sayesinde float ve tamsayılar birlikte kullanılabilir:

$sum = 3 + 0.14;

echo $sum; // 3.14

php, örneğin diğer diller gibi float’ı float sayı olarak göstermez:

$var = 1;
echo ((float) $var); //çıktı 1 olur. 1.0 değil

Warning 

Floating point hassasiyeti

(PHP belgelerden)

Floating point sayıları sınırlı hassasiyete sahiptir. Sisteme bağlı olmakla birlikte, PHP tipik olarak 1.11e-16 mertebesinde yuvarlama nedeniyle maksimum bağıl hata verir. Temel olmayan aritmetik işlemler daha büyük hatalar verebilir ve birkaç işlem bir araya getirildiğinde hata yayılımı dikkate alınmalıdır.

Bu nedenle, floating number sonuçlarına asla son basamağa kadar güvenmeyin ve floating point sayılarını eşitlik için doğrudan karşılaştırmayın. Daha yüksek hassasiyet gerekiyorsa, keyfi hassasiyetli matematik fonksiyonları ve gmp fonksiyonları kullanılabilir.

Strings

PHP’de bir string, dört farklı şekilde tanımlanabilir. Stringler bir dizi tek baytlık karakterlerdir (yani yerel Unicode desteği yoktur):

Tek Tırnaklı Gösterim

Her şeyi neredeyse tamamen “olduğu gibi” görüntüler. Değişkenler ve kaçış dizilerinin çoğu yorumlanmaz. Bunun istisnası, gerçek bir tek tırnak işaretini ( ‘ ) görüntülemek için bir ters eğik çizgi \ kullanılmalıdır. Ve bir ters eğik çizgi görüntülemek için de başka bir ters eğik çizgi kullanılmalıdır: \\

$my_string = 'kesme işareti\'nin kullanımı $foo\n';
var_dump($my_string);

/*
string(68) "kesme işaretinin kullanımı $foo\n"
*/

Çift Tırnaklı Gösterim

Tek tırnaklı bir dizeden farklı olarak, dizelerdeki basit değişken adları ve kaçış dizileri değerlendirilecektir. Küme parantezleri (son örnekte olduğu gibi) karmaşık değişken adlarını izole etmek için kullanılabilir.

$variable1 = "Testing!";
$variable2 = [ "Testing?", [ "Failure", "Success" ] ];
$my_string = "Değişkenler ve kaçış karakterleri çözümlenir:\n\n";
$my_string .= "$variable1\n\n$variable2[0]\n\n";
$my_string .= "Sınırları da vardır: $variable2[1][0]";
$my_string .= "Ancak tüm değişkeni parantez içine alarak bunları aşabiliriz: {$variable2[1][1]}";
var_dump($my_string);

/*
string(98) "Değişkenler ve kaçış karakterleri çözümlenir:

Testing!

Testing?

Sınırları da vardır: Array[0]"

Ancak tüm değişkeni parantez içine alarak bunları aşabiliriz: Success

*/

Heredoc 

Bir heredoc dizgesinde, değişken isimleri ve kaçış dizileri çift tırnaklı dizgelere benzer şekilde çözümlenir, ancak parantezler karmaşık değişken isimleri için kullanılamaz. Dizgenin başlangıcı <<< belirteci ile, sonu ise başka bir belirteç ile sınırlandırılır; burada başka bir belirteçten kasıt geçerli herhangi bir PHP ismidir. Son tanımlayıcı kendi başına bir satırda görünmelidir. Tanımlayıcıdan önce veya sonra boşluk bırakılmaz, ancak PHP’deki herhangi bir satır gibi bu da noktalı virgülle sonlandırılmalıdır.

$variable1 = "Metin bloklarını dahil etmek daha kolay";
$my_string = <<< EOF
Her şey çift tırnaklı bir dize ile aynı şekilde ayrıştırılır,
ancak avantajları vardır. $variable1; veritabanı sorguları ve HTML çıktısı
bu biçimlendirmeden faydalanabilir.
Tanımlayıcıdan başka bir şey içermeyen bir satıra ulaştığımızda, dize sona erer.
EOF;
var_dump($my_string);

/*
string(268) "Her şey çift tırnaklı bir dize ile aynı şekilde ayrıştırılır,
ancak avantajları vardır. Metin bloklarını dahil etmek daha kolaydır; veritabanı sorguları ve HTML çıktısı
bu biçimlendirmeden faydalanabilir.
Tanımlayıcıdan başka bir şey içermeyen bir satıra ulaştığımızda, dize sona erer."
*/

Nowdoc 

Bir nowdoc dizesi heredoc’un tek tırnaklı versiyonu gibidir, ancak en temel kaçış dizileri bile değerlendirilmez. Dizenin başındaki tanımlayıcı tek tırnak içine alınır.

$my_string = <<< 'EOF'
Heredoc'a benzer bir sözdizimi, ancak tek tırnaklı dizelere benzer,
hiçbir şey ayrıştırılmaz (kaçan kesme işaretleri \' ve ters eğik çizgiler \\ bile).
EOF;
var_dump($my_string);

/*
string(116) "Heredoc'a benzer bir sözdizimi, ancak tek tırnaklı dizelere benzer,
hiçbir şey ayrıştırılmaz (kaçan kesme işaretleri \' ve ters eğik çizgiler \\ bile)."
*/

Null

PHP “değer yok” ifadesini null anahtar sözcüğü ile temsil eder. Bu, C dilindeki null işaretçisine ve SQL’deki NULL değerine benzer.

Değişkene null atamak:

$nullvar = null; // direkt olarak

function doSomething() {} // bu işlev hiçbir şey döndürmez
$nullvar = doSomething(); //böylece null, $nullvar'a atanmış olur

Değişkenin null olarak ayarlanıp ayarlanmadığını kontrol etme:

if (is_null($nullvar)) { /* değişken null */ }

if ($nullvar === null) {  /* değişken null */ }

Null vs tanımlanmamış değişken 

Değişken tanımlanmamışsa veya ayarlanmamışsa, null’a karşı yapılan tüm testler başarılı olur, ancak aynı zamanda bir Bildirim oluştururlar: Tanımlanmamış değişken: nullvar:

$nullvar = null;
unset($nullvar);
if ($nullvar === null) {  /* doğru ama aynı zamanda bir Bildirim yazdırılır */ }
if (is_null($nullvar)) {  /* doğru ama aynı zamanda bir Bildirim yazdırılır */ }

Bu nedenle tanımlanmamış değerler isset ile kontrol edilmelidir:

if (!isset($nullvar)) {  /* değişkeni null veya tanımlanmamış */  }

Callable – Çağrılabilirler

Çağrılabilirler, geri çağrı olarak çağrılabilen her şeydir. “Geri çağırma” olarak adlandırılabilecek şeyler aşağıdaki gibidir:

  • Anonim fonksiyonlar
  • Standart PHP işlevleri (not: dil yapıları değil)
  • Statik Sınıflar
  • statik olmayan Sınıflar (alternatif bir sözdizimi kullanarak)
  • Belirli Nesne/Sınıf Yöntemleri
  • Nesnelerin kendileri, nesne bir dizinin 0. anahtarında bulunduğu sürece

Bir nesneyi dizi elemanı olarak referans gösterme örneği:

$obj = new MyClass();
call_user_func([$obj, 'myCallbackMethod']);

Callback’ler PHP 5.4’ten itibaren callable tür ipucu ile gösterilebilir.

$callable = function () {
    return 'value';
};

function call_something(callable $fn) {
    call_user_func($fn);
}

call_something($callable);

Resource – Kaynaklar

Resource, dosya, soket, akış, belge veya bağlantı gibi harici bir kaynağa başvuran özel bir değişken türüdür.

$file = fopen('/etc/passwd', 'r');

echo gettype($file);
# Çıktı: resource

echo $file;
# Çıktı: Resource id #2

Farklı (alt) kaynak türleri vardır. Kaynak türünü get_resource_type() kullanarak kontrol edebilirsiniz:

$file = fopen('/etc/passwd', 'r');
echo get_resource_type($file);
#Çıktı: stream

$sock = fsockopen('www.google.com', 80);
echo get_resource_type($sock);
#Çıktı: stream

Yerleşik kaynak türlerinin tam listesini burada bulabilirsiniz.

Tür Dönüşümleri – Type Casting

PHP genellikle kullanmak istediğiniz veri türünü kullanıldığı bağlamda doğru olarak tahmin edecektir, ancak bazen bir türü elle zorlamak yararlı olabilir. Bu, bildirimin önüne parantez içinde gerekli türün adını ekleyerek gerçekleştirilebilir:

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

$int = (int) true;
var_dump($int); // int(1)

$string = (string) true;
var_dump($string); // string(1) "1"
$string = (string) false;
var_dump($string); // string(0) ""

$float = (float) true;
var_dump($float); // float(1)

$array = ['x' => 'y'];
var_dump((object) $array); // object(stdClass)#1 (1) { ["x"]=> string(1) "y" } 

$object = new stdClass();
$object->x = 'y';
var_dump((array) $object); // array(1) { ["x"]=> string(1) "y" }

$string = "asdf";
var_dump((unset)$string); // NULL

Ancak dikkatli olun: tüm tip castları beklenildiği gibi çalışmaz:

// 32 bitlik sistemler için aşağıdaki 3 ifade geçerlidir (PHP_INT_MAX=2147483647)
// PHP_INT_MAX değerinden büyük bir tamsayı değeri otomatik olarak float'a dönüştürülür:
var_dump(       999888777666 ); // float(999888777666)
// (int)'e zorlamak taşmaya neden olur:
var_dump((int)  999888777666 ); // int(-838602302)
// ancak bir dizge içinde sadece PHP_INT_MAX döndürür
var_dump((int) "999888777666"); // int(2147483647)

var_dump((bool) []);      // bool(false) (boş array)
var_dump((bool) [false]); // bool(true)  (boş-olmayan array)

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top