Расширение Zend, получить аргументы echo? - PullRequest
1 голос
/ 04 октября 2011

Мы сделали расширение Zend, которое мы хотим записать в адрес эхо-адреса zval, но мы не можем понять, как их получить, потому что заметили, что между эхом «test» есть разница;и $ a = "test";echo $ a;

.... Some stuff that overrides the echo opcode ....

FILE *tmpfile;
int echo_handler(ZEND_OPCODE_HANDLER_ARGS)
{
    zend_op *opline = execute_data->opline;
    tmpfile = fopen("/tmp/echo.test","a+");
    fprintf(tmpfile,"Echo was called\n");
    fclose(tmpfile);

    return ZEND_USER_OPCODE_DISPATCH;
}

Как получить аргументы независимо от того, является ли она переменной или нет?

1 Ответ

0 голосов
/ 04 октября 2011

Обработчик эха:

static int ZEND_FASTCALL  ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
    zend_op *opline = EX(opline);

    zval z_copy;
    zval *z = &opline->op1.u.constant;

    if (IS_CONST != IS_CONST &&
        Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL &&
        zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
        zend_print_variable(&z_copy);
        zval_dtor(&z_copy);
    } else {
        zend_print_variable(z);
    }

    ZEND_VM_NEXT_OPCODE();
}

из Zend/zend_vm_execute.h, и, как вы можете видеть, все, что он в основном делает, это вызывает zend_print_variable().

Подключите эту функцию, и вы должныбыть на правильном пути.

Бонус: это работает и для print операторов.

...