programing

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

copysource 2022. 12. 10. 14: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 := + | - | * | /

이들 3가지 규칙에서 임의의 수의 1자리 입력 산술식을 작성할 수 있습니다. 다음 하는 이 할 수 .$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 한 때 를 뱉어냅니다.$numberleftdevel..devel.devel.

「 」는 없는 해 주세요.$expression원래 표현식의 최종 해석 버전에 남아 있는 구성입니다.그 이유는$expression우리 언어에서는 항상 다른 것들의 조합으로 귀결될 수 있습니다.

는 PHP와 됩니다.$number ★★★★★★★★★★★★★★★★★」$operator다른 언어 구성체로 축소할 수 없습니다.대신 언어를 구축하는 기본 단위입니다.함수와 언어구조의 주요 차이점은 파서가 언어구조를 직접 다룬다는 것입니다.기능을 언어 구조로 단순화합니다.

언어구조에 괄호가 필요하거나 필요하지 않은 이유와 반환값이 있는 이유와 반환값이 없는 이유는 전적으로 PHP 파서 구현의 특정 기술적 세부사항에 달려 있습니다.파서의 동작에 대해서는 잘 모르기 때문에, 이러한 질문에 대해서는 구체적으로 말할 수 없습니다만, 여기서 시작하는 언어를 잠시 상상해 주세요.

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

사실상, 이 언어는 발견된 어떤 표현도 자유롭게 사용할 수 있고 괄호를 제거할 수 있습니다.PHP추측을 는에 PHP(PHP)를 할 수 .print("Hello")print "Hello"(언어 정의에서는 괄호를 추가하거나 제거할 수 있습니다) 구문 분석 전 또는 그 반대입니다.

수 입니다.echo ★★★★★★★★★★★★★★★★★」print 함수는 시 시 해당 할 수 그것들은 효과적으로 파서에 하드코드 되어 있는 반면 함수는 일련의 언어구조에 매핑되어 있습니다.파서는 컴파일 시 또는 실행 시 자신의 언어구조나 표현식을 대체하기 위해 매핑을 변경할 수 있습니다.

결국 구문과 표현식의 내부 차이는 다음과 같습니다. 언어 구조는 파서에 의해 이해되고 처리됩니다.임베디드 함수는 언어에 의해 제공되지만 해석하기 전에 일련의 언어 구성에 매핑되고 단순해집니다.

상세 정보:

  • Backus-Naur 형식: 정식 언어를 정의하기 위해 사용되는 구문(yacc는 이 형식을 사용합니다)

편집: 다른 답변들을 읽어보면 사람들은 좋은 점을 지적합니다.그 중:

  • 내장된 언어는 함수보다 호출이 더 빠릅니다.PHP 인터프리터는 해석하기 전에 해당 함수를 해당 언어에 내장된 동등한 기능에 매핑할 필요가 없기 때문에 극히 일부만 해당됩니다.그러나 현대의 기계에서는 그 차이는 무시할 수 있습니다.
  • 내장 언어에서는 에러 체크를 바이패스합니다.이것은, 각 빌트인의 PHP 내부 실장에 의해서, 사실이 될 수도 있고 아닐 수도 있습니다.대부분의 경우 함수는 고급 오류 검사와 내장되지 않은 다른 기능을 가지고 있습니다.
  • 언어 구문을 함수 콜백으로 사용할 수 없습니다.구성이 함수가 아니기 때문에 이는 사실입니다.그들은 별개의 실체입니다.빌트인을 코드화할 때 인수를 사용하는 함수를 코드화하는 것이 아닙니다. 빌트인의 구문은 파서에 의해 직접 처리되며 함수가 아닌 빌트인으로 인식됩니다.(일류 함수를 가진 언어를 생각하면 이해하기 쉬울 수 있습니다.실제로 함수를 오브젝트로 전달할 수 있습니다.이것은 빌트인에서는 할 수 없습니다).

언어 구조는 언어 자체에 의해 제공됩니다(예: "if", "while", "..." 등). 따라서 그 이름은 다음과 같습니다.

그 결과, 미리 정의된 기능이나 사용자 정의 기능보다 기동 속도가 빨라집니다(또는 여러 번 듣고 읽었습니다).

어떻게 동작하는지는 모르겠지만, (언어에 직접 통합되어 있기 때문에) 그들이 할 수 있는 것은 일종의 에러 처리 메커니즘을 우회하는 것입니다.예를 들어, 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의 내부 기능에 대해서는 잘 모릅니다.이제 그만 ^^

여기서 많은 답변을 얻지 못하면 메일링 리스트 내부(http://www.php.net/mailing-lists.php 참조)에 문의해 보십시오. PHP 핵심 개발자가 많이 있습니다. 이 정보를 알고 있을 것입니다. ^^

(그리고 나는 다른 대답에 매우 흥미가 있어, btw ^^ )

참조: PHP의 키워드언어 구성 목록

코드를 살펴본 결과, php가 yacc 파일의 일부 문장을 해석하는 것을 발견했습니다.그래서 그들은 특별한 경우입니다.

(Zend/zend_language_parser 참조).y)

그것 말고는 다른 차이는 없다고 생각합니다.

기본 제공 기능을 재정의할 수 있습니다.키워드는 영원합니다.

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

반응형