sobrecarga php7 overload metodos constructores php unicode

overload - sobrecarga de constructores php7



¿Debo usar la sobrecarga de múltiples bytes(mbstring.func_overload)? (2)

Estoy en el proceso de hacer que mi sitio PHP sea consciente de Unicode. Me pregunto si alguien tiene experiencia con la configuración mbstring.func_overload , que reemplaza las funciones de cadena normales (por ejemplo, strlen ) con sus equivalentes de múltiples bytes ( mb_strlen ). No hay ningún comentario en la página del manual de PHP.

¿Hay algún problema potencial que deba tener en cuenta? ¿Alguna vez llamar a la versión de múltiples bytes es una mala idea?

Supongo que un ejemplo serían las funciones que tienen que ver con el cifrado, ya que pueden esperar tratar con cadenas de bytes, en lugar de cadenas de caracteres.

Además, la página del manual incluye una nota: "No se recomienda utilizar la opción de sobrecarga de funciones en el contexto por directorio, porque aún no se ha confirmado que sea lo suficientemente estable en un entorno de producción y puede conducir a un comportamiento indefinido".

¿Eso significa que no es estable en un contexto por directorio, o generalmente no es estable? La redacción no está clara.


Un problema que debería tener en cuenta es el de los scripts de terceros (quizás una extensión de biblioteca o pera) que utiliza versiones de funciones no compatibles con mb. por ejemplo, las bibliotecas que usan strlen() podrían causar problemas si la sobrecarga.

también, este informe de error muestra que el sangrado del host virtual de las funciones mb_overloaded se ha corregido en las versiones de 5.2 / 5.3 CVS. el error es específico de las configuraciones por directorio.


Mi respuesta es: definitivamente no !

El problema es que no hay una manera fácil de "reiniciar" las funciones str * una vez que están sobrecargadas.

Durante algún tiempo, esto puede funcionar bien con su proyecto, pero seguramente se encontrará con una biblioteca externa que utiliza funciones de cadena para, por ejemplo, implementar un protocolo binario, y fallarán. Fallarán y pasarán horas tratando de descubrir por qué están fallando.

Después de haber encontrado que es mbstring.func_overload , no tiene demasiada opción. Puedes ini_settear mbstring.internal_encoding a alguna codificación byte- mbstring.internal_encoding -char cada vez que llames a la biblioteca externa y la mbstring.internal_encoding justo después, pero si tu biblioteca hace devoluciones de llamada a tu aplicación, simplemente estropeará las cosas.

Otra opción es ajustar la biblioteca manualmente, cambiando todas las funciones str * a su contraparte mb_string y pasando un parámetro de codificación de un byte por carácter. Esto, sin embargo, tampoco es una gran idea, porque pierde la capacidad de actualizar fácilmente su externo, y también puede causar algunos problemas de rendimiento.

Entonces, de nuevo, no use func_overload . Si trabaja con cadenas de múltiples bytes, use las funciones mb_ apropiadas.