有关在 php 中使用来自另一个类的存储类方法的说明


Explanation about using a method of a stored class from another class in php

所以我正在查看 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!
     }
 }

通过在$this->_xmlWriter上使用call_user_func_array,它会导致所有不可访问或未定义的方法传递给 _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