Возврат объекта SimpleXML в конструктор класса - почему он не работает? - PullRequest
1 голос
/ 14 ноября 2010

Эй, у меня есть небольшой тестовый набор, настроенный следующим образом:

class T {
    public function __construct(){
        $obj = new SimpleXMLElement(file_get_contents('vote.xml'));
        return $obj;
    }
}

$vv=new T;
var_dump($vv);

Дамп $vv равен, в данном случае, object(T)#1 (0) { } - другими словами, не ожидаемый результат

Когда я возвращаю объект в отдельной функции, как здесь:

class T {
    public function stackOverflow(){
        $obj = new SimpleXMLElement(file_get_contents('vote.xml')); // or simplexml_load_file
        return $obj;
    }
}

$vv=new T;
$vv = $vv->stackOverflow();
var_dump($vv);
Вывод

соответствует ожидаемому (объект, содержащий содержимое элемента «voice.xml», теги и атрибуты). Почему я не могу вернуть объект внутри конструктора? Спасибо!

1 Ответ

3 голосов
/ 14 ноября 2010

Конструктор будет только когда-либо возвращать ссылку на вновь созданный объект. Это сделано намеренно - как еще получить ссылку на новый объект?

Однако вы можете создать свойство объекта в конструкторе и затем получить к нему доступ извне. Это будет означать, что вы создадите объект во время процесса конструктора, так что это будет сделано в нужное время и, более того, гарантированно будет выполнено.

class T {
    public $sxml;

    public function __construct(){
        $this->sxml = new SimpleXMLElement(file_get_contents('vote.xml'));
    }
}

$vv=new T;
var_dump($vv->sxml);

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

class T {
    public static function sxml() {
        return new SimpleXMLElement(file_get_contents('vote.xml'));
    }
}
...