Как использовать zval в PHP? - PullRequest
3 голосов
/ 27 июля 2010

Не могли бы вы предложить мне практический пример, показывающий, как использовать контейнеры zval? Единственная связанная с этим функция, которую я знаю, это debug_zval_dump, но я никогда не использовал ее.

Edit:

Полагаю, отслеживая контейнеры zval, я мог видеть, как оптимизировать код, посмотреть, как память используется ссылками. Кажется, это может быть полезным инструментом в некоторых случаях. Конечно, есть веская причина, по которой существует функция debug_val_dump.

Ответы [ 3 ]

11 голосов
/ 27 июля 2010

Каждая переменная PHP хранится в zval, поэтому вы видите, что ваш вопрос на самом деле не имеет смысла.

debug_val_dump не очень хорошо продуманная функция, потому что ее трудно интерпретировать. Просто передав переменную в функцию, вы меняете счетчик ссылок zval. Если вы передадите ссылку на debug_val_dump без передачи ее по ссылке, вы будете вынуждены разделять zval и всегда будете возвращать zval со счетчиком ссылок 1 с очищенным флагом ссылок, и если вы передадите его по ссылке (что должно быть сделано во время звонка, что устарело), ​​тогда по выходным данным вы не сможете определить, была ли она изначально ссылкой или нет.

Xdebug имеет гораздо более полезную функцию, когда вы не передаете переменную, вместо этого вы передаете ее имя в строке. Это называется xdebug_debug_zval.

Если вы не отлаживаете код, который использует ссылки, и вы не хотите знать, сколько переменных принадлежит к набору ссылок, эти функции, вероятно, не очень полезны для вас.

Чтобы разобраться в них, я советую вам прочитать основы подсчета ссылок в руководстве.

4 голосов
/ 27 июля 2010

Вы не можете использовать zval из самого php.Это базовая деталь реализации, которая (обычно) недоступна из кода PHP пользователя.

0 голосов
/ 05 ноября 2018

Я мог видеть, как оптимизировать код

В PHP есть оптимизации для присвоения по значению.PHP выполняет это, только копируя значение в новый zval при его изменении, и первоначально направляя новый символ в тот же контейнер zval.Этот механизм называется «копировать при записи».Вот пример, чтобы проиллюстрировать:

$a = "new string";
$b =& $a;
// the variable b points to the variable a
xdebug_debug_zval( 'a' );
xdebug_debug_zval( 'b' );
// change the string and see that the refcount is reset
$b = 'changed string';
xdebug_debug_zval( 'a' );
xdebug_debug_zval( 'b' );

Вывод этого скрипта следующий:

a: (refcount=2, is_ref=0)='new string'
b: (refcount=2, is_ref=0)='new string'
a: (refcount=1, is_ref=0)='new string'
b: (refcount=1, is_ref=0)='changed string'

подробнее: php 7 учебное пособие по сертификации Zend

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...