获取父类中子类的名称(静态上下文)

我在构建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();

显然,这不是我所期望的行为(尽管实际行为也很有意义)。因此,我的问题是,你们是否知道在父类中获得子类名称的意思。

回答:

简而言之。这不可能。在php4中,您可以实施可怕的破解(检查debug_backtrace()),但是该方法在PHP5中不起作用。参考资料:

  • 30423

  • 37684

  • 34421

:PHP

5.3中后期静态绑定的示例(在注释中提到)。请注意,当前的实现(src)中存在潜在的问题。

class Base {

public static function whoAmI() {

return get_called_class();

}

}

class User extends Base {}

print Base::whoAmI(); // prints "Base"

print User::whoAmI(); // prints "User"

以上是 获取父类中子类的名称(静态上下文) 的全部内容, 来源链接: utcz.com/qa/407996.html

回到顶部