PHP 소스 코드 12에 대한 간략한 토론: return_value 반환 값에 대하여

不言
풀어 주다: 2023-04-01 22:06:01
원래의
2004명이 탐색했습니다.

이 글은 주로 PHP 소스 코드 12에 대한 간략한 논의를 소개합니다: return_value에 대해 반환 값에는 특정 참조 값이 있습니다. 이제 필요한 친구들이 참조할 수 있도록 공유합니다.

한동안은 PHP를 알고 있습니다. 확장 함수에서 PHP_FUNCTION을 사용하고 이 함수의 값을 반환하려면 return_value에 값을 할당하면 됩니다.
그때 제가 직접 코드를 추적해 보니 return_value 같은 전역 변수나 return_value가 포함된 전역 해시 테이블이 있는 줄 알았어요. 그러다가 계속 디버깅했는데 발견하지 못했어요.
오늘 Niao 형제에게 물어보기 전까지는 깨닫지 못했습니다. Niao 형제는 이메일에서 다음과 같이 말했습니다. "return_value는 매크로로 확장된 PHP_FUCTION 함수를 제공하는 PHP의 매개변수입니다. 이 매개변수를 복사하면 ZE는 프런트엔드 호출 스크립트에 값을 반환합니다."

The 매크로 정의는 다음과 같습니다.

 #define PHP_FUNCTION ZEND_FUNCTION#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC
로그인 후 복사

일부 내장 함수(각각)는 ZEND_FUNCTION을 직접 사용합니다.
확장 함수는 PHP_FUNCTION을 사용합니다.

일부 확장 함수에서는 return_value를 사용하지 않고 return_value가 포함된 일부 매크로를 사용하는 경우가 종종 있습니다. 대신에.
공통 매크로는 다음과 같습니다.

  //    zend_API.h    500行开始
  #define ZVAL_FALSE(z)   ZVAL_BOOL(z, 0)#define ZVAL_TRUE(z)   ZVAL_BOOL(z, 1) 
  #define RETVAL_RESOURCE(l) ZVAL_RESOURCE(return_value, l)
  #define RETVAL_BOOL(b) ZVAL_BOOL(return_value, b)
  #define RETVAL_NULL() ZVAL_NULL(return_value)
  #define RETVAL_LONG(l) ZVAL_LONG(return_value, l)
  #define RETVAL_DOUBLE(d) ZVAL_DOUBLE(return_value, d)
  #define RETVAL_STRING(s, duplicate) ZVAL_STRING(return_value, s, duplicate)
  #define RETVAL_STRINGL(s, l, duplicate) ZVAL_STRINGL(return_value, s, l, duplicate)
  #define RETVAL_EMPTY_STRING() ZVAL_EMPTY_STRING(return_value)
  #define RETVAL_ZVAL(zv, copy, dtor) ZVAL_ZVAL(return_value, zv, copy, dtor)
  #define RETVAL_FALSE   ZVAL_BOOL(return_value, 0)
  #define RETVAL_TRUE   ZVAL_BOOL(return_value, 1) 
  #define RETURN_RESOURCE(l) { RETVAL_RESOURCE(l); return; }
  #define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }
  #define RETURN_NULL() { RETVAL_NULL(); return;}
  #define RETURN_LONG(l) { RETVAL_LONG(l); return; }
  #define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; }
  #define RETURN_STRING(s, duplicate) { RETVAL_STRING(s, duplicate); return; }
  #define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; }
  #define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; }
  #define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; }
  #define RETURN_FALSE   { RETVAL_FALSE; return; }
  #define RETURN_TRUE   { RETVAL_TRUE; return; }
로그인 후 복사

위 내용은 모두의 학습에 도움이 되기를 바랍니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

PHP 소스 코드에 대한 간략한 토론 11: array_key_exists, in_array 소개

PHP 소스 코드에 대한 간략한 토론 10: array_keys, array_values ​​​​함수에 대해

간략한 내용 PHP 소스 코드 9에 대한 토론: array_unshift 소개, array_push

소개

위 내용은 PHP 소스 코드 12에 대한 간략한 토론: return_value 반환 값에 대하여의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿