2013-03-11 3 views
12

PHP 엔진에 의한 함수 선언 해석 순서가 궁금합니다. 내가 왜 somethimes PHP는 정의되지 않은 함수 치명적인 오류 및 somethimes 통역사 문제없이 전화를 보여줍니다 모르겠어요.PHP 워크 플로 - 함수 실행 순서

의 내 코드는 가정하자 :

echo theRest(4,3); 

function theRest($a, $b) 
{ 
    return $a % $b; 
} 

는 함수가 호출 한 후에 선언을 참조하십시오이 적절한 작동합니다. 해석하기 전에 PHP가 전체 파일을 읽는다는 뜻입니까?

또 다른 예 : 내가 치명적인 오류가있어 여기에

function theRest($a, $b) 
{ 
    return $a % $b; 
} 

echo theRest(4,3); 

include('test2.php'); 

test2.php : 정의되지 않은 함수 theRest()를 호출합니다. 왜 그런가요?

+0

. (1 개있어) 누군가가 대답을 줄 수 있기를 바랍니다. –

+0

이것 [질문] (http://stackoverflow.com/questions/5762017/php-include-not-working-function-function-not-being-included)에서보세요 비슷한 문제가 될 수 있습니까? 그리고, 그런데, PHP는'include ('test2.php');'행 - 그 이전에 함수를 넣었습니까? 알다시피, 그냥 사용해보십시오 :) –

+0

이것은 [YourLanguageSucks] (https://wiki.theory.org/YourLanguageSucks#PHP_sucks_because :) 위키 페이지 –

답변

6

means that PHP is reading whole file before interpretation?

예, PHP는 한 번에 하나의 파일을 구문 분석합니다. 그리고 "include"는 컴파일 타임에 발생하는 것이 아니라 성명서입니다. 그래서 포함 된 파일은 include 라인에 도달하자마자 파싱됩니다. 한편, 함수 정의는 명령문이 아니며 제어 구조 내에있을 때을 제외한 컴파일시 을 처리합니다.

if (!function_exists('ucwords')) { function ucwords($str) { //... } } 

그래서 를 구문 분석 된 파일의 모든 기능과 클래스 정의 제어 구조가 즉시 사용할 수의 외부에있는 다음 작품을하는 이유입니다. 이 코드에서

7

PHP는 파일을 읽을 때 바이트 코드 (컴파일 타임)로 컴파일 한 다음 실행합니다 (실행 시간/런타임).

무조건 함수 선언은 컴파일 타임에 읽혀 코드가 실행될 때 함수를 이미 알 수 있도록합니다.

반면에 포함은 실행 시간에 실행되므로 include() 자체가 실행되기 전에 포함 파일에 정의 된 함수를 사용할 수 없습니다. 인수는 동적 일 수 (예 : include $path_to_file;) 코드에 따라 수정 될 수있는 include_path 설정에 따라 달라 지므로 포함시 컴파일을 수행 할 수 없습니다.

The documentation 그것에 대해 매우 분명하다

Functions need not be defined before they are referenced, except when a function is conditionally defined as shown in the two examples below.

include()를 사용하여, 함수는 조건 (예를 들어, include "foo.php"; 하나 개의 파일 또는 include_path 설정에 따라 다른를 포함 할 수 있습니다) 정의 사실상이다.

+0

에 언급되었습니다. 감사합니다. 나는 그것이 내가 존재하지 않는 처리 시간을 짜내기 위해 더 이상 "무조건 부과 (unconditional)"기능을 조건문의 외부와 외부로 이동시키지 않을 것이라는 것을 의미한다. –

0

: 전체 먼저 컴파일됩니다 다음 코드를 실행

echo theRest(4,3); 

function theRest($a, $b) 
{ 
    return $a % $b; 
} 

. 그러나,이 코드 :

echo theRest(4,3); 

include('test2.php'); 

include 문 자체

컴파일하지만 코드가 실행의 그 지점에 도달 할 때까지 실행되지 않습니다.이 수정 사항을 참조 때

지점 이전 include 배치 그것은 : 첫 번째는 내 컴퓨터에서 작업을했기 때문에 내 이전 게시물을 삭제

include('test2.php'); 

echo theRest(4,3);