Programing

PHP에서 언어 구조와 "내장"함수의 차이점은 무엇입니까?

lottogame 2020. 9. 5. 10:26
반응형

PHP에서 언어 구조와 "내장"함수의 차이점은 무엇입니까?


나는 알고있다 include, isset, require, print, echo, 일부 다른 기능을하지만, 언어 구조되지 않습니다.

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

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

일부는 반환 값이 있고 다른 일부는 그렇지 않습니다.

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

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


(이는 내가 의도 한 것보다 더 깁니다. 참아주세요.)

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

예를 들어, 한 자리 정수만 입력으로 받고 연산 순서를 완전히 무시하는 간단한 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남았을 때 결과를 뱉어 낼 수 있습니다 .

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

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

언어 구조가 괄호를 필요로 할 수도 있고 필요하지 않을 수도있는 이유와 일부는 반환 값을 갖는 이유와 나머지는 PHP 파서 구현의 특정 기술 세부 사항에 전적으로 의존하지 않습니다. 나는 파서가 어떻게 작동하는지 잘 알지 못하기 때문에 이러한 질문을 구체적으로 다룰 수는 없지만 다음과 같이 시작하는 언어를 잠시 상상해보십시오.

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

효과적으로,이 언어는 찾은 모든 표현을 자유롭게 사용하고 둘러싼 괄호를 제거합니다. PHP (그리고 여기서는 순수한 추측을 사용하고 있습니다)는 언어 구조에 대해 비슷한 것을 사용할 print("Hello")수 있습니다 . print "Hello"파싱되기 전으로 축소 되거나 그 반대 일 수 있습니다 (언어 정의는 괄호를 추가하고 제거 할 수 있음).

이것이 echoor 와 같은 언어 구조를 재정의 할 수없는 이유의 근원입니다 print. 이들은 파서에 효과적으로 하드 코딩되는 반면, 함수는 언어 구조 집합에 매핑되고 파서는 컴파일 또는 런타임에 해당 매핑을 다음과 같이 변경할 수 있습니다. 자신의 언어 구성 또는 표현 세트를 대체하십시오.

결국 구문과 표현식의 내부 차이점은 다음과 같습니다. 언어 구문은 파서가 이해하고 처리합니다. 내장 함수는 언어에 의해 제공되지만 구문 분석 전에 언어 구성 세트에 매핑되고 단순화됩니다.

더 많은 정보:

  • Backus-Naur 형식 , 형식 언어를 정의하는 데 사용되는 구문 (yacc는이 형식을 사용함)

편집 : 다른 답변 중 일부를 읽으면 사람들이 좋은 점을 만듭니다. 그중 :

  • 내장 된 언어는 함수보다 호출이 더 빠릅니다. 이것은 PHP 인터프리터가 파싱하기 전에 해당 함수를 해당 언어 내장 등가물에 매핑 할 필요가 없기 때문에 미미하지만 사실입니다. 그러나 현대 컴퓨터에서는 그 차이가 상당히 미미합니다.
  • A language builtin bypasses error-checking. This may or may not be true, depending on the PHP internal implementation for each builtin. It is certainly true that more often than not, functions will have more advanced error-checking and other functionality that builtins don't.
  • Language constructs can't be used as function callbacks. This is true, because a construct is not a function. They're separate entities. When you code a builtin, you're not coding a function that takes arguments - the syntax of the builtin is handled directly by the parser, and is recognized as a builtin, rather than a function. (This may be easier to understand if you consider languages with first-class functions: effectively, you can pass functions around as objects. You can't do that with builtins.)

Language constructs are provided by the language itself (like instructions like "if", "while", ...) ; hence their name.

One consequence of that is they are faster to be invoked than pre-defined or user-defined functions (or so I've heard/read several times)

I have no idea how it's done, but one thing they can do (because of being integrated directly into the langage) is "bypass" some kind of error handling mechanism. For instance, isset() can be used with non-existing variables without causing any notice, warning or error.

function test($param) {}
if (test($a)) {
    // Notice: Undefined variable: a
}

if (isset($b)) {
    // No notice
}

*Note it's not the case for the constructs of all languages.

Another difference between functions and language constructs is that some of those can be called without parenthesis, like a keyword.

For instance :

echo 'test'; // language construct => OK

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

Here too, it's not the case for all language constructs.

I suppose there is absolutely no way to "disable" a language construct because it is part of the language itself. On the other hand, lots of "built-in" PHP functions are not really built-in because they are provided by extensions such that they are always active (but not all of them)

Another difference is that language constructs can't be used as "function pointers" (I mean, callbacks, for instance) :

$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

I don't have any other idea coming to my mind right now... and I don't know much about the internals of PHP... So that'll be it right now ^^

If you don't get much answers here, maybe you could ask this to the mailing-list internals (see http://www.php.net/mailing-lists.php ), where there are many PHP core-developers ; they are the ones who would probably know about that stuff ^^

(And I'm really interested by the other answers, btw ^^ )

As a reference : list of keywords and language constructs in PHP


After wading through the code, I've found that php parses some of statements in a yacc file. So they are special cases.

(see Zend/zend_language_parser.y)

Apart from that I don't think that there are other differences.


You can override built-in functions. Keywords are forever.

참고URL : https://stackoverflow.com/questions/1180184/what-is-the-difference-between-a-language-construct-and-a-built-in-function-in

반응형