【问题标题】:Dynamically use different class depending on current namespace根据当前命名空间动态使用不同的类
【发布时间】:2017-08-23 02:04:51
【问题描述】:

我希望我的类继承其父类的方法,我通过扩展类来做到这一点。但我也想使用基名(没有命名空间)实例化一个类,并根据当前命名空间选择正确的类,然后如果它不存在则回退到一个“通用”类。

例子

<?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

【问题讨论】:

    标签: php namespaces yii2


    【解决方案1】:

    您是否尝试过像这样使用完整的命名空间:

    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());
    }
    

    【讨论】:

      【解决方案2】:

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

      添加组件或助手,甚至将其添加到初始类的构造中(取决于您需要使用多少):

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        相关资源
        最近更新 更多