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

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

最佳答案

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

  • 30423
  • 37684
  • 34421

  • 编辑:PHP 5.3中后期静态绑定(bind)的示例(在注释中提到)。请注意,当前的实现中存在潜在的问题(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"
    

    关于php - 获取父类中子类的名称(静态上下文),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/283004/

    10-11 18:16