5. Nesneler
5.1. Herhangi bir değişken, özniteliklere sahip bir nesne haline gelebilir (exemple_14)
<?php
// her değişken, yapısı gereği özniteliklere sahip olabilir
$obj1->attr1 = "un";
$obj1->attr2 = 100;
// nesneyi görüntüler
print "objet1=[$obj1->attr1,$obj1->attr2]\n";
// nesneyi değiştirir
$obj1->attr2+=100;
// nesneyi görüntüler
print "objet1=[$obj1->attr1,$obj1->attr2]\n";
// nesne1'in değerini nesne2'ye atar
$obj2 = $obj1;
// obj2'yi değiştirir
$obj2->attr2 = 0;
// iki nesneyi görüntüler
print "objet1=[$obj1->attr1,$obj1->attr2]\n";
print "objet2=[$obj2->attr1,$obj2->attr2]\n";
// nesne1'in referansını nesne3'e atar
$obj3 = &$obj1;
// obj3'ü değiştirir
$obj3->attr2 = 10;
// iki nesneyi de görüntüler
print "objet1=[$obj1->attr1,$obj1->attr2]\n";
print "objet3=[$obj3->attr1,$obj3->attr2]\n";
// bir nesne bir sözlük mü?
print count($obj1)."\n";
while (list($attribut, $valeur) = each($obj1))
print "obj1[$attribut]=$valeur\n";
// son
exit;
?>
Sonuçlar:
objet1=[un,100]
objet1=[un,200]
objet1=[un,0]
objet2=[un,0]
objet1=[un,10]
objet3=[un,10]
1
obj1[attr1]=un
obj1[attr2]=10
Açıklamalar
-
- satır: $obj->attr notasyonu, $obj değişkeninin attr özniteliğini belirtir. Eğer bu öznitelik mevcut değilse oluşturulur ve böylece $obj değişkeni, özniteliklere sahip bir nesne haline gelir.
-
- satır: $obj2=$obj1 ifadesi, $obj1 bir nesne olduğunda, referans yoluyla nesnelerin kopyalanmasıdır. Dolayısıyla $obj2 ve $obj1, aynı nesneye ait referanslardır. Nesnenin kendisi, bu referanslardan herhangi biri aracılığıyla değiştirilebilir.
-
- satır: $obj3=&$obj1 ifadesi, $obj3'e $obj1 değişkeninin referansını (adresini) atar. $obj1 burada olduğu gibi bir nesne ise, önceki ifade $obj3=$obj1 ile eşdeğerdir.
- 28-29. satırlar: Bir nesnenin sözlük gibi taranabileceğini gösterir. Sözlüğün anahtarları özniteliklerin adlarıdır ve sözlüğün değerleri ise bu özniteliklerin değerleridir.
-
- satır: count işlevi bir nesneye uygulanabilir, ancak beklendiği gibi öznitelik sayısını vermez. Dolayısıyla bir nesne, bir sözlükle benzerlikler gösterir ancak bir sözlük değildir.
5.2. Bildirilmiş özniteliği olmayan bir Kişi sınıfı (exemple_15)
<?php
class Personne {
// sınıfın öznitelikleri
// bildirilmemiş - dinamik olarak oluşturulabilir
// yöntem
function identité() {
// ilk bakışta, mevcut olmayan öznitelikler kullanıyor
return "[$this->prénom,$this->nom,$this->âge]";
}
}
// test
// özellikler genel ve dinamik olarak oluşturulabilir
$p = new Personne();
$p->prénom = "Paul";
$p->nom = "Langevin";
$p->âge = 48;
// yöntem çağrısı
print "personne=" . $p->identité() . "\n";
// son
exit;
?>
Sonuçlar:
Açıklamalar
- 3-13. satırlar: Personne sınıfını tanımlar. Sınıf, nesnelerin oluşturulduğu bir kalıptır. Sınıf, öznitelikleri ve yöntem adı verilen işlevleri bir araya getiren bir kümedir. Özniteliklerin bildirilmesi zorunlu değildir.
- 9-12. satırlar: identité yöntemi, sınıfta bildirilmemiş üç özniteliğin değerini görüntüler. $this anahtar sözcüğü, yöntemin uygulandığı nesneyi belirtir.
-
- satır: Personne türünde bir $p nesnesi oluşturulur. new anahtar sözcüğü, yeni bir nesne oluşturmak için kullanılır. Bu işlem, oluşturulan nesneye bir referans (yani bir adres) döndürür. Çeşitli yazım biçimleri mümkündür: new Personne(), new Personne, new personne. Sınıf adı büyük/küçük harf duyarlı değildir.
- 18-20. satırlar: identité yöntemine gerekli olan üç öznitelik, $p nesnesinde oluşturulur.
-
- satır: Personne sınıfının identité yöntemi, $p nesnesine uygulanır. identité yönteminin kodunda (9-11. satırlar), $this, $p ile aynı nesneye başvurur.
5.3. Bildirilmiş özniteliklere sahip Personne sınıfı (exemple_16)
<?php
class Personne {
// sınıf öznitelikleri
var $prénom;
var $nom;
var $âge;
// yöntem
function identité() {
return "[$this->prénom,$this->nom,$this->âge]";
}
}
// test
// özellikler genel
$p = new Personne();
$p->prénom = "Paul";
$p->nom = "Langevin";
$p->âge = 48;
// yöntem çağrısı
print "personne=" . $p->identité() . "\n";
// son
exit;
?>
Sonuçlar:
Açıklamalar
- 6-8. satırlar: Sınıfın öznitelikleri var anahtar sözcüğüyle açıkça bildirilmiştir.
5.4. Oluşturucuya sahip Personne sınıfı (exemple_17)
Önceki örneklerde, PHP 4'te bulunabilecek türden sıra dışı Personne sınıfları gösterilmişti. Bu örnekleri takip etmeniz tavsiye edilmez. Şimdi, PHP 5'teki iyi uygulamalara uygun bir Personne sınıfını sunuyoruz:
<?php
class Personne {
// sınıf öznitelikleri
private $prénom;
private $nom;
private $âge;
// alıcı ve ayarlayıcılar
public function getPrénom() {
return $this->prénom;
}
public function getNom() {
return $this->nom;
}
public function getAge() {
return $this->âge;
}
public function setPrénom($prénom) {
$this->prénom = $prénom;
}
public function setNom($nom) {
$this->nom = $nom;
}
public function setAge($age) {
$this->âge = $age;
}
// yapıcı
function __construct($prénom, $nom, $âge) {
// set yöntemleri üzerinden geçiliyor
$this->setPrénom($prénom);
$this->setNom($nom);
$this->setAge($âge);
}
// toString yöntemi
function __toString() {
return "[$this->prénom,$this->nom,$this->âge]";
}
}
// test
// kişi nesnesinin oluşturulması
$p = new Personne("Paul", "Langevin", 48);
// bu kişinin kimliği
print "personne=$p\n";
// yaşın değiştirilmesi
$p->setAge(14);
// kişinin kimliği
print "personne=$p\n";
// son
exit;
?>
Sonuçlar:
Yorumlar
- 3-48. satırlar: Personne sınıfı
- 6-8. satırlar: Sınıfın özel (private) öznitelikleri. Bu öznitelikler yalnızca sınıfın içinde görülebilir. Kullanılabilecek diğer anahtar kelimeler şunlardır:
- public: özniteliği, sınıfın dışından görülebilen bir public öznitelik haline getirir
- protected: özniteliği, sınıfın içinden ve ondan türetilen sınıflardan görülebilen korumalı bir öznitelik haline getirir.
- Özellikler özel olduğu için, sınıfın dışından bunlara erişilemez. Dolayısıyla aşağıdaki kodu yazamayız:
Burada, Personne sınıfının dışındayız. nom özniteliği özel olduğundan, 2. satır hatalıdır. $p nesnesinin özel alanlarını başlatmak için iki yol vardır:
- (devamı)
- 11-33. satırlardaki set ve get adlı genel yöntemleri kullanmak (bu yöntemlerin adı herhangi bir şey olabilir). Böylece şöyle yazabiliriz:
- (devam)
- 36-41. satırlardaki oluşturucuyu kullanmak. Bu durumda şöyle yazabiliriz:
Yukarıdaki kod, Personne sınıfındaki __construct adlı yöntemi otomatik olarak çağırır.
-
- satır: Bu satır, $p kişisini bir karakter dizesi biçiminde görüntüler. Bunun için, Personne sınıfının __toString adlı yöntemi kullanılır.
5.5. Oluşturucuda geçerlilik denetimi olan Personne sınıfı (exemple_18)
Bir sınıfın oluşturucusu, nesnenin başlatma değerlerinin doğru olup olmadığını kontrol etmek için uygun yerdir. Ancak bir nesne, set veya eşdeğer yöntemleri aracılığıyla da başlatılabilir. Aynı kontrolleri iki farklı yere yazmaktan kaçınmak için, bu kontroller set yöntemlerine yerleştirilecektir. Bir nesnenin başlatma değerlerinden birinin yanlış olduğu tespit edilirse, bir istisna atılacaktır. İşte bir örnek:
<?php
class Personne {
// sınıfın özellikleri
private $prénom;
private $nom;
private $âge;
// getter ve setter'lar
public function getPrénom() {
return $this->prénom;
}
public function getNom() {
return $this->nom;
}
public function getAge() {
return $this->âge;
}
public function setPrénom($prénom) {
// ad alanı boş olmamalıdır
if (!preg_match("/^\s*(.+?)\s*$/", $prénom, $champs)) {
throw new Exception("Le prénom doit être non vide");
} else {
$this->prénom = $champs[1];
}
}
public function setNom($nom) {
// soyadı boş olmamalıdır
if (!preg_match("/^\s*(.+?)\s*$/", $nom, $champs)) {
throw new Exception("Le nom doit être non vide");
} else {
$this->nom = $champs[1];
}
}
public function setAge($âge) {
// yaş geçerli olmalıdır
if (!preg_match("/^\s*(\d+)\s*$/", $âge, $champs)) {
throw new Exception("L'âge doit être un entier positif ou nul");
} else {
$this->âge = $champs[1];
}
}
// yapıcı
function __construct($prénom, $nom, $âge) {
// set yöntemleri kullanılır
$this->setPrénom($prénom);
$this->setNom($nom);
$this->setAge($âge);
}
// toString yöntemi
function __toString() {
return "[$this->prénom,$this->nom,$this->âge]";
}
}
// test
// Kişi nesnesinin oluşturulması
$p = new Personne("Paul", "Langevin", 48);
// bu kişinin kimliği
print "personne=$p\n";
// hatalı bir Kişi nesnesinin oluşturulması
try {
$p = new Personne("xx", "yy", "zz");
} catch (Exception $e) {
print $e->getMessage();
}
// son
exit;
?>
Sonuçlar:
Açıklamalar
- 23-30. satırlar: prénom özniteliğinin başlatılması ve başlatma değerinin doğrulanması
-
- satır: düzenli ifade kullanımı. Ad, bir veya daha fazla karakterden oluşan bir dizidir ve öncesinde veya sonrasında boşluklar olabilir.
-
- satır: Soyadı boşsa bir istisna atılır, aksi takdirde ad kaydedilir (28. satır)
-
- satır: Personne sınıfının oluşturucusunun kullanımı
-
- satır: Personne sınıfının __toString yönteminin kullanımı
- satır 70-74: Personne sınıfının oluşturucusu tarafından atılabilecek olası istisnanın yönetimi.
5.6. İkinci bir oluşturucu görevi gören bir yöntemin eklenmesi (exemple_19)
PHP 5'te, bir nesneyi çeşitli şekillerde oluşturmaya olanak tanıyan farklı parametrelere sahip birden fazla oluşturucu kullanmak mümkün değildir. Bu durumda, oluşturucu görevi gören yöntemler kullanılabilir:
<?php
class Personne {
// sınıfın özellikleri
private $prénom;
private $nom;
private $âge;
// getter ve setter'lar
public function getPrénom() {
return $this->prénom;
}
….
// yapıcı
function __construct($prénom, $nom, $âge) {
// set yöntemleri kullanılır
$this->setPrénom($prénom);
$this->setNom($nom);
$this->setAge($âge);
}
// yöntem
public function initWithPersonne($p) {
// geçerli nesneyi bir kişiyle başlatır $p
$this->__construct($p->prénom, $p->nom, $p->âge);
}
// yöntem toString
function __toString() {
return "[$this->prénom,$this->nom,$this->âge]";
}
}
// test
// Kişi nesnesinin oluşturulması
$p = new Personne("Paul", "Langevin", 48);
// bu kişinin kimliği
print "personne=$p\n";
// ikinci bir kişinin oluşturulması
$p2 = new Personne("Laure", "Adeline", 67);
// birincisinin ikinci kişinin değerleriyle başlatılması
$p->initWithPersonne($p2);
// doğrulama
print "personne=$p\n";
// son
exit;
?>
Sonuçlar:
Açıklamalar
- 26-29. satırlar: initWithPersonne yöntemi, başka bir nesnenin (Personne) özniteliklerinin değerlerini geçerli nesneye atamaya olanak tanır. Burada, __construct oluşturucusunu kullanır, ancak bu zorunlu değildir.
5.7. Kişi nesnelerinden oluşan bir dizi (exemple_20)
Aşağıdaki örnek, nesne dizileri oluşturulabileceğini göstermektedir.
<?php
class Personne {
// sınıfın özellikleri
private $prénom;
private $nom;
private $âge;
// getter ve setter'lar
public function getPrénom() {
return $this->prénom;
}
...
// yapıcı
function __construct($prénom, $nom, $âge) {
// set yöntemleri üzerinden geçiyoruz
$this->setPrénom($prénom);
$this->setNom($nom);
$this->setAge($âge);
}
// yöntem
public function initWithPersonne($p) {
….
}
// toString yöntemi
function __toString() {
...
}
}
// test
// Kişi nesnelerinden oluşan bir dizi oluşturma
$groupe = array(new Personne("Paul", "Langevin", 48), new Personne("Sylvie", "Lefur", 70));
// bu kişilerin kimlik bilgileri
for ($i = 0; $i < count($groupe); $i++)
print "groupe[$i]=$groupe[$i]\n";
// son
exit;
?>
Sonuçlar:
Açıklamalar
-
- satır: 2 kişilik bir tablo oluşturuldu
-
- satır: tablo üzerinde gezinti
-
- satır: $groupe[$i], Personne türünde bir nesnedir. __toString yöntemi, bu nesneyi görüntülemek için kullanılır.
5.8. Personne sınıfından türetilmiş bir sınıfın oluşturulması (exemple_21)
<?php
class Personne {
// sınıfın özellikleri
private $prénom;
private $nom;
private $âge;
// getter ve setter'lar
public function getPrénom() {
return $this->prénom;
}
...
// yapıcı
function __construct($prénom, $nom, $âge) {
// set yöntemleri kullanılır
$this->setPrénom($prénom);
$this->setNom($nom);
$this->setAge($âge);
}
// yöntem
public function initWithPersonne($p) {
// geçerli nesneyi bir kişiyle başlatır $p
$this->__construct($p->prénom, $p->nom, $p->âge);
}
// yöntem toString
function __toString() {
return "[$this->prénom,$this->nom,$this->âge]";
}
}
// Kişi sınıfından türetilmiş bir sınıf
class Enseignant extends Personne {
// özellikler
private $discipline; // öğretilen disiplin
// getter ve setter
public function getDiscipline() {
return $this->discipline;
}
public function setDiscipline($discipline) {
$this->discipline = $discipline;
}
// yapıcı
public function __construct($prénom, $nom, $âge, $discipline) {
// üst sınıf özellikleri
parent::__construct($prénom, $nom, $âge);
// diğer özellikler
$this->setDiscipline($discipline);
}
// üst sınıfın __toString işlevinin aşırı yüklenmesi
public function __toString() {
return "[" . parent::__toString() . ",$this->discipline]";
}
}
// test
// Kişi ve türev nesnelerden oluşan bir tablo oluşturma
$groupe = array(new Enseignant("Paul", "Langevin", 48, "anglais"), new Personne("Sylvie", "Lefur", 70));
// bu kişilerin kimlik bilgileri
for ($i = 0; $i < count($groupe); $i++)
print "groupe[$i]=$groupe[$i]\n";
// son
exit;
?>
Sonuçlar:
Yorumlar
- 3-35. satırlar: Personne sınıfı
-
- satır: Enseignant sınıfı, Personne. sınıfından türetilmiştir (extends). Türetilmiş sınıf Enseignant, ana sınıfının özniteliklerini ve yöntemlerini miras alır.
-
- satır: Enseignant sınıfı, kendisine özgü yeni bir discipline özniteliği ekler
-
- satır: Enseignant sınıfının oluşturucusu, ana sınıfını (ad, soyad, yaş) başlatmak için 3 parametre alır
- 3 tanesi üst sınıfını başlatmak için (ad, soyad, yaş)
- 1 tanesi kendi başlatılması için (disiplin)
-
- satır: Türetilmiş sınıf, parent :: anahtar sözcüğü aracılığıyla üst sınıfının yöntemlerine ve oluşturucularına erişebilir. Burada (ad, soyad, yaş) parametreleri üst sınıfın oluşturucusuna aktarılır.
-
- satır: Türetilmiş sınıfın __toString yöntemi, üst sınıfın __toString yöntemini kullanır.
-
- satır: Bir Enseignant nesnesi ve bir Personne nesnesi içeren bir dizi.
-
- satır: Dizin elemanları üzerinde döngü yapılmaktadır
-
- satır: Her bir $groupe[$i] öğesinin __toString yöntemi çağrılacaktır. Personne sınıfının bir __toString yöntemi vardır. Enseignant sınıfının ise iki yöntemi vardır: üst sınıfının yöntemi ve kendi yöntemi. Hangisinin çağrılacağı merak edilebilir. Yürütme sonucu, Enseignant sınıfının yönteminin çağrıldığını gösterir. Durum her zaman böyledir: Bir nesne üzerinde bir yöntem çağrıldığında, bu yöntem şu sırayla aranır: önce nesnenin kendisinde, varsa üst sınıfında, ardından üst sınıfın üst sınıfında vb. Yöntem bulunur bulunmaz arama sona erer.
5.9. Personne sınıfından türetilmiş ikinci bir sınıfın oluşturulması (exemple_22)
Aşağıdaki örnekte, Personne sınıfından türetilen Etudiant sınıfı oluşturulmaktadır:
<?php
class Personne {
// sınıfın özellikleri
private $prénom;
private $nom;
private $âge;
// getter ve setter'lar
public function getPrénom() {
return $this->prénom;
}
...
// yapıcı
function __construct($prénom, $nom, $âge) {
// set yöntemleri kullanılır
$this->setPrénom($prénom);
$this->setNom($nom);
$this->setAge($âge);
}
// yöntem
public function initWithPersonne($p) {
// geçerli nesneyi bir kişiyle başlatır $p
...
}
// yöntem toString
function __toString() {
return "[$this->prénom,$this->nom,$this->âge]";
}
}
// kişi sınıfından türetilmiş bir sınıf
class Enseignant extends Personne {
// özellikler
private $discipline; // öğretilen disiplin
// getter ve setter
...
// yapıcı
public function __construct($prénom, $nom, $âge, $discipline) {
// üst sınıf özellikleri
parent::__construct($prénom, $nom, $âge);
// diğer özellikler
$this->setDiscipline($discipline);
}
// üst sınıfın _identité__toString işlevinin aşırı yüklenmesi
public function __toString() {
return "[" . parent::__toString() . ",$this->discipline]";
}
}
// Personne sınıfından türetilmiş bir sınıf
class Etudiant extends Personne {
// özellikler
private $formation; // öğretilen ders
// getter ve setter
public function getFormation() {
return $this->formation;
}
public function setFormation($formation) {
$this->formation = $formation;
}
// yapıcı
public function __construct($prénom, $nom, $âge, $formation) {
// üst sınıf özellikleri
parent::__construct($prénom, $nom, $âge);
// diğer özellikler
$this->setFormation($formation);
}
// üst sınıfın __toString işlevinin aşırı yüklenmesi
public function __toString() {
return "[" . parent::__toString() . ",$this->formation]";
}
}
// test
// kişi ve türev nesnelerden oluşan bir dizi oluşturma
$groupe = array(new Enseignant("Paul", "Langevin", 48, "anglais"), new Personne("Sylvie", "Lefur", 70), new Etudiant("Steve", "Boer", 23, "iup2 qualité"));
// bu kişilerin kimlik bilgileri
for ($i = 0; $i < count($groupe); $i++)
print "groupe[$i]=$groupe[$i]\n";
// son
exit;
?>
Sonuçlar:
groupe[0]=[[Paul,Langevin,48],anglais]
groupe[1]=[Sylvie,Lefur,70]
groupe[2]=[[Steve,Boer,23],iup2 qualité]
5.10. Arayüzler (exemple_23)
Bir arayüz, yöntem prototiplerini tanımlayan bir yapıdır. Bir arayüzü uygulayan bir sınıf, arayüzdeki tüm yöntemlerin kodunu tanımlar.
<?php
// bir arayüz
interface IExemple {
function ajouter($i, $j);
function soustraire($i, $j);
}
// arayüzün 1. uygulaması
class Classe1 implements IExemple {
public function ajouter($a, $b) {
return $a + $b + 10;
}
public function soustraire($a, $b) {
return $a - $b + 20;
}
}
// arayüzün 2. uygulaması
class Classe2 implements IExemple {
public function ajouter($a, $b) {
return $a + $b + 100;
}
public function soustraire($a, $b) {
return $a - $b + 200;
}
}
// fonksiyon
function calculer($a, $b, IExemple $interface) {
print $interface->ajouter($a, $b)."\n";
print $interface->soustraire($a, $b)."\n";
}
// ------------------- main
// Classe1 ve Classe2 türünde 2 nesnenin oluşturulması
$c1 = new Classe1();
$c2 = new Classe2();
// calculer işlevinin çağrılması
calculer(4, 3, $c1);
calculer(14, 13, $c2);
?>
Sonuçlar
Yorumlar
- 4-8. satırlar: IExemple arayüzü iki yöntem tanımlar: ajouter işlevi (5. satır) ve soustraire işlevi (7. satır). Arayüz, bu yöntemlerin kodunu tanımlamaz. Bunu, arayüzü uygulayan sınıflar yapar.
-
- satır: Classe1 sınıfı, IExemple arayüzünü uygular (implements). Dolayısıyla, ajouter (satır 13) ve soustraire (satır 17) yöntemleri için bir kod tanımlar.
- 24-34. satırlar: Classe2 sınıfı için de durum aynıdır.
-
- satır: calculer yöntemi üç parametre kabul eder: iki tamsayı $a ve $b ile IExemple arayüzünü uygulayan bir $interface nesnesi. $interface parametresinin IExemple türünü belirtmeden function calculer($a,$b,$interface) şeklinde yazılabilirdi. Bunu belirterek, PHP yorumlayıcısının, gerçek parametrenin IExemple arayüzünü uygulayan bir nesne olup olmadığını doğrulamasına olanak tanırız.
- 38-39. satırlar: $interface nesnesinin ajouter ve soustraire yöntemlerinin kullanımı. Bu nesne IExemple arayüzünü uyguladığı için, bu iki yönteme sahip olduğu bilinmektedir.
- 44-45. satırlar: Farklı türlerde ancak her ikisi de IExemple arayüzünü uygulayan iki nesnenin oluşturulması.
-
- satır: calculer işlevine, Classe1 türünde olan ve IExemple arayüzünü uygulayan $c1 nesnesi aktarılır.
-
- satır: calculer işlevine geçilir; burada, Classe2 türündeki $c2 nesnesi, IExemple arayüzünü uygular.