【问题标题】:Get top level class name when inheritance and class alias is used使用继承和类别名时获取顶级类名
【发布时间】:2011-06-05 20:36:25
【问题描述】:

我有一些这样扩展的类:

class Baseresidence extends CActiveRecord {
    public static function model($className=__CLASS__) {
        return parent::model($className); // framework needs, can't modify
    }    
}

class Site1Residence extends Baseresidence {

}

最后

class_alias('Site1Residence', 'Residence'); // this is part of an autoloader

所以最后我喜欢这个Residence extends Site1Residence extends Baseresidence extends CActiveRecord

在 Baseresidence 中,我有一个静态方法 model(),它检索一个实例。

现在我可以打电话了::

$r=Residence::model();

问题是__CLASS__ 常量被用作默认值,并且在该级别上是 Baseresidence,我需要顶级类名(使用别名创建),它应该是 'Residence'

如果我这样做:

echo get_class($r); // the Baseresidence is printed

目标是打印residence

我不想在调用$r=Residence::model();时传递任何东西我想在根上解决它。

如何获得该级别的顶级类名?

【问题讨论】:

  • 常量__CLASS__,在Baseresidence类中使用将始终包含Baseresidence。你不能改变它。

标签: php oop class


【解决方案1】:

试试

get_called_class();

http://php.net/manual/en/function.get-called-class.php

来自文档:

class foo {
    static public function test() {
        var_dump(get_called_class());
    }
}

class bar extends foo {
}

foo::test();
bar::test();

上面的例子会输出:

string(3) "foo"
string(3) "bar"

【讨论】:

  • 正确答案,但我注意到一条评论:// framework needs, can't modify - 如果他无法修改该行...我不确定他是否能够使用此解决方案。
  • 我之前可以更改$className 变量。这是一个很好的解决方案,对于 PHP 5.2.4,get_called_class 也有一个解决方案。 php.net/manual/en/function.get-called-class.php
  • @OZ_,我读那行的方式是,框架需要类名。传递顶级类名应该没有负面影响。
  • @Pentium10,查看该文档页面的 cmets,PHP 5.2 有该函数的替代方法
  • 另外,您可以使用static::class 代替
猜你喜欢
  • 2020-05-25
  • 2014-06-04
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多