working que ob_start ob_get_contents ob_end_clean ob_clean ob_ not php

php - que - ob_get_contents+ob_end_clean vs ob_get_clean



php buffer echo (4)

Hay una diferencia pequeñita entre

$stuff = ob_get_clean();

y

$stuff = ob_get_contents(); ob_end_clean();

que es lo último que lanzará un E_NOTICE si no hay un búfer de salida activo en el momento en que lo llama, y ​​el primero no lo hará. Lanzar el aviso en realidad me parece un comportamiento más sensato, ya que si llama a estas funciones sin un búfer de salida, ¡probablemente esté haciendo algo mal!

El hecho de que los dos enfoques sean bastante equivalentes se documenta explícitamente en php.net , que dice:

ob_get_clean() esencialmente ejecuta tanto ob_get_contents() como ob_end_clean() .

El comportamiento de advertencia de lanzamiento de ob_end_clean también se documenta :

Si la función falla, genera un E_NOTICE .

Tenga en cuenta que no hay una frase similar en los documentos de ob_get_contents o ob_end_clean .

Si realmente quiere asegurarse de que no hay más diferencias entre estas funciones (no las hay), puede sumergirse en las definiciones de ob_get_contents , ob_end_clean y ob_get_clean en la fuente. Hay un extraño manejo de errores para casos imposibles en ob_get_clean que nunca debería alcanzarse, pero además de eso, puede ver que los comportamientos son como se describen.

¿Hay alguna diferencia entre estas dos piezas de PHP?

ob_start(); //code... $pageContent = ob_get_contents(); ob_end_clean(); someFunction($pageContent);

vs

ob_start(); //code... $pageContent=ob_get_clean(); someFunction($pageContent);

Actualmente estoy usando el primer bloque, pero me gustaría usar el segundo en su lugar si es funcionalmente equivalente, ya que es un poco más conciso.


Para responder tu pregunta:

ob_get_clean () esencialmente ejecuta tanto ob_get_contents () como ob_end_clean ().

Sí. Es funcionalmente equivalente.

Caso 1:

ob_get_contents() + ob_end_clean() :

ob_get_contents - Devuelve el contenido del búfer de salida

ob_end_clean - Limpie (borre) el búfer de salida y desactive el búfer de salida

Entonces, básicamente, estás almacenando el contenido del búfer de salida en una variable y luego ob_end_clean() con ob_end_clean() .

Caso 2:

ob_get_clean - Obtener el contenido del búfer actual y eliminar el búfer de salida actual

Está almacenando el contenido del búfer en una variable y luego se borra el búfer de salida.

Lo que estás haciendo es esencialmente lo mismo. Entonces, no veo nada malo en usar el segundo bloque de código aquí, ya que ambos están haciendo lo mismo.


ob_get_contents() se puede utilizar para continuar con el búfer de salida.

Ejemplo:

ob_start(); echo ''Something!''; $html1 = ob_get_contents(); echo ''More to say!''; $html2 = ob_get_contents(); ob_end_clean();

Al final las vars tienen este contenido:

$html1 = ''Something!''; $html2 = ''Something!More to say!'';


La función ob_get_clean () ejecuta tanto ob_get_contents () como ob_end_clean () .

La misma funcionalidad que ob_get_contents () + ob_end_clean () , ob_get_clean () devuelve el contenido del búfer de salida y el búfer de salida final. Si el búfer de salida no está activo, se devuelve FALSE .