Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 原则2获取代理类的真实类名_Php_Orm_Doctrine Orm - Fatal编程技术网

Php 原则2获取代理类的真实类名

Php 原则2获取代理类的真实类名,php,orm,doctrine-orm,Php,Orm,Doctrine Orm,以下是: 我大约有20种型号。这些类扩展了基类。这个基类包含一个方法,该方法应该能够确定子元素的类名。通常情况下,您可以使用以下方法: get_called_class(); 但在许多情况下,doctrine 2使用ProxyClass,在这种情况下,get_调用的_class()函数会返回如下结果: Proxies\BasePageElementProxy 而原始名称为\Base\PageElement。有谁能告诉我如何找到这个类的名称(而不使用字符串Proxies\BaseSection

以下是:

我大约有20种型号。这些类扩展了基类。这个基类包含一个方法,该方法应该能够确定子元素的类名。通常情况下,您可以使用以下方法:

get_called_class();
但在许多情况下,doctrine 2使用ProxyClass,在这种情况下,get_调用的_class()函数会返回如下结果:

Proxies\BasePageElementProxy

而原始名称为\Base\PageElement。有谁能告诉我如何找到这个类的名称(而不使用字符串Proxies\BaseSectionProxy生成名称,因为这是肮脏的,在许多情况下是不可靠的)。

您可以通过调用:

$em->getClassMetadata(get_called_class())->name;
但是,这需要引用EntityManager。如果您通过实体类执行静态查找器方法,您将可以通过任何方式静态/全局访问该方法,例如:

abstract class Record
{
    private static $em = null;

    static public function setEntityManager($em)
    {
        self::$em = $em;
    }

    static public function __callStatic($method, $args)
    {
        $className = self::$em->getClassMetadata(get_called_class())->name;
        return call_user_func_array(array(self::$em->getRepository($className), $method), $args);
    }
}

使用原则类“ClassUtils”

\Doctrine\Common\Util\ClassUtils::getRealClass(get_class($entity));

非常感谢你!工作起来很有魅力。说到教义,你好像成了我的私人老师+1
\doctor\Common\Util\ClassUtils::getClass($entity)
是更好的解决方案,因为最好的做法是不让实体知道管理器。如果您已经有一个对象,只需使用
getClass
\Common\Util\ClassUtils::getClass($entity)此已弃用,看起来必须更换