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

2022-08-30 07:23:48

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

显然,这不是我所期望的行为(尽管实际行为也有意义)。所以我的问题是,如果你们知道在父类中,获得子类名称的平均值。


答案 1

你不需要等待PHP 5.3,如果你能够构思出一种在静态上下文之外做到这一点的方法。在 php 5.2.9 中,在父类的非静态方法中,您可以执行以下操作:

get_class($this);

它将以字符串形式返回子类的名称。

class Parent() {
    function __construct() {
        echo 'Parent class: ' . get_class() . "\n" . 'Child class: ' . get_class($this);
    }
}

class Child() {
    function __construct() {
        parent::construct();
    }
}

$x = new Child();

这将输出:

Parent class: Parent
Child class: Child

甜吧?


答案 2

总之。这是不可能的。在php4中,你可以实现一个可怕的黑客(检查),但这种方法在PHP5中不起作用。引用:debug_backtrace()

edit: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"

推荐