PHP’de Veri Türleri Dönüşümü ve Tür Dayatma İşlemleri

PHP'de bir değişken tanımlarken değerin türünü PHP otomatik olarak kendisi belirler ve bellekte uygun şekilde depolamaya başlar. Bu kodlama yaparken büyük kolaylık sağlasa da sonrasında kontrol yapılarını da zorunlu kılıyor.

PHP'de desteklenen veri türlerini daha önce PHP'de Veri Türleri başlıklı paylaşımım da anlatmıştım. Bu sefer PHP'de verinin türünü öğrenme, veri türünü sınama, veri türü dönüşümü ve veri türü dayatma konularını anlatacağım.

Veri Türünü Öğrenme

PHP'de bir verinin türünü öğrenmek için gettype() fonksiyonu kullanılır. Bu fonksiyon parametre olarak veri türü sorgulanacak olan değişkeni alır ve veri türünü bir dize olarak döndürür.

$veri = "Muhammet ŞAFAK";
echo gettype($veri);

Çıktısı:

string

şeklindedir.

Bu fonksiyonun döndürebileceği değerler şu şekildedir;

boolean : Verinin mantıksal bir değer olduğu anlamına gelir.

integer : Verinin bir tam sayı olduğu anlamına gelir.

double : Kayar noktalı (ondalıklı) sayı anlamına gelir. Float türünde de double döner.

string : Verinin bir dize yani karakter dizisi olduğu anlamına gelir.

array : Verinin bir dizi olduğu anlamına gelir.

object : Verinin bir nesne türünde olduğu anlamına gelir.

resource : Bir özkaynak olduğu anlamına gelir.

resource (closed) : PHP 7.2.0 sürümü ile birlikte geldi. Kapalı özkaynaklar için kullanılır. PHP 7.2 öncesinde bu tür için "unknown type" dönüyordu.

NULL : Verinin Null veri türünde olduğu anlamına gelir.

unknown type : Diğer türler için bu değer dönebilir.

Veri Türünü Belirleme/Değiştirme

PHP'de bir değerini veri türünü değiştirmek için settype() fonksiyonu kullanılır. Bu fonksiyon iki parametre alır. İlk parametreden aldığı değerin türünü ikinci parametrede belirtilen türe dönüştürür.

$veri = "10";
echo gettype($veri) . "\n";

settype($veri, "integer");
echo gettype($veri);

settype() fonksiyonu işlem başarılı olursa true, başarısız olursa false döndürür. Bu fonksiyona ikinci parametre olarak aşağıdaki değerleri verebilirsiniz.

"bool"

"int"

"float"

"double"

"string"

"array"

"object"

"null"

PHP'de bir değişken değerinin veri türünü değiştirmenin bir başka yöntemi de değişken önünde değişkenin hangi veri türüne dönüştürüleceğini parantez içerisinde belirtmektir.

Örneğin;

$veri = "1";
echo gettype($veri) . "\n";

$veri = (int)$veri;
echo gettype($veri) . "\n";

$veri = (bool)$veri;
echo gettype($veri);

Çıktısı :

string
integer
boolean

Bu şekilde veri türü değiştirme işlemlerinde aşağıdaki ifadeler kullanılabilir.

(int) ya da (integer) : Tam sayı veri türüne dönüştürür.

(float) veya (double) ya da (real) : Kayar nokta (ondalıklı) sayı veri türüne dönüştürür.

(string) : Dize (karakter dizisi) veri türüne dönüştürür.

(bool) ya da (boolean) : Mantıksal veri türüne dönüştürür.

(array) : Dizi veri türüne dönüştürür.

(object) : Nesne veri türüne dönüştürür.

(unset) : NULL veri türüne dönüştürür.

Not : Bu tür dönüşüm yöntemleri ile bir dize (string), dizi (array) türüne dönüştürülebilir ancak bir dizi (array) bir dize (string) türüne dönüştürülemez.

PHP veri türü dönüşümleri ile ilgili kullanılan bir başka yöntem daha vardır. boolval(), strval(), intval(), floatval() ve doubleval() fonksiyonları değişkenin veri türüne müdahale etmeden değerinin istenilen türdeki karşılığını döndürür.

Örneğin;

$veri = 3.14;

echo $veri . "\n";
echo intval($veri) . "\n";
echo $veri . "\n";

settype($veri, "int");
echo $veri . "\n";

Çıktısı :

3.14
3
3.14
3

Yukarıdaki örnekte görebileceğiniz gibi intval() fonksiyonu veri türünü değiştirmek yerine sadece tam sayı türündeki karşılığını döndürür. Verinin aslı değiştirilmez.

intval() : Değerin tam sayı karşılığını döndürür.

floatval() : Değerin kayar nokta (ondalıklı) sayı karşılığını döndürür.

doubleval() : Değerin kayar nokta (ondalıklı) sayı karşılığını döndürür.

boolval() : Değerin mantıksal karşılığını döndürür.

strval() : Değerin dize karşılığını döndürür.

Veri Türünü Sınama

PHP'de veri türünü sınamak için ön tanımlı özel fonksiyonlar vardır. Her veri türü için farklı bir fonksiyon ile sınama işlemi yapılır.

is_array() : Veri türü bir dizi mi diye sınar.

is_bool() : Veri türü mantıksal mı diye sınar.

is_callable() : Veri türü çağırılabilir mi diye sınar.

is_double() : is_float() fonksiyonunun takma adıdır.

is_float() : Veri türü kayar noktalı (ondalıklı) sayı mı diye sınar.

is_real() : is_float() fonksiyonunun takma adıdır.

is_int() : Veri türü bir tam sayı mı diye sınar.

is_integer() : is_int() fonksiyonunun takma adıdır.

is_long() : is_int() fonksiyonunun takma adıdır.

is_string() : Veri türü bir dize mi diye sınar.

is_null() : Veri türü NULL mı diye sınar.

is_object() : Veri türü bir nesnemi diye sınar.

is_resource() : Veri türü bir özkaynak mı diye sınar.

Yukarıda listelediğim fonksiyonlar bir parametre alır ve aldığı parametrenin verinin türünü sorgulayarak geriye true ya da false döndürür.

is_array() Kullanımına Örnek

$veri = array(1,2,4,6);

if(is_array($veri)){
echo "veri değişkeni bir dizidir.";
}else{
echo "veri değişkeni bir dizi değildir.";
}

çıktısı:

veri değişkeni bir dizidir.

Çoklu Sınama İşlemi Örneği;

$veri = 3.14;

if(is_array($veri)){
echo "veri değişkeni bir dizidir.";
}elseif(is_int($veri)){
echo "veri değişkeni bir tam sayıdır.";
}elseif(is_float($veri)){
echo "veri değişkeni bir ondalıklı sayıdır";
}elseif(is_string($veri)){
echo "veri bir dizedir.";
}else{
echo "veri dizi, tamsayı, ondalıklı sayı ya da bir dize türünde olmalıdır.";
}

çıktısı :

veri değişkeni bir ondalıklı sayıdır

şeklindedir.

Veri Türü Dayatma

PHP 7 sürümüyle birlikte PHP geliştiricilerinin kullanımına sunulan bir diğer yenilik veri türü dayatmalarının kullanılabilmesiydi. Bu diğer bir çok programlama dilinde zaten kullanılması zorunlu olan bir kullanımdı. PHP ise verilerin türlerini algılama işini kendisi yaptığı için bu kodlama yapısını kullanmayı reddediyordu. Ancak PHP 7 ile birlikte bu programcının tercihine bırakıldı.

En kısa şekilde özetleyecek olursam bir değişken ya da parametrenin alabileceği veri türünü önceden tanımlama üzerine kurulu bir yapı diyebilirim. Böylece gelecek verinin türünü her defasında kontrol etme ihtiyacı ortadan kalkmış oluyor.

Ayrıca sonrasında kodunuzu inceleyen bir yazılımcı bir fonksiyona hangi veri türünde verilerin gönderilmesi gerektiğini rahatça anlayabiliyor. Bu da okunurluğu arttırmak anlamına gelir ki; kendi yazdığınız kodlar bile on binlerce satıra çıktığında gerçekten faydasını görüyorsunuz. :)

function kimlik(string $name, string $surname, int $age)
{
return "Adı : " . $name . "\nSoyadı : " . $surname . "\nYaşı : ".$age;
}

echo kimlik("Muhammet", "Şafak", 28);
echo "\n\n";
echo kimlik("Ahmet", "Taşdelen", "25");

Yukarıdaki kodumuzda fonksiyon tanımlanırken görebileceğiniz gibi her parametrenin hangi türde olması gerektiği belirtilmiştir. Çıktısı:

Adı : Muhammet
Soyadı : Şafak
Yaşı : 28

Adı : Ahmet
Soyadı : Taşdelen
Yaşı : 25

şeklindedir.

Burada görebileceğiniz gibi $age parametresinin bir tam sayı olması gerektiğini söylediğim halde tırnak içinde bir dize olarak tam sayı tanımladığımda (ki aslında veri türü dizedir) kabul etti ve çalıştı.

PHP yorumlayıcı kodların yorumlanma şeklini esnettiği için "25" şeklindeki yazım ile 25 şeklindeki yazımı aynı kabul etti. Bunu önlemek ve PHP yorumlayıcısının katı kurallarla yorumlama yapmasını sağlamak için dosyanın en başına declare(strict_types=1); şeklinde bir tanımlama yapmanız gerekir. Böylece PHP yorumlayıcı katı kurallar uygulayarak kodlarınızı yorumlayacaktır.

declare(strict_types=1);

function kimlik(string $name, string $surname, int $age)
{
return "Adı : " . $name . "\nSoyadı : " . $surname . "\nYaşı : ".$age;
}
echo kimlik("Ahmet", "Taşdelen", "25");

Artık bu kod çalışmayacak ve;

PHP Fatal error: Uncaught TypeError: kimlik(): Argument #3 ($age) must be of type int, string given, called in ...

diye başlayıp devam eden ölümcül bir hata üretecektir.

Tıpkı parametrelerin türlerine bir dayatma işlemi uyguladığımız gibi fonksiyonların döndürdüğü değerlerin veri türüne de dayatma işlemi uygulayabiliriz.

declare(strict_types=1);

function hello(): string
{
return "Hello World!";
}

function topla(int $x, int $y): int
{
return $x + $y;
}

function yazdir(string $metin): void
{
echo $metin;
}

Yukarıdaki 3 fonksiyon örneğini inceleyecek olursak;

hello() fonksiyonu bir string (dize) döndürmek zorundadır,
topla() fonksiyonu bir int (tam sayı) döndürmesi gerektiğini bildirdik,
yazdir() fonksiyonu ise bir değer döndürmeyeceği için void olarak belirttik.

var_dump() Fonksiyonu ve Kullanımı

Bir değişkenin tür ve içerik bilgisini detaylı şekilde ekrana yazdırmak için var_dump() fonksiyonu kullanılır.

$veri = "Muhammet ŞAFAK";
var_dump($veri);

Çıktısı :

string(15) "Muhammet ŞAFAK"

Yukarıdaki örnekte görebileceğiniz gibi değişkenin değerinin veri türünü kaç elemana sahip olduğunu ve içeriğini döndürdü.

$veri = 1453;
var_dump($veri);

$pi = 3.14;
var_dump($pi);

Çıktısı:

int(1453)
float(3.14)

şeklinde olur.

Ya da bir dizi üzerinde uygulanırsa;

$dizi = array(1, "Ahmet", 3.14, 4, true, null, false);
var_dump($dizi);

Çıktısı:

array(7) {
[0]=>
int(1)
[1]=>
string(5) "Ahmet"
[2]=>
float(3.14)
[3]=>
int(4)
[4]=>
bool(true)
[5]=>
NULL
[6]=>
bool(false)
}

şeklinde olacaktır.

serialize() ve unserialize()

Program içerisinde sıklıkla kullanılan dizi (array) türündeki gibi bir verinin veri tabanı gibi yapılarda saklanabilmesi mümkün değildir. Bu yüzden bu tür verilerin veri tabanı gibi yerlerde saklanabilmesini yani depolanabilmesi için uygun bir veri türüne dönüştürülmesi gerekir. Bu dönüştürme işlemi serialize() fonksiyonu tarafından, geri dönüştürme işlemi de unserialize() fonksiyonu tarafından yapılır.

serialize() : Veriyi saklanabilir ve geri dönüştürülebilir bir dizeye çevirerek döndürür.

unserialize() : serialize() fonksiyonu tarafından dönüştürülmüş veriyi eski haline döndürür.

$veri = array(1, "Ahmet", 3.14, 4, "Hakan");
echo serialize($veri);

Yukarıdaki kod aşağıdaki çıktıyı üretir;

a:5:{i:0;i:1;i:1;s:5:"Ahmet";i:2;d:3.14;i:3;i:4;i:4;s:5:"Hakan";}

Bu kodu gerisin geriye dönüştürmek için;

$veri = 'a:5:{i:0;i:1;i:1;s:5:"Ahmet";i:2;d:3.14;i:3;i:4;i:4;s:5:"Hakan";}';
$data = unserialize($veri);
print_r($data);

Çıktısı :

Array
(
[0] => 1
[1] => Ahmet
[2] => 3.14
[3] => 4
[4] => Hakan
)