strip_tags remove ejemplo php echo

remove - strip_tags php ejemplo



Referencia: Comparando la impresiĆ³n y el eco de PHP (1)

¿Cuál es la diferencia entre la print y el echo PHP?

Stack Overflow tiene muchas preguntas sobre el uso de palabras clave de print y echo PHP.

El objetivo de esta publicación es proporcionar una pregunta y respuesta de reference canónica sobre las palabras clave de print y echo PHP y comparar sus diferencias y casos de uso.


¿Por qué dos constructos?

La verdad sobre la impresión y el eco es que, si bien los usuarios los consideran dos constructos distintos, en realidad son tonos de eco si se desciende a lo básico, es decir, si se mira el código fuente interno. Ese código fuente involucra al analizador así como a los manejadores de código de operación. Considere una acción simple como mostrar el número cero. Si utiliza eco o impresión, se invocará el mismo controlador "ZEND_ECHO_SPEC_CONST_HANDLER". El controlador para impresión hace una cosa antes de invocar el controlador para eco, se asegura de que el valor de retorno para imprimir sea 1, como se muestra a continuación:

ZVAL_LONG(&EX_T(opline->result.var).tmp_var, 1);

(ver aquí para referencia )

El valor de retorno es una conveniencia si uno desea usar print en una expresión condicional. ¿Por qué 1 y no 100? Bueno, en PHP, la veracidad de 1 o 100 es la misma, es decir, verdadera, mientras que 0 en un contexto booleano equivale a un valor falso. En PHP, todos los valores distintos de cero (positivos y negativos) son valores verdaderos y esto se deriva del legado Perl de PHP.

Pero, si este es el caso, entonces uno se puede preguntar por qué echo toma múltiples argumentos mientras que la impresión solo puede manejar uno. Para esta respuesta, debemos consultar el analizador sintáctico, específicamente el archivo zend_language_parser.y . Notará que echo tiene la flexibilidad incorporada para que pueda imprimir una o varias expresiones (ver here ). mientras que la impresión está limitada a imprimir solo una expresión (ver there ).

Sintaxis

En el lenguaje de programación C y en los idiomas influidos por él, como PHP, existe una distinción entre enunciados y expresiones. Sintácticamente, echo expr, expr, ... expr es una declaración, mientras que print expr es una expresión, ya que se evalúa como un valor. Por lo tanto, al igual que otras declaraciones, echo expr sostiene por sí mismo y no puede incluirse en una expresión:

5 + echo 6; // syntax error

Por el contrario, print expr , solo puede formar una declaración:

print 5; // valid

O bien, se parte de una expresión:

$x = (5 + print 5); // 5 var_dump( $x ); // 6

¡Uno podría sentirse tentado a pensar en print como si fuera un operador unario, como ! o ~ sin embargo, no es un operador. Lo que !, ~ and print tienen en común es que todos están integrados en PHP y cada uno toma solo un argumento. Puede usar print para crear el siguiente código raro pero válido:

<?php print print print print 7; // 7111

A primera vista, el resultado puede parecer extraño que la última declaración de impresión imprima primero su operando de ''7''. Pero si profundizas más y observas los códigos de operación reales, tiene sentido:

line # * op fetch ext return operands --------------------------------------------------------------------------------- 3 0 > PRINT ~0 7 1 PRINT ~1 ~0 2 PRINT ~2 ~1 3 PRINT ~3 ~2 4 FREE ~3 5 > RETURN 1

El primer código de operación que se genera es el correspondiente a la ''impresión 7''. El ''~ 0'' es una variable temporal cuyo valor es 1. Esa variable se convierte en operando para el siguiente código de operación de impresión que a su vez devuelve una variable temporal y el proceso se repite. La última variable temporal no se usa en absoluto, así que se libera.

¿Por qué print devuelve un valor y echo no?

Las expresiones evalúan a los valores. Por ejemplo, 2 + 3 evalúa a 5 y abs(-10) evalúa a 10 . Como print expr es una expresión en sí misma, debe contener un valor y lo hace, un valor consistente de 1 indica un resultado verdadero y al devolver un valor distinto de cero la expresión se vuelve útil para su inclusión en otra expresión. Por ejemplo, en este fragmento, el valor de retorno de la impresión es útil para determinar una secuencia de función:

<?php function bar( $baz ) { // other code } function foo() { return print("In and out .../n"); } if ( foo() ) { bar(); }

Puede encontrar una impresión de un valor particular cuando se trata de depuración sobre la marcha, como lo ilustra el siguiente ejemplo:

<?php $haystack = ''abcde''; $needle = ''f''; strpos($haystack,$needle) !== FALSE OR print "$needle not in $haystack"; // output: f not in abcde

Como nota al margen, generalmente, las declaraciones no son expresiones; ellos no devuelven un valor La excepción, por supuesto, son los enunciados de expresión que usan expresiones impresas e incluso simples usadas como una declaración, como 1; , una sintaxis que PHP hereda de C. La declaración de expresión puede parecer extraña, pero es muy útil, lo que permite pasar argumentos a las funciones.

¿ print es una función?

No, es una construcción de lenguaje. Si bien todas las llamadas a funciones son expresiones, print (expr) es una expresión, a pesar del visual que aparece como si estuviera usando la sintaxis de llamada a la función. En verdad, estos paréntesis son sintesis de paréntesis-expr, útiles para la evaluación de expresiones. Eso explica el hecho de que a veces son opcionales si la expresión es simple, como print "Hello, world!" . Con una expresión más compleja como print (5 ** 2 + 6/2); // 28 print (5 ** 2 + 6/2); // 28 los paréntesis ayudan a la evaluación de la expresión. A diferencia de los nombres de funciones, print es sintácticamente una palabra clave y semánticamente una "construcción de lenguaje" .

El término "construcción de lenguaje" en PHP generalmente se refiere a funciones "pseudo" como isset o empty . Aunque estos "constructos" se ven exactamente como funciones, en realidad son fexprs , es decir, los argumentos se les pasan sin ser evaluados, lo que requiere un tratamiento especial del compilador. print pasa a ser un fexpr que elige evaluar su argumento de la misma manera que una función.

La diferencia puede verse imprimiendo get_defined_functions() : no hay print función de print lista. (Aunque printf y friends son: a diferencia de print , son funciones reales).

¿Por qué funciona print (foo) entonces?

Por la misma razón que echo(foo) funciona. Estos paréntesis son bastante diferentes de los paréntesis de llamada de función porque pertenecen a expresiones en su lugar. Es por eso que uno puede codificar el echo ( 5 + 8 ) y puede esperar un resultado de 13 para mostrar (ver reference ). Estos paréntesis están involucrados en la evaluación de una expresión en lugar de invocar una función. Nota: hay otros usos para paréntesis en PHP, como if if-conditional expressions, assignment lists, function declarations, etc.

¿Por qué print(1,2,3) y echo(1,2,3) resultan en errores de sintaxis?

La sintaxis es print expr , echo expr o echo expr, expr, ..., expr . Cuando PHP encuentra (1,2,3) , intenta analizarlo como una sola expresión y falla, porque a diferencia de C, PHP realmente no tiene un operador de coma binaria; la coma sirve más como un separador. (Sin embargo, puede encontrar una coma binaria en for-loops de PHP, sintaxis heredada de C.)

Semántica

La declaración echo e1, e2, ..., eN; puede entenderse como azúcar sintáctico para echo e1; echo e2; ...; echo eN; echo e1; echo e2; ...; echo eN; .

Dado que todas las expresiones son enunciados, y echo e siempre tiene los mismos efectos secundarios que print e , y el valor de retorno de print e se ignora cuando se usa como una declaración, podemos entender echo e como azúcar sintáctico para print e .

Estas dos observaciones significan que echo e1, e2, ..., eN; puede verse como azúcar sintáctico para print e1; print e2; ... print eN; print e1; print e2; ... print eN; . (Sin embargo, tenga en cuenta las diferencias de tiempo de ejecución no semánticas a continuación).

Por lo tanto, solo tenemos que definir la semántica para print . print e , cuando se evalúa:

  1. evalúa su único argumento e y type-casts el valor resultante en una cadena s . (Por lo tanto, print e es equivalente a print (string) e )
  2. Transmite la cadena s al buffer de salida (que eventualmente se transmitirá a la salida estándar).
  3. Evalúa al entero 1 .

Diferencias en el nivel de bytecode

print implica una pequeña sobrecarga de poblar la variable de retorno (pseudocódigo)

print 125; PRINT 125,$temp ; print 125 and place 1 in $temp UNSET $temp ; remove $temp

Single echo compila a un opcode:

echo 125; ECHO 125

compilaciones de echo multivalor para múltiples códigos de operación

echo 123, 456; ECHO 123 ECHO 456

Tenga en cuenta que el echo multivalor no concatena sus argumentos, sino que los emite uno a uno.

Referencia: zend_do_print , zend_do_echo .

Diferencias de tiempo de ejecución

ZEND_PRINT se implementa de la siguiente manera (pseudocódigo)

PRINT var, result: result = 1 ECHO var

Por lo tanto, básicamente pone 1 en la variable de resultado y delega el trabajo real en el manejador ZEND_ECHO . ZEND_ECHO hace lo siguiente

ECHO var: if var is object temp = var->toString() zend_print_variable(temp) else zend_print_variable(var)

donde zend_print_variable() realiza la "impresión" real (de hecho, simplemente redirecciona a una función SAPI dedicada).

Velocidad: echo x frente a print x

A diferencia de echo , print asigna una variable temporal. Sin embargo, la cantidad de tiempo dedicado a esta actividad es minúsculo, por lo que la diferencia entre estos dos constructos de lenguaje es insignificante.

Velocidad: echo a,b,c frente a echo abc

El primero se compila en tres declaraciones separadas. El segundo evalúa toda la expresión abc , imprime el resultado y lo descarta inmediatamente. Como la concatenación involucra asignaciones de memoria y copia, la primera opción será más eficiente.

Entonces, ¿cuál usar?

En aplicaciones web, la salida se concentra principalmente en plantillas. Como las plantillas usan <?= , Que es el alias del echo , parece lógico que también se atenga al echo en otras partes del código. echo tiene la ventaja adicional de poder imprimir expresiones múltiples sin concatenarlas y no implica una sobrecarga de poblar una variable de retorno temporal. Entonces, usa echo .