0

因此,我正在查看 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() 的方法。我觉得我错过了一些非常简单的东西,但我什至无法正确搜索它。

谢谢!

4

1 回答 1

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_arrayon $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
于 2015-01-17T23:35:46.140 回答