2011-06-04 19 views
10

Si ambos isset() y empty() generan exactamente el mismo código de operación ISSET_ISEMPTY_DIM_OBJ, ¿cómo puede la VM de PHP decir la diferencia entre los dos?¿Por qué isset() y empty() usan el mismo opcode?

este código:

empty($a['b']); 
isset($a['b']); 

produce los siguientes códigos de operación:

ISSET_ISEMPTY_DIM_OBJ $a, b -> TMP_VAR 0 
FREE TMP_VAR 0 

ISSET_ISEMPTY_DIM_OBJ $a, b -> TMP_VAR 1 
FREE TMP_VAR 1 

Otra prueba:

if (empty($a['b'])) { 
    echo 'abc'; 
} 

if (isset($a['b'])) { 
    echo 'abc'; 
} 

Esto produce:

ISSET_ISEMPTY_DIM_OBJ $a, b -> TMP_VAR 0 
JMPZ TMP_VAR 0, &(BC4E00+4) 
ECHO abc 
JMP &(BC4E00+4) 

ISSET_ISEMPTY_DIM_OBJ $a, b -> TMP_VAR 1 
JMPZ TMP_VAR 1, &(BC4FE0+8) 
ECHO abc 
JMP &(BC4FE0+8) 
+3

¿Cómo es que llegó a este nivel lol – dynamic

+0

Esto podría ser el resultado de alguna optimización. No estás usando el valor de retorno. Intenta algo más complejo como un 'if (...)'. – Gumbo

+0

@Gumbo, pregunta actualizada. – rid

Respuesta

5

Cualquier herramienta que estuvieras usando para crear ese volcado de código de operación, solo te decía la mitad de la verdad: olvidó mencionar que PHP está pasando una constante a ese código de operación dependiendo de qué lenguaje se usó. Esas constantes son ZEND_ISEMPTY para empty y ZEND_ISSET para isset.

Puede encontrar las invocaciones here y here. (Y here el tipo se pone en el extended_value del código de operación.)

Si nos fijamos en la full opcodes, verá esas constantes como 1 (ZEND_ISSET = (1<<0)) y 2 (ZEND_ISEMPTY = (1<<1)) en la columna de la ext.

+0

Suena muy plausible. – GolezTrol

4

¿Cómo conseguiste esos códigos de operación?

Me corrió el fragmento de código usando "Bytekit", y obtuvo el siguiente resultado:

Function:   main 
Number of oplines: 5 
Compiled variables: !0 = $a 

    line #  opcode       result operands 
    ----------------------------------------------------------------------------- 
    3  0  ISEMPTY_DIM_OBJ     ~0  !0, 'b' 
     1  FREE          ~0 
    4  2  ISSET_DIM_OBJ     ~1  !0, 'b' 
     3  FREE          ~1 
    6  4  RETURN         1 

Por lo tanto, en este caso, hay una diferencia en los códigos de operación. Lo único es que parece que no puedo encontrar 'mis' códigos de operación en el sitio web oficial de PHP. Esto me desconcierta, porque bytekit ha demostrado ser una excelente herramienta hasta ahora.

Voy a investigar eso, pero mientras tanto, pensé, es posible que encuentre mi producción actual de cualquier valor.

Por cierto, soy PHP ejecutando 5.3.3 en Ubuntu.

+0

Debe ser debido a la versión de PHP. Estoy usando PHP 5.3.4. – rid

Cuestiones relacionadas