Constructor ve abstract
Abstract sınıfta yapıcı tanımlayıp alt sınıfta parent:: ile çağırmayı öğrenirsin.
Abstract sınıfta yapıcı
Soyut bir sınıfın içinde __construct tanımlayabilirsin. Bu yapıcı, new ile doğrudan çağrılamaz (çünkü sınıf soyuttur); ama alt sınıf new ile örneklendiğinde çalışır. Yani yapıcı, alt sınıflar için ortak başlangıç (shared init) sağlar.
Örneğin Vehicle soyut sınıfı $name property'sini yapıcıda atar. Tüm alt sınıflar bu mantığı tekrar yazmaz; ebeveynden miras alır.
Alt sınıfın kendi yapıcısını tanımlamadığı durumlarda ebeveynin yapıcısı otomatik kullanılır. Ancak alt sınıf kendi yapıcısını yazarsa parent::__construct() ile açıkça çağırmalıdır.
parent::__construct ile ebeveyni çağır
Alt sınıf kendi yapıcısını tanımlarsa, ebeveynin yapıcısı otomatik çağrılmaz. Bunu açıkça parent::__construct() ile çağırman gerekir. Aksi halde ebeveynin başlangıç mantığı atlanır.
Tipik desen şudur: alt sınıfın yapıcısı ek parametreler alır, önce parent::__construct() ile ebeveynin yapıcısını çağırır, sonra kendi ek property'lerini yazar.
class Car extends Vehicle {
public int $wheels;
public function __construct(string $name, int $wheels) {
parent::__construct($name);
$this->wheels = $wheels;
}
}Bu desen, ortak başlangıcı korurken alt sınıfa özgü alanları da ekler.
Uygulama Abstract yapıcı + parent çağrısı
Bir Vehicle soyut sınıfı tanımla. public string $name property'si olsun. Yapıcı metodu public function __construct(string $name) olsun ve $this->name = $name atasın. Sonra Car sınıfını Vehicle'dan türet. Car'da önce public int $wheels property tanımla. Car'ın yapıcısı public function __construct(string $name, int $wheels) olsun; önce parent::__construct($name) çağırsın, sonra $this->wheels = $wheels atasın. Son olarak describe() metodu return $this->name . " " . $this->wheels . " tekerlek"; döndürsün. $c = new Car("Toyota", 4) ve echo $c->describe() . "\n";
Örnek çözümü göster
:__construct($name) çağır, sonra $this->wheels = $wheels ata. describe() $this->name . " " . $this->wheels . " tekerlek" döndürsün.
Örnek çözüm:
<?php
// Vehicle soyut sınıfını tanımla
abstract class Vehicle {
public string $name;
public function __construct(string $name) {
$this->name = $name;
}
}
class Car extends Vehicle {
public int $wheels;
public function __construct(string $name, int $wheels) {
parent::__construct($name);
$this->wheels = $wheels;
}
public function describe(): string {
return $this->name . " " . $this->wheels . " tekerlek";
}
}
$c = new Car("Toyota", 4);
echo $c->describe() . "\n";
Kendini test et
-
Soyut sınıfta yapıcı tanımlarsan alt sınıf ne yapmalı?
- Hiçbir şey; ebeveyn yapıcısı otomatik çağrılır
- Açıkça parent::__construct() çağırmalı
- Yapıcıyı yeniden tanımlayamaz
- Alt sınıf yapıcı tanımlayamaz
Cevabı göster
Açıkça parent::__construct() çağırmalı — Doğru. Alt sınıf kendi yapıcısını tanımlarsa parent::__construct() ile ebeveyni açıkça çağırmalı.
-
parent yapıcı çağrısı
public function __construct(string $name, int $wheels) { ____ $this->wheels = $wheels; }Cevabı göster
public function __construct(string $name, int $wheels) { parent::__construct($name); $this->wheels = $wheels; } -
Constructor ve abstract kavramlarını eşleştir
- abstract yapıcı
- Soyut sınıfta tanımlanır
- parent::__construct
- Ebeveyn yapıcıyı çağırır
- shared init
- Ortak başlangıç adımı
- alt sınıf yapıcısı
- Ek parametre alabilir