Bir PHP sınıfı class Name { ... } ile tanımlanır ve özellikler (değişkenler) ile metotlar (fonksiyonlar) içerir. new Name() ondan bir nesne oluşturur ve -> bir özelliği okur veya bir metodu çağırır: $user->name, $user->greet().
Sınıf şablondur, nesne ondan üretilmiş tek bir şeydir. Bir sınıftan ihtiyacınız kadar nesne oluşturabilirsiniz ve her birinin kendi özellik değerleri olur.
Özellikler ve metotlar
Bir özellik bir görünürlük anahtar kelimesi, isteğe bağlı bir tür ve isteğe bağlı bir varsayılan değerle tanımlanır. Bir metot sınıfın içindeki bir fonksiyondur. Bir metodun içinde $this metodun üzerinde çağrıldığı nesnedir, bu yüzden $this->balance o nesnenin bakiyesini okur.
Her nesne kendi $balance değerini tutar: $a hesabına para yatırmak $b hesabına dokunmaz. new sonrasında özellikleri tek tek ayarlamak sıkıcı hale gelir; bir yapıcı (constructor) bunun yerine başlangıç değerlerini argüman olarak alır.
public, private ve protected
Görünürlük bir özelliğe kimin dokunabileceğini veya bir metodu kimin çağırabileceğini belirler:
| Anahtar kelime | Şuradan erişilebilir |
|---|---|
public | her yerden |
protected | sınıfın kendisi ve onu genişleten sınıflar |
private | yalnızca onu tanımlayan sınıf |
Bir özelliği private yapıp metotlar sunmak bir sınıfın kendi kurallarını korumasının yoludur. Burada bakiye yalnızca hatalı tutarları reddeden deposit() ve withdraw() üzerinden değişebilir:
Private özelliği sınıfın dışından okumak bir uyarı değil, bir Error olur:
Türlü özellikler ve başlatılmamış değerler
Varsayılan değeri olmayan türlü bir özellik başlatılmamış olarak başlar; bu null değerinden farklıdır. Herhangi bir şey atanmadan onu okumak bir Error fırlatır. Ya bir varsayılan değer verin, ya yapıcıda atayın ya da ?Type ve = null ile nullable yapın.
Türler atama sırasında zorunlu tutulur. Varsayılan (katı olmayan) modda $p->stock = '7' sayısal dizgeyi 7 değerine çevirir, $p->stock = 'many' ise bir TypeError fırlatır.
readonly özellikler
Bir readonly özellik (PHP 8.1) sınıfın içinden bir kez yazılabilir ve sonra bir daha asla. Para tutarları veya kimlikler gibi değer nesneleri oluşturmanın olağan yoludur. PHP 8.2 her özelliği readonly yapan readonly class ekledi.
Bir readonly özelliğin bir türü olmalıdır ve varsayılan değeri olamaz. Değiştirilmiş bir kopyaya ihtiyacınız varsa eskisini düzenlemek yerine yeni bir nesne oluşturun (new Order('B-2002')).
__toString ile bir nesneyi yazdırma
echo $object yalnızca sınıf __toString() tanımladığında çalışır. Metot, nesne metin olarak ele alındığında PHP'nin kullanması gereken dizgeyi döndürür: echo içinde, dizge birleştirmede, "{$object}" içinde.
__toString olmadan echo $object bir Error fırlatır ("Object of class Money could not be converted to string"). Hata ayıklama için print_r() ve var_dump() her nesnede çalışır ve private özellikleri de gösterir; bkz. var_dump ve print_r.
Bir nesneyi atamak onu kopyalamaz
Dizilerden gelen çoğu kişiyi yakan hata budur. Bir diziyi atamak onu kopyalar. Bir nesneyi atamak yalnızca tanıtıcıyı kopyalar: iki değişken de o zaman aynı nesneyi gösterir.
clone yüzeysel bir kopya oluşturur: bir özellik başka bir nesne tutuyorsa iki kopya o iç nesneyi hâlâ paylaşır. === yalnızca aynı nesne için true olur, == ise aynı sınıftan iki nesnenin özellik değerlerini karşılaştırır. Bir nesneyi bir fonksiyona vermek atama ile aynı şekilde çalışır, bu yüzden bir fonksiyon aldığı nesneyi değiştirebilir.
Sıkça Sorulan Sorular
PHP'de bir sınıftan nasıl nesne oluştururum?
Sınıf adıyla new kullanın: $user = new User();. Sınıfın bir yapıcısı varsa argümanlarını new User('Ada') örneğindeki gibi parantez içinde verin. Ardından metotları çağırır ve özellikleri ok operatörüyle okursunuz: $user->name, $user->greet().
PHP'de $this ne anlama gelir?
$this mevcut metodun üzerinde çağrıldığı nesnedir. $ada->greet() içinde $this $ada olur, bu yüzden $this->name Ada'nın adını okur. Yalnızca statik olmayan metotların içinde vardır.
PHP'de public, private ve protected arasındaki fark nedir?
public üyeler her yerden, private üyeler yalnızca onları tanımlayan sınıfın içinden, protected üyeler ise o sınıftan ve alt sınıflarından kullanılabilir. Private bir özelliği dışarıdan okumak bir Error fırlatır: Cannot access private property.
PHP'de nesneler referansla mı aktarılır?
Bir değişken nesnenin kendisini değil ona bir tanıtıcıyı tutar. $b = $a; tanıtıcıyı kopyalar, bu yüzden iki değişken de aynı nesneyi gösterir ve $b üzerinden yapılan bir değişiklik $a üzerinde görünür. Bağımsız bir kopya almak için $b = clone $a; kullanın.
PHP'de readonly özellik nedir?
public readonly string $id; olarak tanımlanan bir özellik (PHP 8.1+) sınıfın içinden bir kez ayarlanabilir ve sonra asla değiştirilemez. Ona ikinci kez yazmak bir Error fırlatır: Cannot modify readonly property.