Vì bạn không biết loại (tên lớp) của các đối tượng được trả về trước khi thực hiện truy vấn, bạn không thể chỉ định nó.
Tuy nhiên, bạn có thể đóng gói logic đó bên trong một kiểu khác mà bạn sử dụng làm kiểu trả về, sau đó có thể trả về kiểu trả về cụ thể:
/**
* Should not have any private, public or protected members in it's definition.
*
* Does only work for public properties.
*/
class ReturnObject {
public function getConcrete()
{
/* decide here which class */
$classname = 'Child'; // or 'Adult'
return $this->selfAs($classname);
}
private function selfAs($classname)
{
$l = strlen(__CLASS__);
$s = sprintf('O:%d:"%s"', strlen($classname), $classname).substr(serialize($this), 5+strlen($l)+$l);
$instance = unserialize($s);
$instance->__construct();
return $instance;
}
}
Sau đó, bạn có thể sử dụng getConcrete()
hàm trên mỗi đối tượng được trả về để trả về kiểu cụ thể của bạn, logic quyết định của bạn bị ràng buộc với trả về cơ sở dữ liệu.
Chỉnh sửa: Tôi đã thay đổi nó thành một phiên bản đầu tiên sẽ khởi tạo các thuộc tính đối tượng thông qua unserialize (vui lòng kiểm tra xem điều này có hoạt động hay không, nó dựa trên giả định rằng chúng ta chỉ nói về các thuộc tính công cộng và tôi không biết liệu PDO có chỉ thực hiện các bộ thiết lập hay hơn không thông qua phản chiếu trong chế độ bạn đang sử dụng) và sau đó gọi hàm khởi tạo. Hàm tạo cần phải ở chế độ công khai (và nó phải tồn tại) để nó hoạt động.
Về mặt kỹ thuật, có thể cung cấp điều này cho các thành viên riêng tư và được bảo vệ, tuy nhiên điều này cần phản ánh thực tế và nó cũng cần phân tích cú pháp dữ liệu được tuần tự hóa. Lớp này chỉ đổi tên tên lớp, nhưng không đổi tên các thuộc tính private.
Tuy nhiên đây chỉ là một cách để làm như vậy. Bạn có thể chỉ cần một ->isChild()
hoặc ->isAdult()
hoạt động trên Person
của bạn lớp học.