PHP __get重载返回数组而不是对象

时间:2011-11-08 23:03:52

标签: php arrays oop

为什么这会返回数组而不是对象?如何返回对象?

Class MyClass {
    private $filename = '...';
    private $_ini_array;

    public function __construct() {
        // Get the config file data
        $ini_array = parse_ini_file( $filename, true );
        $this->_ini_array = $ini_array;
    }

    public function __get( $param ) {
        return $this->_ini_array[ $param ];
    }
}

呼叫......

$c = new MyClass();
var_dump( $c->db_pgsql );

...返回

array(6) {
  ["data"]=>
  string(4) "test"
  ...

并按...投射

return (object) $this->_ini_array;

...返回

object(stdClass)#2 (6) {
  ["data"]=>
  string(4) "test"
  ...

虽然我想回来......

object(MyClass)#2 (6) {
  ["data"]=>
  string(4) "test"
  ...

非常感谢!

更新。解决。

我最后写了下面的课程,几乎完成了我的目标。如果您发现任何不良习惯,草率代码等,请发表评论

class Config {
    private $config_filename = '../include/config.ini';


    public function __construct( array $array=null ){
        if ( $array ) {
            foreach ( $array as $key => $val ) {
                $this->$key = $val;
            }
        } else {
            $ini_array = parse_ini_file( $this->config_filename, true );

            foreach( $ini_array as $key => $val ){
                $this->$key = new self( $val );
            }
        }
    }


    public function __get( $param ) {
        return $this->$param;
    }
}

使用我的特定测试配置文件生成一个看起来像......的对象

VarDump: object(Config)#1 (3) {
    ["config_filename:private"]=>
    string(21) "../include/config.ini"
    ["heading1"]=>
    object(Config)#2 (3) {
        ["config_filename:private"]=>
        string(21) "../include/config.ini"
        ["str1"]=>
        string(4) "test"
        ["str2"]=>
        string(5) "test2"
    }
    ["heading2"]=>
    object(Config)#3 (2) {
        ["config_filename:private"]=>
        string(21) "../include/config.ini"
        ["str1"]=>
        string(9) "testagain"
    }
}

我宁愿不像它那样以递归方式复制[“config_filename:private”]属性。但是,我无法想象它的方法。因此,如果您知道一种解决方法,那么我会感谢您的评论。

感谢所有帮助,让我朝着正确的方向前进。

2 个答案:

答案 0 :(得分:2)

  

为什么这会返回数组而不是对象[...]

我唯一看到设置$this->_ini_array的是parse_ini_file的返回值,它返回数组(数组数组)。

  

如何归还对象?

您需要遍历相关数组并手动填充对象。

答案 1 :(得分:0)

根据您的代码,您正在解析ini文件,然后返回结果数组的元素。根据你的调用代码,你期望使用'db_pgsql'作为键返回一些值,这将是一个字符串。

如果你想要一个对象,你必须实例化一个对象,然后返回它,如:

class Bar
{
}

class Foo
{

    public function __get($param)
    {
        return new $param();
    }
}

$foo = new Foo();
var_dump($foo->Bar);