2013-08-31 2 views
0

Я использую макрос zend_declare_class_constant_stringl, чтобы объявить свойство константы, но я не знаю, как читать константу? код провозглашают:Как читать постоянное свойство в расширении php?

zend_declare_class_constant_stringl(myclass_ce,ZEND_STRL("WEL"),ZEND_STRL("welcome\n") TSRMLS_CC); 

Я хочу использовать zend_read_property или zend_read_static_property читать постоянную собственность, но она не работает!

(1): Я использую zend_read_static_property:

ZEND_METHOD(myclass,getName){ 
zval *name; 
char *str; 
zend_class_entry *ce; 
ce=Z_OBJCE_P(getThis()); 
name=zend_read_static_property(ce,ZEND_STRL("name"),0 TSRMLS_CC); 
str=Z_STRVAL_P(name); 
RETURN_STRINGL(str,Z_STRLEN_P(name),1); 
} 

[корень @ локальный myext] # PHP -f /var/www/html/myclass.php

Notice: Undefined property: myclass::$WEL in /var/www/html/myclass.php on line 3 
(null)PHP Fatal error: Access to undeclared static property: myclass::$name in  /var/www/html/myclass.php on line 5 

(2) Я использую zend_read_property:

ZEND_METHOD(myclass,getName){ 
zval *name; 
char *str; 
zend_class_entry *ce; 
ce=Z_OBJCE_P(getThis()); 
name=zend_read_property(ce,getThis(),ZEND_STRL("name"),0 TSRMLS_CC); 
str=Z_STRVAL_P(name); 
RETURN_STRINGL(str,Z_STRLEN_P(name),1); 
} 

[Root @ LOCALHOST myext] # PHP -f /var/www/html/myclass.php

Notice: Undefined property: myclass::$WEL in /var/www/html/myclass.php on line 3 
(null)silenceperPHP Fatal error: Access to undeclared static property: myclass::$BYE in Unknown on line 0 
+3

Говоря как * «это не работает!» * Немного неспецифично, и неясно, чего вы действительно ожидали и что произошло вместо этого. Хотите поделиться больше? – hakre

ответ

2

Использование zend_get_constant_ex:

zval c; 

if (zend_get_constant_ex(ZEND_STRL("ClassName::CONSTANT_NAME"), &c, NULL, 0 TSRMLS_CC) == SUCCESS) { 
    // ... 
} 

NULL класс возможности для выполнения выборки из (если вы хотите использовать что-то вроде self). 0 являются флагами, например. ZEND_FETCH_CLASS_SILENT.

+0

вот так: 'ZEND_METHOD (myclass, __ construct) { zval wel; zend_class_entry * ce; ce = Z_OBJCE_P (getThis()); zend_get_constant_ex (ZEND_STRL («self :: WEL»), & wel, ce, 0 TSRMLS_CC); php_printf ("% s", Z_STRVAL (привет)); } 'Всего обнаружено 1 утечки памяти – silenceper

+0

@silenceper Вы должны' zval_dtor' zval после этого, конечно, – NikiC

+0

Это было 'ClassName ::', которое отсутствовало, так полезен этот ответ, хотя я бы хотел спросить, есть ли хороший ресурс о расширениях PHP с помощью c? –

Смежные вопросы