PHP dilinde yaygın olarak kullanılan sekiz temel veri tipi bulunmaktadır:
int, float, string, bool, array, object, null ve fonksiyonların aktarımı için kullanılan callable. PHP'de değişkenlerin sabit bir tipi yoktur; değişkenin tipi, o an sahip olduğu değere göre belirlenir. var_dump($x) fonksiyonu hem değerini hem de tipini ekrana basarken, gettype($x) fonksiyonu sadece tipi string olarak döndürür.
PHP:
<?php
$values = [42, 3.14, "hello", true, [1, 2, 3], null, new stdClass()];
printf("%-8s %-10s %s\n", "gettype", "debug", "value");
foreach ($values as $value) {
printf("%-8s %-10s %s\n", gettype($value), get_debug_type($value), json_encode($value));
}
Yukarıdaki tabloda ilk sütun
gettype(), ikinci sütun ise get_debug_type() fonksiyonunun sonuçlarını göstermektedir. Kodu çalıştırdığınızda değerleri değiştirerek aradaki farkları görebilirsiniz. İki fonksiyonun isimlendirme konusunda farklılıkları vardır: gettype tarihsel sebeplerle integer, double ve boolean isimlerini kullanırken; get_debug_type modern tip bildirimlerindeki adları (int, float, bool) kullanır ve nesneler için ilgili sınıfın adını verir.PHP Veri Tiplerine Genel Bakış
| Tür | Örnek | Notlar |
|---|---|---|
int | 42, -7, 0x1A, 1_000_000 | tam sayılar, modern sistemlerde 64 bit |
float | 3.14, 1.5e3 | ondalıklı sayılar, her dilde olduğu gibi kesin değil |
string | "hi", 'hi' | karakterlerin değil, baytların dizisi |
bool | true, false | büyük/küçük harfe duyarsız (TRUE da çalışır) |
array | [1, 2], ["a" => 1] | sıralı eşleme: liste ve sözlük bir arada |
object | new User(), new stdClass() | bir sınıfın örneği |
null | null | null türünün tek değeri; ayrıca "değer atanmamış" |
callable | 'strlen', fn($x) => $x * 2 | çağırabileceğiniz her şey |
iterable | bir dizi veya bir Traversable nesnesi | foreach ifadesinin kabul ettiği şey |
resource | fopen() sonucu | PHP dışındaki bir şeye tanıtıcı |
var_dump ile Değer Analizi
var_dump fonksiyonu, elinizdeki verinin gerçek yapısını incelemek için kullanılan bir araçtır. Verinin tipini, değerini ve eğer bir string ise bayt cinsinden uzunluğunu yazdırır:
PHP:
<?php
var_dump(10);
var_dump(10.0);
var_dump("10");
var_dump(true);
var_dump(null);
var_dump(["id" => 7, "tags" => ["php", "web"]]);
var_dump("café"); // 5 bytes: é takes two bytes in UTF-8
echo komutu ilk üç örnek için sadece 10 çıktısını verir ve tip farklarını gizler. string(5) "café" örneğindeki uzunluk değeri bayt sayısını ifade eder; bu yüzden ASCII dışı karakterler içeren metinlerde strlen ve mb_strlen fonksiyonları farklı sonuçlar verir.Tam Sayılar ve Ondalıklı Sayılar
Tam sayı (integer), ondalık kısmı bulunmayan sayılardır. Okunabilirliği artırmak amacıyla sayılarda alt çizgi kullanılabilir; ayrıca onaltılık, sekizlik ve ikilik sistemlerdeki gösterimler de desteklenir. Float ise ondalık noktası veya üs içeren sayılardır. Diğer pek çok dilde olduğu gibi, ondalıklı sayılar genellikle yaklaşık değerler olarak saklanır:
PHP:
<?php
$population = 8_100_000_000; // underscores are ignored
var_dump($population);
var_dump(0xFF, 0b1010, 0o17); // hex, binary, octal
var_dump(PHP_INT_MAX);
var_dump(PHP_INT_MAX + 1); // too big: becomes a float
var_dump(7 / 2); // / returns a float when needed
var_dump(8 / 2); // and an int when the result is whole
var_dump(intdiv(7, 2)); // integer division
var_dump(0.1 + 0.2);
var_dump(0.1 + 0.2 == 0.3);
var_dump(abs((0.1 + 0.2) - 0.3) < PHP_FLOAT_EPSILON);
Float değerleri karşılaştırırken
== operatörünü kullanmaktan kaçının; bunun yerine iki değer arasındaki farkı küçük bir tolerans payı ile kontrol edin ya da değerleri önce yuvarlayın. Para birimleri ile çalışırken kuruşları tam sayı olarak saklamak daha sağlıklıdır.Boolean Değerler ve False Kabul Edilen Durumlar
Bir
bool değeri ya true ya da false olur. PHP, bir koşul bekleyen yapılarda (if, while, ! gibi) tüm değerleri otomatik olarak bool tipine dönüştürür. Aşağıdaki listedeki değerler false olarak kabul edilir: false, 0, 0.0, "", "0", [] ve null. Bunların dışındaki tüm değerler true olarak değerlendirilir. Aşağıdaki tablo, her değerin tipini, bool karşılığını ve sayısal olup olmadığını göstermektedir:$x'in Değerlerine Göre gettype, (bool) ve is_numeric Sonuçları
| $x | gettype | bool | is_numeric |
|---|---|---|---|
| 0 | 'integer' | false | true |
| 1 | 'integer' | true | true |
| -1 | 'integer' | true | true |
| 0.0 | 'double' | false | true |
| 1.5 | 'double' | true | true |
| "0" | 'string' | false | true |
| "" | 'string' | false | false |
| " " | 'string' | true | false |
| "0.0" | 'string' | true | true |
| "10" | 'string' | true | true |
| "1e1" | 'string' | true | true |
| "abc" | 'string' | true | false |
| "null" | 'string' | true | false |
| true | 'boolean' | true | false |
| false | 'boolean' | false | false |
| null | 'NULL' | false | false |
| [] | 'array' | false | false |
| [0] | 'array' | true | false |
"0.0", " " ve "null" değerleri dikkat gerektirir: Bu üç değer de "0" dışında boş olmayan stringler olduğu için true kabul edilirler ve if ($value) bloğu içerisinde çalışırlar.Diziler, Nesneler ve Null
Diziler, tam sayı veya string anahtarlar altında herhangi bir türden değeri barındırabilir. Nesneler ise bir sınıfın örneğidir; PHP'de hızlıca nesne oluşturmak için boş sınıf olan
stdClass kullanılır ve (object) işlemiyle bir dizi nesneye dönüştürülebilir. null ise herhangi bir değerin bulunmadığını ifade eder:
PHP:
<?php
$user = ["name" => "Ada", "roles" => ["admin", "editor"]];
echo gettype($user), ": ", $user["name"], "\n";
$point = new stdClass();
$point->x = 3;
$point->y = 4;
echo get_debug_type($point), ": ", $point->x, ",", $point->y, "\n";
$config = (object) ["debug" => true];
echo get_debug_type($config), ": debug is ", var_export($config->debug, true), "\n";
class Product
{
public function __construct(public string $name, public float $price) {}
}
$p = new Product("Lamp", 25.0);
echo get_debug_type($p), ": {$p->name}\n";
$nothing = null;
var_dump($nothing, is_null($nothing));
is_* Fonksiyonları ile Tip Kontrolü
Her veri tipi için
true veya false sonucunu döndüren kontrol fonksiyonları bulunur. is_numeric fonksiyonu is_int fonksiyonundan farklıdır; sayısal formatta olan stringleri de kabul eder. Bu durum, özellikle formdan gelen verileri kontrol ederken oldukça kullanışlıdır.
PHP:
<?php
$tests = [5, 5.0, "5", "5.5", " 5", "abc", true, null];
printf("%-7s %-6s %-8s %-9s %-10s\n", "value", "is_int", "is_float", "is_string", "is_numeric");
foreach ($tests as $t) {
printf(
"%-7s %-6s %-8s %-9s %-10s\n",
var_export($t, true),
is_int($t) ? "yes" : "",
is_float($t) ? "yes" : "",
is_string($t) ? "yes" : "",
is_numeric($t) ? "yes" : ""
);
}
Diğer kontrol fonksiyonları şunlardır:
is_bool, is_array, is_object, is_null, is_callable, is_iterable. Ayrıca bir değişkenin belirli bir sınıfa ait olup olmadığını denetlemek için $x instanceof ClassName ifadesi kullanılır.Tür Dönüşümleri ve Katı Tip Denetimi
PHP, bir operatör farklı bir veri tipi gerektirdiğinde türleri otomatik olarak dönüştürür. Aritmetik işlemlerde kullanılan sayısal stringler sayıya,
. operatörü ise sayıları stringe çevirir. Sayısal olmayan bir string toplama işlemine sokulmaya çalışıldığında PHP 8 bir TypeError hatası fırlatır:
PHP:
<?php
var_dump("10" + 5); // int(15)
var_dump("1.5" * 2); // float(3)
var_dump(10 . " items"); // string
var_dump("10" == "1e1"); // both numeric strings: compared as numbers
var_dump(100 == "1e2");
try {
var_dump("abc" + 1);
} catch (TypeError $e) {
echo "TypeError: ", $e->getMessage(), "\n";
}
Dosyanın başında
declare(strict_types=1); tanımlanmadığı sürece, tip bildirimli parametreler otomatik olarak dönüştürülür. Eğer bu tanımlama mevcutsa, yanlış skaler tipteki çağrılar dönüştürülmek yerine hata verir:
PHP:
<?php
declare(strict_types=1);
function addVat(float $net): float
{
return $net * 1.2;
}
echo addVat(100), "\n"; // int to float is still allowed
try {
echo addVat("100"), "\n"; // a string is not converted in strict mode
} catch (TypeError $e) {
echo "TypeError: ", $e->getMessage(), "\n";
}
Manuel olarak tip dönüşümü yapmak için cast operatörleri kullanılır:
(int) "42", (float) "3.5", (string) 10, (bool) "0".Sık Karşılaşılan Hata: == ile Farklı Tipleri Karşılaştırmak
== operatörü karşılaştırma yapmadan önce tür dönüşümü gerçekleştirdiği için, farklı tiplerdeki değerler beklenmedik şekilde "eşit" çıkabilir. Örneğin "1e1" == "10" (her ikisi de sayısal olarak 10'dur) veya null == false durumları buna örnektir. Tür dönüşümü olmadan, hem değerin hem de tipin aynı olmasını şart koşan === operatörünü kullanmak daha güvenlidir:
PHP:
<?php
$pairs = [["1e1", "10"], [null, false], [0, ""], ["abc", 0], [1.0, 1]];
foreach ($pairs as [$a, $b]) {
$show = var_export($a, true) . " vs " . var_export($b, true);
printf("%-16s == %-6s === %s\n", $show, var_export($a == $b, true), var_export($a === $b, true));
}
PHP 8 ile beraber en sorunlu durumlardan biri düzeltilmiştir:
"abc" == 0 ifadesi eskiden true dönerken, artık sayısal olmayan stringler string olarak karşılaştırıldığı için false dönmektedir.Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 1
- Görüntüleme
- 17
- Cevaplar
- 3
- Görüntüleme
- 23
- Cevaplar
- 1
- Görüntüleme
- 24
Metin2 Hile İstek
Metin2 GF Saldırı Hızı ve Hareket Hızı Bulma
- Cevaplar
- 10
- Görüntüleme
- 582
- Cevaplar
- 0
- Görüntüleme
- 27
