Sınıflar ve nesneler (PHP 4)
PHP Manual

class sözcüğü

Bir sınıf, değişkenlerden ve bu değişkenlerle çalışan işlevlerden oluşan bir bütündür. Değişkenler var anahtar sözcüğüyle belirtilir, işlevler ise function ile tanımlanır. Bir sınıf şöyle bir söz dizimi ile tanımlanır:

<?php
class Sepet {
    var 
$mallar;  // Sepetteki mallar

    // $malnum numaralı $adet adet malı sepete ekle

    
function mal_ekle($malnum$adet) {
        
$this->mallar[$malnum] += $adet;
    }

    
// $malnum numaralı $adet adet malı sepetten sil

    
function mal_sil($malnum$adet) {
        if (
$this->mallar[$malnum] > $adet) {
            
$this->mallar[$malnum] -= $adet;
            return 
true;
        } elseif (
$this->mallar[$malnum] == $adet) {
            unset(
$this->mallar[$malnum]);
            return 
true;
        } else {
            return 
false;
        }
    }
}
?>

Bu örnekte, sepetteki malları içeren bir ilişkisel dizi ile sepete malları ekleyip çıkarmak için iki işlevden oluşan Sepet sınıfı tanımlanmaktadır.

Uyarı

Bir sınıf tanımını birden fazla dosyaya yayamayacağınız gibi yöntem bildirimi dışında birden fazla PHP bloğuna da bölemezsiniz. Aşağıdaki örnek çalışmayacaktır:

<?php
class Deneme {
?>
<?php
    
function dene() {
        print 
'TAMAM';
    }
}
?>

Ancak, buna izin verilir:

<?php
class Deneme {
    function 
dene() {
        
?>
        <?php
        
print 'TAMAM';
    }
}
?>

Aşağıdaki Dikkat bölümleri PHP 4 içindir.

Dikkat

stdClass ismi Zend tarafından yerleşik sınıf ismi olarak ayrılmıştır. stdClass ismini kendi sınıflarınızda kullanamazsınız.

Dikkat

__sleep ve __wakeup işlev isimleri PHP sınıfları için sihirlidir. Bunlarla ilgili sihirli işlevselliğe ihtiyacınız olmadığı sürece bu işlev isimlerini sınıflarınızın içinde kullanamazsınız. Daha ayrıntılı bilgi için belgenin devamına bakınız.

Dikkat

PHP, __ ile başlayan tüm işlev isimlerini kendi yerleşik işlev isimleri için ayırmıştır. PHP'de özellikle belgelenmiş sihirli işlevselliğe ihtiyacınız olmadığı sürece böyle işlev isimleri kullanmanız önerilmez.

PHP 4'te var değişkenlerinin sadece sabitlerle ilklendirilmesine izin verilir. Değişkenleri sabit olmayan değerlerle ilklendirmek isterseniz, sınıf bir nesne olarak örneklendiği anda kendiliğinden çağrılan bir ilklendirici işlev üzerinden bunu yapabilirsiniz. Bu ilklendirici işleve kurucu işlev denir (aşağıya bakınız).

<?php
class Sepet {
    
/* Bunların hiçbiri PHP 4'te çalışmaz. */
    
var $bugun date("Y-m-d");
    var 
$ad $ilkad;
    var 
$sahibi 'Fred ' 'Jones';
    
/* Sabit değer içeren diziler çalışır. */
    
var $mallar = array("VCR""TV");
}

/* Bu iş böyle yapılır. */
class Sepet {
    var 
$bugun;
    var 
$ad;
    var 
$sahibi;
    var 
$mallar = array("VCR""TV");

    function 
Sepet() {
        
$this->bugun date("Y-m-d");
        
$this->ad $GLOBALS['ilkad'];
        
/* ve saire. . . */
    
}
}
?>

Sınıflar veri türleridir, yani asıl değişkenlerin örüntüsüdürler. Bu tür bir değişkeni new işleci ile oluşturabilirsiniz.

<?php
$sepet 
= new Sepet;
$sepet->mal_ekle("10"1);

$diger_sepet = new Sepet;
$diger_sepet->mal_ekle("0815"3);
?>

Bu örnekte, Sepet sınıfından $sepet ve $diger_sepet diye iki nesne oluşturulmakta ve $sepet nesnesinin mal_ekle işlevi ile $sepet'e "10" numaralı malzemeden 1 adet, $diger_sepet'e de "0815" numaralı malzemeden 3 adet eklenmektedir.

$sepet ve $diger_sepet nesnelerinin ikisi de mal_ekle ve mal_sil işlevleri ile mallar değişkenine sahiptir. Bunlar isimleri aynı olsa da birbirlerinden bağımsız işlev ve değişkenlerdir. Nesneleri, bir dosya sisteminin dizinleri olarak düşünebilirsiniz. Bir dosya sisteminde ayrı ayrı dizinlerde BENi.OKU adında iki farklı dosyanız olabilir. Bu dosyalara kök dizinden ayrı ayrı erişmek isterseniz dosyaların tam yollarını yazmanız gerekir. Tıpkı bunun gibi PHP'de de bir nesne işlevini çağırmak için istediğiniz işlevin tam yolunu yazmanız gerekir. İşlemi PHP'ye tercüme edersek: Kök dizin, küresel alana; dosya yolu ayracı, -> ayracına karşılıktır. Dolayısıyla, $sepet->mallar ile $diger_sepet->mallar iki ayrı değişkendir. Burada şuna dikkat edin: Değişkenin ismi $sepet->mallar'dır, $sepet->$mallar değildir. PHP $sepet->$mallar dizgesini $ imli iki değişken ismi olarak ele alır.

<?php
// tek $ imiyle, doğru
$sepet->mallar = array("10" => 1);

// $sepet->$mallar, $sepet->"" haline gelir, geçersiz
$sepet->$mallar = array("10" => 1);

// $sepet->$ogeler, $sepet->mallar haline gelir,
// istenen bu olmasa da yorum olarak doğrudur
$ogeler 'mallar';
$cart->$ogeler = array("10" => 1);
?>

Bir sınıf tanımı içinde, betiğinizin neresinden hangi nesne ismiyle bu sınıfın örnekleneceğini bilemezsiniz. Yani, Sepet sınıfının yazıldığı sırada bu sınıfın $sepet veya $diger_sepet ya da başka bir isimle örnekleneceği kararını henüz vermemişsinizdir. Bu bakımdan, Sepet sınıfının içinde $sepet->mallar diye bir değişken ismi kullanamazsınız. Sınıfın kendi işlev ve değişkenlerine erişirken bu amaçla 'benim', 'geçerli nesnem' anlamında $this sözde değişkeni kullanılır. Bu bakımdan '$this->mallar[$malnum] += $adet;' deyimi, "(benim) mallar dizimin $malnum elemanına $adet değerini ekle" veya "geçerli nesnenin mallar dizisinin $malnum elemanına $adet değerini ekle" olarak okunabilir.

Bilginize:

$this sözde değişkeni sınıfın kendi yöntemi duruk olarak çağrıldığı takdirde tanımlı değildir. Ancak bu, "$this, bir yöntem başka bir nesnenin içinden duruk olarak çağrıldığında tanımlıdır." tarzında anlaşılmamalıdır. Böyle bir durumda $this'in değeri çağrıldığı nesne olacaktır. Bunu bir örnekle pekiştirelim:

<?php
class A
{
    function 
foo()
    {
        if (isset(
$this)) {
            echo 
'$this tanımlı (';
            echo 
get_class($this);
            echo 
")\n";
        } else {
            echo 
"\$this tanımsız.\n";
        }
    }
}

class 
B
{
    function 
bar()
    {
        
A::foo();
    }
}

$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>

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

$this tanımlı (A)
$this tanımsız.
$this tanımlı (B)
$this tanımsız.

Bilginize:

Sınıflar ve nesnelerle çalışırken kullanışlı olabilen bazı işlevler vardır. Bunları Sınıf/Nesne İşlevleri bölümünde bulabilirsiniz.


Sınıflar ve nesneler (PHP 4)
PHP Manual