2012-11-22 5 views
1

이 질문에 대한 세부 사항으로 들어가기 전에 나는 이것을 한 번도 본 적이 없다는 점을 지적하고 싶습니다. 실제로이 방법을 실제로 사용할 수 있는지 궁금해합니다. 그리고 만약 그렇다면, 그것을하는 방법에 대해 가야합니다.함수에 전체 범위를 전달하는 방법이 있습니까

저는 현재 템플릿 로더에 앉아서 그것을 작성하기 위해 HAML 파일 형식을 약간 수정하고 몇 가지 논리 연산자 (주로 루프)로 확장했습니다. 그렇게 효율적으로하기 위해 필자는 템플릿 파서에 매개 변수 목록을 전달해야합니다. 가능하면이 매개 변수를 사용하지 않는 것이 좋습니다. 대안에 대한 브레인 스토밍을하는 동안 아이디어는 아마도 어쩌면 그 기능이 호출 된 범위를 참조하는 것이 가능했을 것입니다.

현재 파일 용 템플릿 파서를 다음과 같이 호출하고 있습니다. test()이 경로라고 가정합니다.

function test() { 
    $q = $UserModel->tether($userID)->fetchPermissions(); 
    Util::Templating()->parse("file.haml"); 
} 

필자가 피하려고하는 것은 두 번째 매개 변수로 대용량 배열을 전달하지 않고 $ q에 액세스 할 수 있다는 것입니다. 원래의 생각은 parse()이 자체 호출이 아니라 원래 호출 된 범위 (여기서는 test)를 상속하는 방법이있을 수 있다는 것입니다. 이것을 관리 할 수있는 방법이 있습니까? 그렇다면 효율성은 얼마나됩니까?

+2

아주 나쁜 생각 같습니다. http://php.net/manual/en/book.reflection.php에서 뭔가있을 수 있습니다. 그러나 그것은 매우 느릴 것입니다. –

+0

@E_p : 바로이게 제가 측정하려고하는 것입니다 : 이와 같은 방법의 효율성. 배열 버전의 5-10 % 이상인 경우에는 아무 것도 할 수 없습니다. 결국 편의는 편리합니다. –

+0

리플렉션에 어울리는 지 확신 할 수 없습니다. 문제의 핵심은 호출 수신자 범위를 호출 수신자 또는 호출 수신자로부터 참조하는 방법입니다. 솔직히 말해서이 작업을 신뢰할 수 있고 모호하지 않게 수행 할 방법이 없다는 것을 알고 있습니다. –

답변

4

뿐만 아니라 슈퍼 전역을 포함 :

$a = 'Hello World'; 
$b = range('A','Z'); 

$scopeVars = get_defined_vars(); 

var_dump($scopeVars); 
test($scopeVars); 


function test($scopeVars) { 
    extract($scopeVars); 

    echo '$a = '; var_dump($a); 
    echo '$b = '; var_dump($b); 
} 

편집

그냥 실험과 같이 자동 전역을 제거 :

$a = 'Hello World'; 
$b = range('A','Z'); 

$scopeVars = get_user_defined_vars(get_defined_vars()); 

test($scopeVars); 


function test($scopeVars) { 
    extract($scopeVars); 

    echo '$a = '; var_dump($a); 
    echo '$b = '; var_dump($b); 
} 

function get_user_defined_vars($vars) { 
    return array_diff_key(
     $vars, 
     array_flip(
      array('_SERVER','_GET', '_POST', '_REQUEST', '_FILES', '_COOKIE', '_ENV') 
     ) 
    ); 
} 

을하지만 슈퍼 전역을 제거 조금 느린 것 같습니다.

+0

나는 오늘 뭔가를 배웠습니다. 이것은 정확히 내가 찾던 것이 아니지만,이 질문에 대한 대답과 거의 같다고 생각합니다. –

1

그래서 속성을 설정하고 그것을 통과하는 것보다보기 개체를 만드는 것이 효과가 있다고 생각합니다. 아니면 배열 대신 객체 작업을하는 대신. 예 :

function test() { 
    $params = array(); 
    $params['var_1'] = 'qwe1'; 
    $params['var_2'] = 'qwe2'; 
    $params['var_3'] = 'qwe3'; 
    $params['var_4'] = 'qwe4'; 
    $params['q'] = $UserModel->tether($userID)->fetchPermissions(); 
    Util::Templating()->parse("file.haml", $params); 
} 
+0

이것은 가능한 해결책 중 하나로 표에 나와 있습니다. 근본적으로 매개 변수를 없앨 방법이 있는지 궁금합니다. –

+0

왜 이럴 수 있니? 추가 메모리를 사용하지 마십시오. 플러스는 해결할 문제보다 더 많은 이슈를 만듭니다. –

+0

대답은 : 사용자 편의입니다. 문제의 템플릿 엔진은 실마리가 거의없는 사람들을 대상으로합니다. 가능한 한 많은 지뢰를 제거 할 수 있는지 알아보기 위해 노력 중입니다. (또한 가치있게 전달할 생각이 없었습니다.) –

관련 문제