2010-02-26 4 views
1

그래서 약간의 문제가 있습니다. 나는 해결책을 안다. 그러나 그것은 매우 깨끗해 보이지 않는다. 그리고 나는 더 좋은 것이 있는지 궁금하게 생각하고있다.가변 매개 변수가있는 함수를 호출하는 PHP

나는 준비된 문장을 실행하기위한 MySQLi 래퍼를 작성하고있다. 래퍼이므로 재사용 할 수 있습니다. (동적) 반환되는 열의 양은 쿼리에 따라 다르며 정적이 아닙니다.

내가 발견 한 모든 해결책은 모두가 사용하는 것으로, call_user_func_array입니다.

작동하지만 문제는 내가 처음부터 실제로는 필요하지 않은 추가 참조 배열을 생성한다는 것입니다. 예를 들어

:

<?php 

// Connect, prepare statement, etc. 

$stmt->execute(); 

$fields = $stmt->result_metadata(); 
$fields = $fields->fetch_fields(); 

foreach ($fields as $field) { 
    // Unnecessary creation of an array. 
    $params[] = &$row[$field->name]; 
} 

call_user_func_array(array($stmt, 'bind_result'), $params); 

?> 

그래서 지금은 그냥 메서드 정의를 준수하지 않기 때문에 참조로 매개 변수를 전달하는 call_user_func_array를 얻기 위해 다른 배열을 만드는거야.

call_user_func_array에 메소드/함수 정의를 따르는 방법이 있습니까? 메소드/함수를 다양한 수의 매개 변수로 호출하는 더 깨끗한 방법이 있습니까? 또는이 문제에 대한 전반적인 청소기와 더 나은 솔루션이 모두 함께 있습니까?

bind_param을 호출 할 때 비슷한 문제가 발생하면서 바인딩 된 매개 변수를 변경하고 명령문을 그대로 다시 실행하는 기능을 유지하려고합니다.

다소 문제가되는 부분에서 정확히 아래 코드가 무엇입니까?

$row[$field->name] = &$row[$field->name]; 

변수가 자체를 참조하는 방법을 정확히 알 수는 없지만 이상하게 작동하고 오류가 발생하지 않습니다. 그 배열과 다른 배열 사이에 큰 차이점이 있습니까? 더 낫니?

감사합니다.

편집 :

이 내가 call_user_fun_array 대신 반사 API를 사용하는 방법이다. 그것의 내 사용에 어떤 입력, 성능 대 call_user_func_array, 구현 등 대단히 감사하겠습니다. 저는 이전에 그다지 혼란스럽지 않았습니다. 모든 방법에 대해 문서화되지 않았으므로 사용법이 확실하지 않습니다. 내가 아는

<?php 

foreach ($fields as $field) { 
    $row[$field->name] = NULL; 
} 

$refMethod = new ReflectionMethod($stmt, 'bind_result'); 
$refMethod->invokeArgs($stmt, $row); 

?> 

답변

2

한 가지 방법은 당신이 Reflection 클래스의 isPassedByReference 방법을 사용할 수 있다는 것입니다. 답에 대한

Here is a solution i came up with after facing that issue for a framework i have had been developing.

+0

감사합니다. 'ReflectionMethod'를 사용하여 조금 놀았고'bind_result'를 호출하여 더 깨끗하게 보입니다. 나는 약간의 벤치마킹을 시도했지만 느린지 아닌지 전혀 결론을 내릴 수 없었다. _ (테스트의 가장 가능성있는 방법이었습니다) _ - 저는 Reflection 수업을 전혀 해보지 않았으며 대부분의 방법은 문서화되어 있지 않아 많은 도움이되지 않았습니다. 내가 사용한 것보다 더 나은 방법을 사용할 수 있을지 모르겠습니다. -- 감사. 그래도 다른 솔루션에 관심이 있습니다. – anomareh

+0

궁금한데, 어떤 방법이 문서화되어 있지 않은지, php.net/에서 몇 가지를 찾았습니다. 메소드는 문서화되었고 일반적으로 그들의 이름은 (최소한 게임을하기 위해) 스스로 문서화합니다. – Mathieu

+0

@mathroc 모두. 나는 일반적으로 반향을 망쳐 놓지 않았다. 그래서 PHP의 구현을 해석하기위한 것이 아니다. - 클래스에 대한 정보를 얻는 데 사용되며 메소드와 매개 변수는 여러분이 말했듯이 꽤 문서화되어 있습니다. 그것은 정확하게 나를 위해 결정체가 아닌 방법이나 다른 것들을 호출하려고 할 때 그것을 올바르게 사용하는 방법을 찾아 내려고했습니다. - 알아내는 게별로 아니 었어. 내 구현이 올바른 방법인지 확실하지 않았습니다. – anomareh

관련 문제