根据当前命名空间动态使用不同的类

时间:2017-03-29 14:09:50

标签: php namespaces yii2

我希望我的班级继承其父级的方法,我通过扩展课程来完成这项工作。但我还想使用basename(没有命名空间)实例化一个类,并使用正确的类进行实例化,根据当前的命名空间进行选择,然后再回到“常见”状态。如果它不存在,则为class。

例如

<?php

namespace common\models {


    class Account extends Model{}
    class Orders extends Model{}

    class Customer extends Model{

        use common\models\Account;

        public static function getAccountClass(){
            echo get_class(new Account());
        }
        public static function getOrdersClass(){
            echo get_class(new Order());
        }
    }
}


namespace frontend\models {

    class Account extends common\models\Account {}

    class Customer extends common\models\customer {

    }
}

我希望common\models\Customer::getAccountClass()输出common\models\Account

frontend\models\Customer::getAccountClass()输出frontend\models\Account

但由于frontend\models\Orders不存在,frontend\models\Customer::getOrdersClass()仍会输出common\models\Orders

2 个答案:

答案 0 :(得分:0)

您是否尝试使用完整名称空间:

use common\models\Account as A2;
public static function getAccountClass(){
     echo get_class(new A2());
}

public static function getAccountClass(){
    echo get_class(new common\models\Account());
}

答案 1 :(得分:0)

没有“正确”的方法来解决它。但是你可以做这样的事情

添加组件或帮助程序,甚至将其添加到初始类的构造中(取决于您需要使用它的程度):

public static function getClass($class)
{
    if (class_exists('frontend' . '\\' . $class)) {
        return frontend . '\\' . $class;
    } else  {
        return $class;
    }
}

然后你就可以做这样的事了

public static function getAccountClass(){
    return self::getClass(Account::class);
}