Итак, я просматривал исходный код из 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 (). Я чувствую, что упускаю что-то действительно простое, но я даже не могу искать правильное это.
Спасибо!
Вам нужно посмотреть на полное определение класса 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
Других решений пока нет …