Перегрузка PHP __get возвращает массив вместо объекта - PullRequest
1 голос
/ 09 ноября 2011

Почему это возвращает массив вместо объекта и как я могу вернуть объект?

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 ]

2 голосов
/ 09 ноября 2011

Почему это возвращает массив вместо объекта [...]

Единственное, что я вижу, установка $this->_ini_array - это возвращаемое значение parse_ini_file, которое возвращает массив (массив массивов).

как мне вернуть объект?

Вам нужно будет выполнить итерацию по соответствующему массивуи заполните объект вручную.

0 голосов
/ 09 ноября 2011

Согласно вашему коду вы анализируете INI-файл, а затем возвращаете элемент полученного массива.Согласно вашему вызывающему коду, вы ожидаете, что какое-то значение будет возвращено с использованием 'db_pgsql' в качестве ключа, который будет строкой.

Если вам нужен объект, вам нужно создать экземпляр объекта, а затем вернуть его, что-токак:

class Bar
{
}

class Foo
{

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

$foo = new Foo();
var_dump($foo->Bar);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...