1

zvalのエコーのアドレスを書き出すZend拡張機能を作成しましたが、エコーの「テスト」に違いがあることに気付いたため、それらを受信する方法がわかりません。および$a="テスト"; エコー$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;
}

変数であるかどうかに関係なく、どのように引数を取得しますか?

4

1 に答える 1

0

エコーのハンドラーは

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ステートメントでも機能します。

于 2011-10-04T16:38:47.763 に答える