복붙노트

PHP에서 언어 구성과 "내장"기능의 차이점은 무엇입니까?

PHP

PHP에서 언어 구성과 "내장"기능의 차이점은 무엇입니까?

나는 include, isset, require, print, echo를 알고 있고 어떤 것은 함수가 아니라 언어 구조이다.

이러한 언어 구조 중 일부는 괄호가 필요하고 다른 언어는 필요하지 않습니다.

require 'file.php';
isset($x);

일부는 수익 가치가 있고 다른 일부는 그렇지 않습니다.

print 'foo'; //1
echo  'foo'; //no return value

그렇다면 언어 구조와 내장 함수의 내부적 차이점은 무엇입니까?

해결법

  1. ==============================

    1.(이것은 내가 의도 한 것보다 길며 나와 함께 견뎌야한다.)

    (이것은 내가 의도 한 것보다 길며 나와 함께 견뎌야한다.)

    대부분의 언어는 "구문"이라고 불리는 것으로 구성되어 있습니다. 언어는 여러 가지 잘 정의 된 키워드로 구성되어 있으며 해당 언어로 작성할 수있는 표현식의 전체 범위는 해당 구문에서 구성됩니다.

    예를 들어, 한 자리 숫자의 정수 만 입력으로 사용하고 작업 순서를 완전히 무시하는 간단한 4 함수 산술 "언어"가 있다고 가정 해 봅시다 (간단한 언어라고 말했 슴). 이 언어는 다음 구문으로 정의 할 수 있습니다.

    // The | means "or" and the := represents definition
    $expression := $number | $expression $operator $expression
    $number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
    $operator := + | - | * | /

    이 세 가지 규칙에서 임의의 수의 단일 숫자 입력 산술 식을 작성할 수 있습니다. 그런 다음 유효한 입력을 해당 구성 요소 유형 ($ expression, $ number 또는 $ operator)으로 구분하고 결과를 처리하는 구문 구문 분석기를 작성할 수 있습니다. 예를 들어, 표현식 3 + 4 * 5는 다음과 같이 나눌 수 있습니다.

    // Parentheses used for ease of explanation; they have no true syntactical meaning
    $expression = 3 + 4 * 5
                = $expression $operator (4 * 5) // Expand into $exp $op $exp
                = $number $operator $expression // Rewrite: $exp -> $num
                = $number $operator $expression $operator $expression // Expand again
                = $number $operator $number $operator $number // Rewrite again

    이제 우리는 정의 된 언어로 원래 구문에 대해 완전히 구문 분석 된 구문을 사용합니다. 이것을 가지고 파서를 작성하여 $ number $ operator $ number의 모든 조합의 결과를 찾아서 하나의 $ number 만 남았을 때 결과를 내뱉을 수 있습니다.

    원래 식의 마지막 구문 분석 된 버전에는 $ 표현식 구문이 남아 있지 않습니다. 왜냐하면 $ 표현식은 항상 우리 언어로 된 다른 것들의 조합으로 축소 될 수 있기 때문입니다.

    PHP는 거의 동일합니다. 언어 구조는 $ number 또는 $ 연산자와 동일하게 인식됩니다. 그것들은 다른 언어 구조로 축소 될 수 없습니다. 대신 언어가 구축되는 기본 단위입니다. 함수와 언어 구문의 주요 차이점은 다음과 같습니다. 파서는 언어 구문을 직접 처리합니다. 함수를 언어 구조로 단순화합니다.

    언어 구조가 괄호를 필요로하거나 그렇지 않을 수도있는 이유는 일부는 반환 값을 가지지 만 다른 것은 반환 값을 갖지 않는 이유는 PHP 파서 구현의 구체적인 기술적 세부 사항에 전적으로 의존합니다. 필자는 파서가 어떻게 작동하는지 잘 알고 있지 않으므로 특별히 질문 할 수는 없지만 다음으로 시작하는 언어를 상상해보십시오.

    $expression := ($expression) | ...

    효과적으로이 언어는 발견 된 표현식을 자유롭게 가져 와서 주변 괄호를 제거합니다. PHP (그리고 여기 순수한 추측을 사용하고 있습니다.) print ( "Hello")는 구문 분석 전에 "Hello"를 출력하기 위해 축소 될 수 있고, 그 반대의 경우도 있습니다 (언어 정의에 괄호를 추가 할 수 있습니다. 잘 그들을 제거하십시오).

    이것은 echo 나 print와 같은 언어 구조를 재정의 할 수없는 이유의 근원입니다. 함수는 파서에 효과적으로 하드 코딩되지만 함수는 언어 구문 세트에 매핑되고 파서는 컴파일 또는 편집시 해당 매핑을 변경할 수 있습니다 런타임을 사용하여 자신의 언어 구문 또는 표현식 집합을 대체 할 수 있습니다.

    결국 구문과 구문의 내부적 인 차이점은 다음과 같습니다. 언어 구문을 이해하고 파서가 처리합니다. 언어가 제공하는 내장 함수는 구문 분석하기 전에 언어 구성 집합으로 매핑되고 단순화됩니다.

    더 많은 정보:

    편집 : 다른 답변을 통해 읽기, 사람들은 좋은 지적을합니다. 그중 :

  2. ==============================

    2.언어 구조는 언어 자체에서 제공됩니다 (예 : "if", "while", ...); 그러므로 그들의 이름.

    언어 구조는 언어 자체에서 제공됩니다 (예 : "if", "while", ...); 그러므로 그들의 이름.

    그 결과로 사전 정의 된 함수 나 사용자 정의 함수보다 호출 속도가 빠릅니다 (또는 여러 번 듣고 읽었습니다)

    나는 그것이 어떻게 끝났는지 전혀 모른다. 그러나 그들이 할 수있는 한 가지는 (직접적으로 langage에 통합되기 때문에) 어떤 종류의 에러 처리 메카니즘을 우회하는 것이다. 예를 들어, isset ()은 통지, 경고 또는 오류를 발생시키지 않고 존재하지 않는 변수와 함께 사용될 수 있습니다.

    function test($param) {}
    if (test($a)) {
        // Notice: Undefined variable: a
    }
    
    if (isset($b)) {
        // No notice
    }
    

    * 모든 언어의 구문에는 해당되지 않습니다.

    함수와 언어 구조의 또 다른 차이점은 키워드 중 일부처럼 괄호없이 호출 할 수 있다는 것입니다.

    예를 들면 :

    echo 'test'; // language construct => OK
    
    function my_function($param) {}
    my_function 'test'; // function => Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
    

    여기에서도 모든 언어 구문에 해당하는 것은 아닙니다.

    언어 자체의 일부이기 때문에 언어 구조를 "비활성화"할 수있는 방법이 전혀 없다고 생각합니다. 반면, 많은 "기본 제공"PHP 함수는 확장 기능에 의해 제공되므로 항상 활성화되어 있지만 (전부는 아니지만) 기본적으로 내장되어 있지 않습니다.

    또 다른 차이점은 언어 구조를 "함수 포인터"(예 : 콜백)로 사용할 수 없다는 것입니다.

    $a = array(10, 20);
    
    function test($param) {echo $param . '<br />';}
    array_map('test', $a);  // OK (function)
    
    array_map('echo', $a);  // Warning: array_map() expects parameter 1 to be a valid callback, function 'echo' not found or invalid function name
    

    나는 지금 당장 내 생각에 떠오르는 아이디어가 없다 ... PHP의 내부 구조에 대해 많이 알지는 못한다. 그래서 지금 당장있을 것이다. ^^

    여기에 많은 답변을 얻지 못했다면 PHP 코어 개발자가 많은 메일 링리스트 내부 (http://www.php.net/mailing-lists.php 참조)에이 질문을 할 수 있습니다. 그들은 아마 그 물건에 대해 알고있을 것입니다 ^^

    (그리고 저는 다른 답변들에 정말 관심이 있습니다, ^^)

    참고 자료 : PHP의 키워드 및 언어 구문 목록

  3. ==============================

    3.코드를 넘어서서, 나는 php가 yacc 파일의 문장을 분석한다는 것을 발견했다. 그래서 그들은 특별한 경우입니다.

    코드를 넘어서서, 나는 php가 yacc 파일의 문장을 분석한다는 것을 발견했다. 그래서 그들은 특별한 경우입니다.

    (Zend / zend_language_parser.y 참조)

    그 외에도 나는 다른 차이점이 있다고 생각하지 않습니다.

  4. ==============================

    4.내장 함수를 재정의 할 수 있습니다. 키워드는 영원합니다.

    내장 함수를 재정의 할 수 있습니다. 키워드는 영원합니다.

  5. from https://stackoverflow.com/questions/1180184/what-is-the-difference-between-a-language-construct-and-a-built-in-function-in by cc-by-sa and MIT license