Para lo casos que expones.
El salto de línea:
Usar PHP_EOL
al manejar archivos.
El separador de rutas de archivos y El separador de directorios
Usar DIRECTORY_SEPARATOR
El directorio del usuario actual (home)
Es un indice del array $_SERVER pero este es un valor que enviá el cliente por lo que no podemos contar con el. bien podria no enviarlo el explorador. o el cliente.
Adicionalmente tener en cuenta lo siguiente:
El directorio temporal del sistema:
sys_get_temp_dir
No dar por echo parámetros por defecto en funciones.Por ejemplo la codificación que depende de la versión de PHP o el SO.
string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]]
Como esta hay muchas funciones que dependen de la codificación por defecto del SO versión de PHP o configuración de php.ini. Lo mas sano es usar funciones Multibyte, comprobar la codificación y forzarla a la de su elección.
Se pueden crear envolturas para las funciones de PHP por ejemplo y usar estas y en ellas hacer las validaciones de compatibilidad necesarias y retornar el valor que mas nos convenga.
function lower($str) {
if (! function_exist('mb_strtolower')) {
return strtolower($str);
}
return mb_strtolower($str,ENCODIG);
}
También podemos tratar de simular la funcionalidad de funciones en caso de que las extensiones no estén habilitadas:
if (! function_exists('mb_detect_encoding')) {
function mb_detect_encoding ($string, $enc=null, $ret=null) {
$enclist = array(
'UTF-8', 'ASCII',
'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5',
'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10',
'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16',
'Windows-1251', 'Windows-1252', 'Windows-1254',
);
$result = false;
foreach ($enclist as $item) {
$sample = iconv($item, $item, $string);
if (md5($sample) == md5($string)) {
if ($ret === NULL) { $result = $item; } else { $result = true; }
break;
}
}
return $result;
}
}
En las conexiones a base de datos hay que especificar el charset
y no dejarlo a la negociación del cliente servidor.
Los nombres de los archivos y directorios siempre hay que validar como se han escrito en los include o referencias a los mismos ya que widow no es Case sensitive y los SO *nix si.
También hay que configurar nuestro editor para que al crear archivos los cree con una misma codificación y mismo final de linea preferentemente \r (*nix).
En el ambiente de desarrollo utilizar error_reporting
y display_errors
con los valores ALL
y on
respectivamente para así ser mas consientes de nuestras posibles fallas y minimizarlas lo mejor posible.
Evitar el uso de llamadas al sistema con shell_exec
si fuese necesario configurar el path y documentarse respecto al programa que ejecutamos ya que su salida puede variar de acuerdo al SO especialmente en saltos de linea y codepage.
No hacer uso de los objetos COM ya que solo funcionan en window.
Por el momento son todas las consideraciones que recuerdo. si hay alguna que no entre en alguna categoría bienvenida en los comentarios.
` y de esa manerra tendrías código multiplataforma. Si no te referías a eso, tal vez debas modificar la redacción de la pregunta. – Ruslan López Oct 24 '17 at 17:44
` no sería el adecuado. Además la pregunta no se limita solo a los saltos de línea. Puse ese ejemplo y cierta intervención constante aquí podría hacer pensar que se trata de manejar los saltos de línea solamente. Si lees la pregunta verás que ese no es el sentido de la misma. – A. Cedano Oct 24 '17 at 17:51