2009-07-09 13 views
4

Ich möchte, dass meine PHP-Erweiterung eine Klasse entspricht dem folgenden PHP deklarieren:Wie füge ich ein Array als eine Objekteigenschaft zu einer Klasse hinzu, die in einer PHP-Erweiterung deklariert wird?

class MyClass 
{ 
    public $MyMemberArray; 

    __construct() 
    { 
     $this->MyMemberArray = array(); 
    } 
} 

Ich verfolge die Beispiele in „Advanced PHP Programming“ und „Extending and Embedding PHP“ und ich bin in der Lage, eine Klasse zu deklarieren, die integer hat Eigenschaften in PHP_MINIT_FUNCTION.

Allerdings, wenn ich den gleichen Ansatz verwenden, um eine Array-Eigenschaft in PHP_MINIT_FUNCTION zu erklären, erhalte ich die folgende Fehlermeldung zur Laufzeit:

PHP Fatal error: Internal zval's can't be arrays, objects or resources in Unknown on line 0 

ein Beispiel auf Seite 557 von Advanced PHP-Programmierung, wie es ist, zu erklären, Ein Konstruktor, der eine Array-Eigenschaft erstellt, aber der Beispielcode wird nicht kompiliert (das zweite "Objekt" scheint redundant zu sein).

fixierte ich den Fehler und angepasst es meinen Code:

PHP_METHOD(MyClass, __construct) 
{ 
    zval *myarray; 
    zval *pThis; 

    pThis = getThis(); 

    MAKE_STD_ZVAL(myarray); 

    array_init(myarray); 
    zend_declare_property(Z_OBJCE_P(pThis), "MyMemberArray", sizeof("MyMemberArray"), myarray, ZEND_ACC_PUBLIC TSRMLS_DC); 
} 

Und das kompiliert, aber es gibt den gleichen Laufzeitfehler auf dem Bau.

Antwort

6

Die Antwort ist add_property_zval_ex() im Konstruktor zu verwenden, anstatt zend_declare_property().

Die folgenden Arbeiten wie vorgesehen:

PHP_METHOD(MyClass, __construct) 
{ 
    zval *myarray; 
    zval *pThis; 

    pThis = getThis(); 

    MAKE_STD_ZVAL(myarray); 

    array_init(myarray); 
    add_property_zval_ex(pThis, "MyMemberArray", sizeof("MyMemberArray"), myarray); 
} 
+0

aber wissen Sie, warum dies ist die Antwort? Was ist die Begründung? –

+0

Die Argumentation hat damit zu tun, wie ein Zval erstellt wird. Es ist eine langwierige Erklärung, vertrau mir. – markzz