在Yii组件中返回对象

时间:2013-07-26 20:45:43

标签: php object yii

这对我来说很难解释,但我会尽我所能。

我开始编写一个CApplicationComponent来从DB获取配置参数。

<?php

class parameters extends CApplicationComponent
{
  public $cacheAll = false;
  public $dbConnectionId = null;
  public $applications = array();

  public function __get( $attr )
  {
    if( $this->applications && in_array($attr, $this->applications) )
    {
      if( Yii::app()->$$this->applications[$attr]['id'] )
      {
        //in work...
      }
    }
  }
}

public $applications将是这样的数组:

$arrray = array (
  'productName' => array (
    'tableName'=>'settings',
    'propertyColumn'=>'parameters',
    'valueColumn'=>'values',
   ),
);

嗯......事实是我需要或者最想要的是获得这样的属性:

Yii::app()->parameters->productName->param1

我知道Yii为类属性实现了魔法getter和setter,所以我会这样访问$applications

Yii::app()->parameters->applications

所以,我现在重写__get函数,看看请求的值是否是数组$ applications中的一个键,否则我会将它委托给Yii定义的parent::__get($attr)

如果请求的值是$ applications数组中的一个键,那么我将不得不创建一个对象,这样我就可以使用->运算符和另一个魔术setter / getter,但我真的不知道怎么样。

有更好的方法吗?有人能指出我正确的方向吗?

非常感谢

1 个答案:

答案 0 :(得分:1)

假设你的配置文件中有这个:

...

'components' => array(
  'parameters' => array(
    'class' => 'path.to.parameters.php',
    'applications' => array(
      'productName' => array(
        'tableName' => 'settings',
        'property' => 'param1'
      ),
    )
  ),
),

...

如果您希望\Yii::app()->parameters->productName->tableName返回值"settings"。然后,您的应用程序组件必须覆盖__get魔术方法,以使用$this->applications检查"productName"是否包含isset()密钥,并将该键的值作为对象而不是数组返回

应用程序组件如下所示:

<?php

namespace Sakanade;

class parameters extends \CApplicationComponent
{
  public $cacheAll = false;
  public $dbConnectionId = null;
  public $applications = array();

  public function __get($attr)
  {
    // If `$attr` is a key in `$this->applications`, return that
    if (is_array($this->applications) && isset($this->applications[$attr])) {
      // Convert to an object
      return (object) $this->applications[$attr];
    }

    // Return the default implementation by CApplicationComponent
    return parent::__get($attr);
  }
}

我把它放在一个控制器中测试了这个:

$tableName = \Yii::app()->parameters->productName->tableName;
print_r($tableName); // prints "settings"

组件中已存在的其他属性可以正常访问:

var_dump(\Yii::app()->parameters->cacheAll);       // false
var_dump(\Yii::app()->parameters->dbConnectionId); // null