


Entwicklungshinweise zur PHP-Erweiterung (1) Erstellen Sie Array-Attribute von Klassen
Aug 08, 2016 am 09:23 AMEs ist sehr einfach, eine Klasse zu initialisieren, wie zum Beispiel den folgenden Code
MYCLASS_PROTERTY_* Dies h?ngt mit der definierten Makrozeichenfolge zusammen
<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>
Die oben genannten Codes sind einige einfache Eigenschaften.
Beim Versuch, die Attribute eines Arrays für die Klasse myclass zu initialisieren, ist der Code für PHP wie folgt fehlgeschlagen:
<code><span><span>class</span><span>MyClass</span> { public $myArray = array<span>()</span>; } /* 對應(yīng)的<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>
Bei der Ausführung des neuen C-Codes wurde kein Problem gefunden Wenn MyClass() aufgetreten ist, lautet der Fehler wie folgt:
<code>Internal zval<span>'s</span> can<span>'t</span> be arrays, objects <span>or</span> resources</code>
Ein Blick auf den Quellcode von Zend lautet wie folgt:
<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>
Wenn wir zend_register_internal_class aufrufen, wurde myclass_ce initialisiert Es ist ZEND_INTERNAL_CLASS und der myArray-Parameter von zend_declare_property ist derzeit vom Typ IS_ARRAY, sodass ein solcher Fehler auftritt.
Warum tritt ein solcher Fehler auf?
Das Ergebnis meiner Suche ist: http://grokbase.com/t/php/php-internals/07a4b14xvb/php-dev-how-declare-protected-array-property-at-internal - Klassenrichtig Dies ist das Ergebnis von 2007. Ich verwende die PHP5.4-Version und habe vorerst immer noch dieses Problem. Der Artikel enth?lt auch eine Methode zum getarnten Implementieren von Array-Eigenschaften, indem sie im Konstruktor implementiert wird .
<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>
Der PHP-Code, der dieser Implementierungsmethode entspricht
<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>
Das Obige stellt die Entwicklungsnotizen zur PHP-Erweiterung vor (1) Array-Attribute der erstellten Klasse, einschlie?lich des Inhalts Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

Beim Schreiben von Code in PHP kann es zu der Fehlermeldung ?Hinweis: Undefinierte Eigenschaft“ kommen. Dieser Fehler bedeutet, dass wir auf eine undefinierte Eigenschaft zugreifen, normalerweise weil die Eigenschaft im Code nicht initialisiert wurde. Wie kann man dieses Problem l?sen? Hier sind einige m?gliche L?sungen: Eigenschaften initialisieren Dies ist der einfachste Weg, dieses Problem zu l?sen. Durch die explizite Initialisierung einer Eigenschaft im Code wird sichergestellt, dass sie vor der Verwendung definiert wird. Zum Beispiel: Klasse

Die Verwendung der Oracle-Deklaration umfasst Variablendeklaration, Konstantendeklaration, Cursordeklaration und Unterprogrammdeklaration. Detaillierte Einführung: 1. Variablendeklaration, im PL/SQL-Block k?nnen Sie die DECLARE-Anweisung verwenden, um Variablen zu deklarieren. 2. Konstanten sind unver?nderliche Werte, die im PL/SQL-Block deklariert werden Die Abfrageergebnismenge wird im Block verarbeitet. 4. Subroutinendeklaration Eine Subroutine ist ein wiederverwendbarer Codeblock, der in einem PL/SQL-Block definiert ist.

PHPNotice: Tryingtogetpropertyofnon-object-Solution W?hrend des PHP-Entwicklungsprozesses kann es zu einer h?ufigen Fehlermeldung kommen: Tryingtogetpropertyofnon-object (versucht, Eigenschaften von Nicht-Objekten abzurufen). Dieser Fehler wird normalerweise verursacht, wenn wir versuchen, auf eine Eigenschaft einer Variablen zuzugreifen (oder eine Methode aufzurufen), die kein Objekttyp ist. Dieser Artikel stellt Ihnen dies vor

PHP-Implementierungsframework: ZendFramework-Einführungs-Tutorial ZendFramework ist ein von PHP entwickeltes und derzeit von ZendTechnologies verwaltetes Open-Source-Website-Framework, das das MVC-Designmuster übernimmt und eine Reihe wiederverwendbarer Codebibliotheken zur Implementierung von Web2.0-Anwendungen und Web Serve bereitstellt. ZendFramework ist bei PHP-Entwicklern sehr beliebt und gesch?tzt und bietet eine gro?e Auswahl an

So verwenden Sie ACL (AccessControlList) zur Berechtigungskontrolle im Zend Framework. Einführung: In einer Webanwendung ist die Berechtigungskontrolle eine entscheidende Funktion. Es stellt sicher, dass Benutzer nur auf die Seiten und Funktionen zugreifen k?nnen, für die sie eine Zugriffsberechtigung haben, und verhindert unbefugten Zugriff. Das Zend-Framework bietet eine praktische M?glichkeit, die Berechtigungskontrolle mithilfe der ACL-Komponente (AccessControlList) zu implementieren. In diesem Artikel wird die Verwendung von ACL im Zend Framework vorgestellt

Vue ist ein beliebtes JavaScript-Framework zum Erstellen von Benutzeroberfl?chen. W?hrend des Entwicklungsprozesses k?nnen verschiedene Fehler und Ausnahmen auftreten. Einer der h?ufigsten Fehler ist ?TypeError:Cannotreadproperty'XXX'ofnull“. In diesem Artikel untersuchen wir die Ursachen dieses Fehlers und wie man ihn beheben kann. Lassen Sie uns zun?chst den Grund für diesen Fehler verstehen. Wenn wir versuchen, auf eine Eigenschaft oder Methode eines Objekts zuzugreifen, wenn das Paar

TypeError:Cannotreadproperty'XXX'ofundefined in Vue, was soll ich tun? Bei Front-End-Entwicklern, die Vue zum Entwickeln verwenden, kann es w?hrend des Entwicklungsprozesses h?ufig zu TypeError:Cannotreadproperty'XXX'ofundefinierten Fehlern kommen. Dieser Fehler tritt normalerweise auf, wenn versucht wird, auf eine undefinierte Eigenschaft zuzugreifen. existieren

PHP erkennt ZendOptimizer nicht, wie kann man das l?sen? Bei der PHP-Entwicklung kann es manchmal vorkommen, dass PHP ZendOptimizer nicht erkennt, was dazu führt, dass einige PHP-Codes nicht ordnungsgem?? ausgeführt werden. In diesem Fall müssen wir einige Ma?nahmen ergreifen, um das Problem zu l?sen. Im Folgenden werden einige m?gliche Problemumgehungen zusammen mit spezifischen Codebeispielen beschrieben. 1. Best?tigen Sie, ob ZendOptimizer korrekt installiert ist: Zuerst müssen wir best?tigen, dass ZendOptimizer
