2010-07-27 5 views
2

Pourriez-vous me suggérer un exemple pratique montrant comment utiliser des conteneurs zval? La seule fonction connexe que je connais est debug_zval_dump, mais je ne l'ai jamais vraiment utilisée.Comment utiliser zval en PHP?

Edit:

je suppose, le suivi des conteneurs zval je pouvais voir comment optimiser le code, voir comment la mémoire est utilisée par des références. Il semble que cela pourrait être utile dans certains cas. Il y a certainement une bonne raison pour laquelle la fonction debug_val_dump existe.

+0

Pourquoi voudriez-vous faire cela? –

Répondre

10

Chaque variable PHP est stockée dans un zval, donc vous voyez que votre question n'a pas vraiment de sens.

debug_val_dump n'est pas une fonction très bien pensée car elle est difficile à interpréter. En passant simplement une variable à la fonction, vous changez le nombre de références du zval. Si vous passez une référence à debug_val_dump sans la passer par référence, vous allez forcer une séparation zval et vous obtiendrez toujours un zval avec le nombre de références 1 avec le drapeau de référence vide, et si vous le passez par référence (qui doit être fait sur appel, ce qui est déprécié) alors vous ne pouvez pas dire, juste par la sortie, si c'était à l'origine une référence ou non.

Xdebug a une fonction beaucoup plus utile où vous ne passez pas la variable, vous passez son nom dans une chaîne à la place. C'est ce qu'on appelle xdebug_debug_zval.

À moins que vous ne déboguiez du code utilisant des références et que vous souhaitiez connaître le nombre de variables appartenant à l'ensemble de référence, ces fonctions ne vous sont probablement pas très utiles.

Pour les comprendre, je vous conseille de lire reference count basics dans le manuel.

+3

Le "Sauf ..." est ce qui m'intéresse. J'ai trouvé cet article très instructif aussi: http://derickrethans.nl/talks/phparch-php-variables-article.pdf – takeshin

3

Vous ne pouvez pas vraiment utiliser zval de php lui-même. Il s'agit d'un détail d'implémentation de base qui n'est pas (normalement) accessible depuis le code PHP de l'utilisateur.