PHP 확장 개발 노트 (1) 클래스의 배열 속성 생성
다음 코드와 같이 클래스를 초기화하는 것은 매우 쉽습니다
MYCLASS_PROTERTY_* 정의 매크로 문자열과 관련이 있습니다.
<code>zend_class_entry *myclass_ce; zend_function_entry myclass_methods[] = { PHP_FE_END }; PHP_MINIT_FUNCTION(myext) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, <span>"MyClass"</span>, myclass_methods); myclass_ce = zend_register_internal_class(&ce TSRMLS_CC); zend_<span>declare</span>_class_constant_string(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_VERSION), PHP_SLIM_VERSION); zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_CONTAINER), ZEND_ACC_PUBLIC TSRMLS_CC); zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_APPS), ZEND_ACC_STATIC|ZEND_ACC_PROTECTED TSRMLS_CC); zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_NAME), ZEND_ACC_PROTECTED TSRMLS_CC); zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_ERROR), ZEND_ACC_PROTECTED TSRMLS_CC); zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_NOTFOUND), ZEND_ACC_PROTECTED TSRMLS_CC); zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_MIDDLEWARE), ZEND_ACC_PROTECTED TSRMLS_CC); <span>return</span> SUCCESS; }</code>
위 코드는 몇 가지 간단한 속성입니다.
myclass 클래스의 배열 속성을 초기화하려고 했으나 실패했습니다. PHP 코드는 다음과 같습니다.
<code><span><span>class</span><span>MyClass</span> { public $myArray = array<span>()</span>; } /* 对应的<span>C</span>代码 */ zval *myArray; <span>MAKE_STD_ZVAL</span><span>(<span>myArray</span>)</span>; array_init<span>(<span>myArray</span>)</span>; zend_declare_property<span>(<span>myclass_ce</span>, <span>ZEND_STRL(MYCLASS_PROTERTY_NAME_MYCLASS)</span>, <span>myArray</span>, <span>ZEND_ACC_PUBLIC</span><span>TSRMLS_CC</span>)</span>;</span></code>
위 C 코드를 새로 실행했을 때 문제가 발견되지 않았습니다. MyClass()를 호출할 때 오류가 발생했습니다.
<code>Internal zval<span>'s</span> can<span>'t</span> be arrays, objects <span>or</span> resources</code>
zend의 소스 코드를 보면 다음과 같습니다.
<code><span>if</span> (ce-><span><span>type</span> & <span>ZEND_INTERNAL_CLASS</span>) <span>{ <span>switch</span>(<span>Z_TYPE_P(property)</span>) { <span>case</span><span>IS_ARRAY</span>: <span>case</span><span>IS_CONSTANT_ARRAY</span>: <span>case</span><span>IS_OBJECT</span>: <span>case</span><span>IS_RESOURCE</span>: <span>zend_error</span>(<span>E_CORE_ERROR</span>, "<span>Internal</span><span>zval's</span><span>can't</span><span>be</span><span>arrays</span>, <span>objects</span><span>or</span><span>resources</span>"); <span>break</span>; <span>default</span>: <span>break</span>; }</span></span> }</code>
zend_register_internal_class를 호출하면 myclass_ce가 ZEND_INTERNAL_CLASS이고, 이때 zend_declare_property의 myArray 매개변수가 IS_ARRAY 타입이므로 이런 오류가 발생합니다.
왜 이런 오류가 발생하나요?
검색 결과는 다음과 같습니다. http://grokbase.com/t/php/php-internals/07a4b14xvb/php-dev-how-declare-protected-array-property-at-internal - class-properly 이것은 2007년의 결과입니다. PHP5.4 버전을 사용하고 있는데 당분간은 이 문제가 발생합니다. 기사에서는 생성자에서 구현하여 배열 속성을 위장하여 구현하는 방법도 제공합니다. .
<code>PHP_METHOD(myclass, __construct) { zval <span>*apps</span>, <span>*pThis</span>; pThis = getThis(); MAKE_STD_ZVAL(apps); array_init(apps); add_property_zval_ex(pThis, ZEND_STRL(SLIM_SLIM_PROTERTY_NAME_APPS), apps); }</code>
이 구현 방법에 해당하는 PHP 코드
<code><span><span>class</span><span>MyClass</span> {</span><span><span>function</span><span>__construct</span><span>()</span> {</span><span>$this</span>->app = <span>array</span>(); } }</code>
위 내용은 PHP 확장 개발 노트 (1) 생성된 클래스의 배열 속성을 포함한 내용을 소개하고 있는데, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되었으면 좋겠습니다.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 공지: 비객체 솔루션의 속성을 가져오는 중 PHP 개발 프로세스 중에 다음과 같은 일반적인 오류 메시지가 나타날 수 있습니다. 비객체의 속성을 가져오는 중(비객체의 속성을 가져오는 중). 이 오류는 일반적으로 객체 유형이 아닌 변수의 속성에 액세스하거나 메서드를 호출하려고 할 때 발생합니다. 이 기사에서는 이에 대해 소개합니다.

Oracle 선언 사용법에는 변수 선언, 상수 선언, 커서 선언 및 서브루틴 선언이 포함됩니다. 자세한 소개: 1. PL/SQL 블록에서 DECLARE 문을 사용하여 변수를 선언할 수 있습니다. 2. 상수는 PL/SQL 블록에 선언된 변경할 수 없는 값입니다. 3. PL/SQL에서 사용되는 커서 선언 쿼리 결과 세트는 블록에서 처리됩니다. 4. 서브루틴 선언은 PL/SQL 블록에 정의된 재사용 가능한 코드 블록입니다.

PHP로 코드를 작성할 때 "주의사항: 정의되지 않은 속성"이라는 오류 메시지가 나타날 수 있습니다. 이 오류는 일반적으로 코드에서 속성이 초기화되지 않았기 때문에 정의되지 않은 속성에 액세스하고 있음을 의미합니다. 그렇다면 이 문제를 해결하는 방법은 무엇입니까? 다음은 몇 가지 가능한 해결 방법입니다. 속성 초기화 이것이 이 문제를 해결하는 가장 간단한 방법입니다. 코드에서 속성을 명시적으로 초기화하면 해당 속성이 사용 전에 정의됩니다. 예: 수업

PHP 구현 프레임워크: ZendFramework 입문 튜토리얼 ZendFramework는 PHP에서 개발하고 현재 ZendTechnologies에서 유지 관리하는 오픈 소스 웹 사이트 프레임워크입니다. ZendFramework는 MVC 디자인 패턴을 채택하고 Web2.0 애플리케이션 및 Web Serve 구현을 지원하기 위한 재사용 가능한 코드 라이브러리 시리즈를 제공합니다. ZendFramework는 PHP 개발자들에게 매우 인기 있고 존경받고 있으며 다양한 기능을 갖추고 있습니다.

Zend Framework에서 권한 제어를 위해 ACL(AccessControlList)을 사용하는 방법 소개: 웹 애플리케이션에서 권한 제어는 중요한 기능입니다. 이는 사용자가 액세스 권한이 있는 페이지와 기능에만 액세스할 수 있도록 하고 무단 액세스를 방지합니다. Zend 프레임워크는 ACL(AccessControlList) 구성 요소를 사용하여 권한 제어를 구현하는 편리한 방법을 제공합니다. 이 기사에서는 Zend Framework에서 ACL을 사용하는 방법을 소개합니다.

Vue는 사용자 인터페이스 구축에 널리 사용되는 JavaScript 프레임워크입니다. 개발 과정에서 다양한 오류와 예외가 발생할 수 있습니다. 일반적인 오류 중 하나는 "TypeError:Cannotreadproperty'XXX'ofnull"입니다. 이번 글에서는 이 오류의 원인과 해결 방법을 살펴보겠습니다. 먼저 이 오류의 원인을 이해해 보겠습니다. 객체의 속성이나 메소드에 접근하려고 할 때,

TypeError:Vue에서 정의된 속성'$XXX'ofun을 읽을 수 없습니다. 해결 방법은 무엇입니까? Vue 개발에서는 TypeError:Cannotreadproperty'$XXX'ofundefine과 같은 오류가 자주 발생합니다. 이 오류는 일반적으로 Vue 인스턴스에서 정의되지 않은 속성이나 메서드를 사용하여 발생합니다. 이 오류가 발생하면 우리는

TypeError:Vue에서 정의된 속성'XXX'ofun을 읽을 수 없습니다. 어떻게 해야 합니까? Vue를 사용하여 개발하는 프런트 엔드 개발자의 경우 개발 프로세스 중에 TypeError:Cannotreadproperty'XXX'ofundefine 오류가 자주 발생할 수 있습니다. 이 오류는 일반적으로 정의되지 않은 속성에 액세스하려고 할 때 발생합니다. 존재하다
