문제
function t1()
{
echo 1;
}
function t2()
{
echo 2;
}
$funcs = array(t1,t2);
$length = count($funcs);
for($i=0;$i<$length;$i++)
{
$funcs[$i]();
}
이 작은 PHP 파일을 실행할 때 :
PHP 통지 : 정의되지 않은 상수 T1의 사용 -D : jobirn test str.php에서 'T1'가정 11 행
PHP 통지 : 정의되지 않은 상수 T2의 사용 -D : jobirn test str.php에서 'T2'가정 11 행
그 통지를 어떻게 제거 할 수 있습니까? 12
해결책
PHP는 기능을 일류 객체로 취급하지 않기 때문에 통지를받습니다. 당신이 할 때
$functions = array(t1, t2);
PHP 엔진은 T1 및 T2를보고 상수로 해결하려고하지만 T1/T2라는 상수를 찾을 수 없기 때문에 배열 ( 'T1', 'T2')을 입력하려는 "가정"; var_dump ($ functions)를 수행하면 배열의 항목이 문자열임을 알 수 있습니다.
문자열을 함수로 호출하려고 할 때
$functions[0]()
PHP는 문자열과 동일한 이름의 함수를 찾습니다. 나는 이것을 함수 포인터로 문자열을 사용하는 것으로 부르지 않을 것입니다. 이것은 반사를 사용하는 것과 비슷합니다. PHP는 이것을 "가변 함수"라고 부릅니다.
http://hu2.php.net/manual/functions.variable-functions.php
따라서 통지를 제거하는 올바른 방법은 다음과 같습니다.
$functions = array('t1', 't2');
왜 그런지에 대해
't1'();
작동하지? 불행히도 대답은 없습니다. 그것은 PHP입니다.이 성가신 수는 지옥의 기발한 것들이 많이 있습니다. 그것은 다음과 같은 기발한 것입니다.
explode(':', 'one:two:three')[0];
Parse error: syntax error, unexpected '[' in php shell code on line 1
편집하다:
위에서 언급 한 배열 참조 구문은 PHP5.4에서 사용할 수 있으며 배열 Dereferencing이라고합니다.
다른 팁
$funcs = array('t1','t2');
직관적이지 않지만 그것이 작동하는 방식입니다
이 문제의 작업은 Php.ini 설정을 변경하는 것입니다.
error_reporting = E_ALL
에게
error_reporting = E_ALL & ~E_NOTICE
error_reporting () 함수를 확인하십시오.
http://us2.php.net/manual/en/function.error-reporting.php
이를 통해 어떤 수준의 오류, 통지 및 경고가 표시되는지 구성 할 수 있습니다.
예를 들어, 오류 및 경고를 원하고 알림이없는 경우 :
error_reporting (e_error | e_warning);
문자열을 사용하여 함수를 호출하려면 Curly Braces를 사용해야합니다.
'hello'() // wont work
$hello = 'hello'; $hello() // will work
편집 { ''} ()가 작동하지 않는 것 같습니다. 나는 그것이 익숙한 것을 기억합니다.