Sürüm 5.4 itibariyle, PHP destekler traits. Bu not tam olarak ne arıyorsun, ama basit bir özellik tabanlı bir yaklaşım olacaktır:
trait StudentTrait {
protected $id;
protected $name;
final public function setId($id) {
$this->id = $id;
return $this;
}
final public function getId() { return $this->id; }
final public function setName($name) {
$this->name = $name;
return $this;
}
final public function getName() { return $this->name; }
}
class Student1 {
use StudentTrait;
final public function __construct($id) { $this->setId($id); }
}
class Student2 {
use StudentTrait;
final public function __construct($id, $name) { $this->setId($id)->setName($name); }
}
Biz iki sınıfa, biraz karşı-üretken her yapıcısı için biri ile sona. Bazı aklı korumak için, ben bir fabrikada atarım:
class StudentFactory {
static public function getStudent($id, $name = null) {
return
is_null($name)
? new Student1($id)
: new Student2($id, $name)
}
}
Yani, bütün bu aşağı gelir:
$student1 = StudentFactory::getStudent(1);
$student2 = StudentFactory::getStudent(1, "yannis");
Bu korkunç ayrıntılı bir yaklaşım, ama son derece kullanışlı olabilir.