ฉันกำลังสร้างห้องสมุด ORM โดยคำนึงถึงการใช้ซ้ำและความเรียบง่าย ทุกอย่างเป็นไปด้วยดียกเว้นว่าฉันติดอยู่กับข้อ จำกัด ทางมรดกที่โง่เขลา โปรดพิจารณารหัสด้านล่าง:
class BaseModel {
/*
* Return an instance of a Model from the database.
*/
static public function get (/* varargs */) {
// 1. Notice we want an instance of User
$class = get_class(parent); // value: bool(false)
$class = get_class(self); // value: bool(false)
$class = get_class(); // value: string(9) "BaseModel"
$class = __CLASS__; // value: string(9) "BaseModel"
// 2. Query the database with id
$row = get_row_from_db_as_array(func_get_args());
// 3. Return the filled instance
$obj = new $class();
$obj->data = $row;
return $obj;
}
}
class User extends BaseModel {
protected $table = 'users';
protected $fields = array('id', 'name');
protected $primary_keys = array('id');
}
class Section extends BaseModel {
// [...]
}
$my_user = User::get(3);
$my_user->name = 'Jean';
$other_user = User::get(24);
$other_user->name = 'Paul';
$my_user->save();
$other_user->save();
$my_section = Section::get('apropos');
$my_section->delete();
เห็นได้ชัดว่านี่ไม่ใช่พฤติกรรมที่ฉันคาดหวังไว้ (แม้ว่าพฤติกรรมจริงก็สมเหตุสมผลเช่นกัน) .. ดังนั้นคำถามของฉันคือถ้าพวกคุณรู้ค่าเฉลี่ยที่จะได้รับในคลาสผู้ปกครองชื่อของคลาสลูก
debug_backtrace()
.. วิธีแก้ปัญหาที่เป็นไปได้คือการใช้การผูกแบบคงที่ล่าช้าจาก PHP 5.3 แต่นั่นไม่ใช่ความเป็นไปได้ในกรณีของฉัน ขอขอบคุณ.