phpword — Объяснение об использовании метода сохраненного класса из другого класса в переполнении стека

Итак, я просматривал исходный код из PHPWord, я просмотрел все и не могу понять, как работает этот фрагмент кода.

class PHPWord_Shared_XMLWriter {

/**
* Internal XMLWriter
*
* @var XMLWriter
*/
private $_xmlWriter;

public function __construct($pTemporaryStorage = self::STORAGE_MEMORY, $pTemporaryStorageFolder = './') {
// Create internal XMLWriter
$this->_xmlWriter = new XMLWriter();
...
}
}

Поэтому, согласно моему пониманию php, единственный способ получить доступ к методам $ this -> _ xmlWriter — это вызвать его так:

$testClass= new PHPWord_Shared_XMLWriter();
$testClass->_xmlWriter->startDocument();

Однако в этом фрагменте кода из theDocProps.php реализована эта строка кода:

$objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY);
$objWriter->startDocument('1.0','UTF-8','yes');

Как это работает? Я не могу скопировать его, но он работает, когда я использую его в файле. ЧТОБЫ БЫТЬ ОЧИЩЕННЫМ, нет метода, определенного PHPWord_Shared_XMLWriter, который называется startDocument (). Я чувствую, что упускаю что-то действительно простое, но я даже не могу искать правильное это.

Спасибо!

0

Решение

Вам нужно посмотреть на полное определение класса PHPWord_Shared_XMLWriter (источник здесь). Он использует __call магический метод передавать вызовы метода _xmlWriter:

 /**
* Catch function calls (and pass them to internal XMLWriter)
*
* @param unknown_type $function
* @param unknown_type $args
*/
public function __call($function, $args)
{
try {
@call_user_func_array(array($this->_xmlWriter, $function), $args);
} catch (Exception $ex) {
// Do nothing!
}
}

Используя call_user_func_array на $this->_xmlWriter, это приводит к тому, что все недоступные или неопределенные методы будут переданы _xmlWriter имущество.

Из документов:

__call( unknown_type $function, unknown_type $args )
Catch function calls (and pass them to internal XMLWriter)
Parameters
$function
unknown_type
$function
$args
unknown_type
$args
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]