2015-01-17 2 views
0

그래서 PHPWord에서 소스 코드를 검토 중이었고이 코드 스 니펫이 어떻게 작동하는지 알아낼 수 없었습니다.PHP의 다른 클래스에서 저장된 클래스의 메서드 사용에 대한 설명

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에 대한 이해 이것을 $에 액세스 할 수있는 유일한 방법에 따라 -> _ 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

'$ _xmlWriter'는 해당 클래스 외부에서 직접 액세스 할 수 없습니다 의미, 개인 변수, 그래서 당신이 설명하는 방법을 액세스 할 수 없습니다. 'startDocument'는'PHPWord_Shared_XMLWriter' 클래스의 public 메쏘드 일 뿐이므로, 그렇게 사용할 수 있습니다. – edwardmp

+0

@edwardmp 사실, '__call' 마법 메서드를 사용하여 이러한 메서드를 사용할 수 있습니다. 그렇지 않으면 귀하의 의견이 정확합니다. –

+0

@EdCottrell은 출처를 보지 않았습니다. 단지 추측이었습니다. 실제로 마술 방법은이 방법을 '창조'합니다. – edwardmp

답변

0

the entire definition of the class PHPWord_Shared_XMLWriter (source here)을 볼 필요가 있습니다. 이 방법은 호출 _xmlWriter 전달할 __call magic method를 사용 $this->_xmlWritercall_user_func_array 사용함으로써

/** 
    * 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! 
    } 
} 

, 그것이 모든 액세스 불확정 방법은 _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

와우 감사합니다. 에드! 나는 그 기능을 매번 간과했다고 믿을 수 없다. – hanseltime

+0

도와 줘서 기쁩니다! 왼쪽의 체크 표시를 사용하여 답을 수락하십시오. :) –