Aylık Arşiv: Ağustos 2012

PHP – RegEx’de Yorum Satırı Ekleme

Diğer dillerin birçoğunda RegEx pattern(desen)ları içerisine doğrudan comment(yorum) ekleyebiliyorsunuz. Ancak PHP’de bu durum biraz farklı…

Şöyle ki, örnek pattern şöyle diyelim:

/<div id="bolum1"><div class="alt.*?">(\d+)<\/div><\/div>/

Şöyle bakınca bolum1‘in ne bölümü, alt‘da niye .*? yazdığı belirsiz. Bunları açıklayan birer comment olsa ne güzel olurdu dimi?

Şimdi pattern’ı parçalayıp ilgili yerlere commenti ekleyelim (örnek olması için comment’ler öylesine yazılmıştır).

$ptrn = '/<div id="bolum1">'; # Elektronik bolumu anlamina geliyor.
$ptrn .= '<div class="alt.*?">'; # class'lar alt1 altb1 seklinde
$ptrn .= '(\d+)'; # sadece rakamlar
$ptrn .= '<\/div><\/div>/'; #divler kapandi

Şimdi neyin neden kullanıldığı daha net ortaya çıktı. echo $ptrn; dediğinizde ilk yazılan pattern ile aynı sonuç çıkacaktır.

 
2 Kudos
Don't move

PHP – Dosya İşlemlerinde Atomic Lock

Bazı durumlarda txt vb. dosyalara kullanıcıdan alınan bilgilerin basılması gerekebiliyor. Ama bu işlemlerde de başka bir problem ortaya çıkıyor.

1. kullanıcı dosyadaki (yazma veya okuma) işlemini bitirmeden, 2. kullanıcı o dosyada herhangi bir işlem yapmamalı. Çünkü veri karmaşası olabilir.

Bu durumda atomic lock (atom kilidi) yöntemi kullanılmalı. PHP’de bu işlem için flock fonksiyonu bulunuyor.

Hemen örnek kodlara bakalım.

birinci.php

$dosya = fopen('test.txt', 'a+');

if(flock($dosya, 2)){
    for($i=0;$i<=5;$i++){
        fwrite($dosya, "birinci dosya calisti\n");
        sleep(2);
    }
}
else
    echo 'Dosya kilitlenemedi';

flock($dosya, 3);
fclose($dosya);

ikinci.php

$dosya = fopen('test.txt', 'a+');

if(flock($dosya, 2)){
    fwrite($dosya, "ikinci dosya calisti\n");
}
else
    echo 'Dosya kilitlenemedi';

flock($dosya, 3);
fclose($dosya);

Şimdi birinci.php dosyasının çalışması ~10 saniye sürecektir. Tam çalıştığı sırada (10 saniyelik süre içinde) ikinci.php‘yi çalıştırırsanız, sırasını bekleyip birinci.php‘nin test.txt dosyasını salıvermesini bekleyecektir. Çünkü test.txt dosyası birinci.php tarafından kilitlenmiştir.

flock fonksiyonundaki rakamsal değerler şu anlama gelir:

1: Okurken kilitleme.
2: Yazarken kilitleme
3: Okuma veya yazma farketmeksizin kilit kaldırılır.

Not: 3 değerini çalıştırmasanız dahi birinci.php‘nin çalışması bitince test.txt dosyasının kilidi kaldırılıp ikinci.php çalışacaktır (5.3.2’den sonraki sürümler için). Ancak performans için 3 değerini işiniz bitince yollamanızı öneririm.

 
1 Kudos
Don't move

PHP Type Hinting

PHP Type Hinting ya da Türkçesi Tür Dayatma. Bu yazıda Type Hinting olayından bahsedeceğim.

Type Hinting’de esas olay fonksiyona gönderilen parametrenin istediğimiz bir türde olmasını sağlamak. Örneğin yazdir diye bir fonksiyonunuz var ve bu yazdir fonksiyonu sadece array yazdiracak.

Örneğin:

function yazdir(array $param){
    print_r($param);
}
yazdir(array('Merhaba'));//calisacak
yazdir('Merhaba');//hata verecek

Gördüğünüz gibi yazdir fonksiyonu sadece array türünü kabul ediyor. String gelince hata verdi (bu hatayı handle etmek için set_error_handler fonksiyonunu kullanabilirsiniz.).

Şimdi en basit Type Hinting olayını gördük.

Bir de bunu Class‘lar ile deneyelim.

Önce kodu vereyim sonra açıklayım.

abstract class yonetici{

    public function getir(){
        return $this->veri;
    }
}

class A extends yonetici{

    public $veri = "A CAGIRILDI \n";

}

class B extends yonetici{

    public $veri = "B CAGIRILDI \n";

}

class C{

    public $veri = "C CAGIRILDI \n";

    function getir(){
        return $this->veri;
    }
}

function yazdir(yonetici $x){
    echo $x->getir();
}

$a1 = new a;
$b1 = new b;
$c1 = new c;

yazdir($a1);//calisacak
yazdir($b1);//calisacak
yazdir($c1);//hata verecek

Abstract class’dan extends edilmiş 2 tane (A ve B) class’ları var. C ise tamamen bağımsız bir class.

yazdir fonksiyonunda ise bir Type Hinting yapılmış; sadece yonetici class’ındaki getir methodu işlenecek. Ancak C class‘ında getir methodu olmasına rağmen, yonetici class‘ından extends edilmediği için hata verecektir.

Nesneler oluşturulup yazdir‘a gönderilince, gönderilmiş nesnelerin içinde getir methodu aranıyor. Eğer bulamazsa hata veriyor. Bu sondaki yazdir içinden method çağırma için ayrıca Bkz.: Duck Typing

 
3 Kudos
Don't move