2009-04-08 2 views
2

PHP에서 함수를로드 할 수 있습니까? 예를 들어 클래스에 포함 할 외부 파일에서 함수를로드 할 수 있습니까? 어떤 도움외부 파일로부터 클래스에 동적으로 함수를로드하십시오.

$registry->helper->function(); 

감사 :

$registry->helper->load('external_helper_function_file'); 

을이 같은 파일에있는 함수를 호출 할 수 있어야 그 후 : 은 내가 부를 수 있도록 도우미 기능을위한 로더를 만들려고 해요

+0

$ registry는 전역 액세스를위한 함수 및 변수를 저장하는 클래스입니다. – saint

답변

7

의 나쁜 관행 모두가 그 좋은 OOP 설계의 의견을 따로 설정. 현재 버전의 PHP에서도 가능하지만 PHP5.3과 마찬가지로 깨끗하지는 않습니다.

class Helper { 
    /* ... */ 
    function load($file) { 
     include_once($file); 
    } 
    function __call($functionName, $args) { 
     if(function_exists($functionName)) 
     return call_user_func_array($functionName, $args); 
    } 

} 
+1

call_user_func_array()를 사용하고자 할 수 있습니다. 예를 들어, 함수는 하나의 배열 인수 –

+0

@tomhaigh : right에있는 모든 인수를 전달합니다. – vartec

+0

정확히 내가 무엇을 찾고 있었는지 – saint

0

그럼 include 파일이 아니라 객체 범위에 include 파일을 넣으시겠습니까?

...

난 당신이 잘못된 방향으로 이것에 대해려고 생각합니다. registry 개체에 자체적 인 기능을 가진 일련의 도우미 구성원이있는 경우 더 적합합니다. 최종 결과가 같은 것을 볼 수 있습니다

$registry->aHelper->aFunction(); 
$registry->aDifferentHelper->aDifferentFunction(); 

{} 구문의주의 깊은 사용으로을, 당신은 동적으로 신 개체에 구성원 개체를 추가 할 수 있어야합니다.

이 시점에서 god object은 거의 변함없이 anti-pattern입니다. 이러한 기능이 전역 적으로 필요한 경우 부트 스트랩 핑 포함 기술을 사용하고 전역 범위에 넣습니다. 해당 데이터를 전달해야하는 경우 필요에 따라 함수에 전달하거나 데이터베이스에 저장하고 다른 곳에서 검색하십시오.

저는 하나님 객체 인 이 실제로는 인 것으로 알고 있지만 좋은 생각 인 것처럼 보입니다.하지만 나는 나중에 사물을 뒤죽박죽시킬 것이라고 약속드립니다.

+0

입력 해 주셔서 감사합니다. 이러한 헬퍼 함수는 항상 증가 할 수 있습니다. 그래서 필요할 때만로드하기를 원합니다. 누군가가 올바른 방향을 가리킬 수 있다면 좋을 것입니다. CI 도우미와 같은 것 – saint

+0

CodeIgniter 코드베이스를 열면 어떻게 될까요? 그것이 당신의 아이디어 모델이라면, 그것은 좋은 출발점처럼 들립니다. – Kalium

2

오케이, 1 번, 나는 이것이 나쁜 매너라는 데 동의합니다. 또한 5.3에서 연산자를 함수 (JS 스타일)로 사용하기 위해 __call 매직 워드와 함께 새로운 클로저 구문을 사용할 수 있습니다.

지금이 방법을 제공하려면 create_fnuction을 __call 매직과 혼합하여 사용하는 것이 좋습니다.

기본적으로 정규식 패턴을 사용하여 함수를 호환 가능한 문자열로 변환하고 themin을 비공개 멤버로 설정합니다. __call 메서드를 사용하여 가져 오는 것보다 낫습니다. 나는 작은 데모를 만들고있다.

괜찮습니다. 다음은 클래스입니다.

/** 
* supplies an interface with which you can load external functions into an existing object 
* 
* the functions supplied to this class will recive the classes referance as a first argument, and as 
* a second argument they will recive an array of supplied arguments. 
* 
* @author arieh glazer <[email protected]> 
* @license MIT like 
*/ 
class Function_Loader{ 
    /** 
    * @param array holder of genarated functions 
    * @access protected 
    */ 
    protected $_funcs = array(); 

    /** 
    * loads functions for an external file into the object 
    * 
    * a note- the file must not contain php tags. 
    * 
    * @param string $source a file's loaction 
    * 
    * @access public 
    */ 
    public function load($source){ 
     $ptrn = '/function[\s]+([a-zA-Z0-9_-]*)[\s]*\((.*)\)[\s]*{([\w\s\D]+)}[\s]*/iU'; 
     $source = file_get_contents($source); 
     preg_match_all($ptrn,$source,$matches); 
     $names = $matches[1]; 
     $vars = $matches[2]; 
     $funcs = $matches[3]; 
     for ($i=0,$l=count($names);$i<$l;$i++){ 
      $this->_funcs[$names[$i]] = create_function($vars[$i],$funcs[$i]); 
     } 
    } 

    public function __call($name,$args){ 
     if (isset($this->_funcs[$name])) $this->_funcs[$name]($this,$args); 
     else throw new Exception("No Such Method $name"); 
    } 
} 

limitations- 1 일, 소스가 어떤 PHP 태그를 가질 수 없습니다 : 내가 JS 스타일의 객체를 구현하는 클로저를 사용 내가 몇 주 전에 본 클래스에서 영감을 얻었다. 둘째, 기능은 항상 공개됩니다. 셋째, 우리는 $ this를 모방 할 수 있습니다. 내가 한 일은 1 인자 $ this로 전달하는 것이고, 두 번째 인자는 인자 배열 (4 번째 제한)이다. 또한 수업 내에서 비공개 멤버 및 메서드에 액세스 할 수 없습니다. 소스 파일에 대한 예 :

function a($self,$arr=array()){ 
    //assuming the object has a member called str 
    echo $self->str; 
} 

이 나에게 재미있는 운동을했지만, 모든

관련 문제