Solo las variables deberían pasar por referencia

Resuelto Frank Nwoko asked hace 54 años • 13 respuestas
// Other variables
$MAX_FILENAME_LENGTH = 260;
$file_name = $_FILES[$upload_name]['name'];
//echo "testing-".$file_name."<br>";
//$file_name = strtolower($file_name);
$file_extension = end(explode('.', $file_name)); //ERROR ON THIS LINE
$uploadErrors = array(
    0=>'There is no error, the file uploaded with success',
    1=>'The uploaded file exceeds the upload max filesize allowed.',
    2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
    3=>'The uploaded file was only partially uploaded',
    4=>'No file was uploaded',
    6=>'Missing a temporary folder'
);

¿Algunas ideas? Después de 2 días todavía estancado.

Frank Nwoko avatar Jan 01 '70 08:01 Frank Nwoko
Aceptado

Asigne el resultado de explodea una variable y pase esa variable a end:

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

El problema es que eso endrequiere una referencia, porque modifica la representación interna de la matriz (es decir, hace que el puntero del elemento actual apunte al último elemento).

El resultado de explode('.', $file_name)no se puede convertir en una referencia. Esta es una restricción en el lenguaje PHP, que probablemente existe por razones de simplicidad.

Oswald avatar Jan 08 '2011 21:01 Oswald

Todos los demás ya te han explicado el motivo por el que recibes un error, pero esta es la mejor manera de hacer lo que quieres hacer: $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);

ryeguy avatar Jan 08 '2011 21:01 ryeguy

Uso adecuado compatible con PHP 7:

$fileName      = 'long.file.name.jpg';
$tmp           = explode('.', $fileName);
$fileExtension = end($tmp);

echo $fileExtension;
// jpg
Sinan Eldem avatar Jan 09 '2014 09:01 Sinan Eldem

guarde la matriz de explode() en una variable y luego llame a end() en esta variable:

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

Por cierto: uso este código para obtener la extensión del archivo:

$ext = substr( strrchr($file_name, '.'), 1);

donde strrchrextrae la cuerda después de la última .y substrcorta la.

Floern avatar Jan 08 '2011 21:01 Floern

La respuesta dada en otra parte,

$tmp = explode('.', $fileName);
$file_extension = end($tmp);

es correcto y válido. Logra lo que estás tratando de hacer.

¿Por qué?

La end()función no hace exactamente lo que crees que hace. Esto está relacionado con cómo arrayfunciona la estructura de datos PHP. Normalmente no lo ves, pero los arreglos en PHP contienen un puntero a un elemento actual, que se usa para la iteración (como con foreach).

Para poder utilizar end(), debe tener una matriz real, a la que se le haya adjuntado (normalmente, de forma invisible) el puntero del elemento actual. La end()función modifica físicamente ese puntero.

La salida de explode()no es una matriz real. Es una salida de función. Por lo tanto, no puede ejecutar end(explode())porque viola los requisitos de idioma.

Simplemente configurando la salida de explode()en una variable se crea la matriz que estás buscando. Esa matriz creada tiene un puntero de elemento actual. Ahora todo vuelve a estar bien en el mundo.

Entonces, ¿qué pasa con los paréntesis?

Esto no es un error. Una vez más, es un requisito lingüístico.

Los paréntesis adicionales (como end((explode()))) hacen más que simplemente agrupar. Crean una variable de instancia en línea, al igual que configurar la salida de la función en una variable. Puede considerarlo como una función lambda que se ejecuta inmediatamente.

Esta es otra solución correcta y válida. Quizás sea una mejor solución, ya que ocupa menos espacio. Un buen revisor o mantenedor debería asimilar lo que estás intentando hacer cuando vea los paréntesis adicionales.

Si usa un programa linter o SCA como PHPCS, es posible que no le gusten los paréntesis adicionales, dependiendo del perfil de linting que esté usando. Es tu linter, dile lo que quieres que haga por ti.

Algunas otras respuestas también enumeran cosas como el operador de extensión o array_key_last(), que también son soluciones razonables. Puede que sean perfectamente válidos pero son más complicados de usar y leer.

Solo usaré el @prefijo

Esta solución es válida, aunque incorrecta. Es válido porque resuelve el problema. Eso es casi el final de su mérito.

Suprimir errores siempre es una mala práctica. Hay muchas razones para ello. Uno muy importante es que está intentando suprimir una condición de error específica (una que ha creado), pero el prefijo de supresión de errores suprime todos los errores.

En este caso, probablemente se saldrá con la suya. Sin embargo, adoptar malos hábitos de programación es hacer trampa y probablemente le llevará a hacer más y más trampas en el futuro. Serás responsable del código incorrecto. Pero no soy el Código de Policía y es tu código. Es válido porque resuelve el problema.

Bien, ¿cuál es la mejor respuesta?

Haz lo que sugiere @ryeguy . No manipule cadenas para resolver un problema bien definido que la plataforma ya resuelve por usted. Usar pathinfo().

Esto tiene el beneficio adicional de que realmente hace lo que usted desea, que es encontrar la extensión en un nombre de archivo. Hay una diferencia sutil.

Lo que estás haciendo es obtener el texto que sigue al punto final. Esto es diferente a encontrar la extensión del archivo. Considere el nombre del archivo, .gitignore. PHP sabe cómo manejar esto. ¿Tu código?

Una vez más, no soy la Policía del Código. Haz lo que más te convenga.

Stephan Samuel avatar Jul 09 '2021 13:07 Stephan Samuel