2017-01-13 15 views
1

Если я используюПочему strtolower() не следует PHP строгий стандарт

strtolower(end(explode('.',$_FILES['file']['name']))); 

он дает мне ошибку

PHP Строгие стандарты: только переменные должны быть переданы по ссылке в

Я думал, что я просто храню значения в переменных сначала, а затем использую взрываются

$filename = $_FILES['file']['name']; 
$filearray = explode('.',$filename); 

и она отлично работает

Но у меня есть еще одна линия

strtolower(end($filearray)); 

Я думал, что он должен дать мне ту же ошибку, я имею в виду, я должен сначала сохранить end($filearray) в переменной затем используйте эту переменную в strtolower(),

Но это не дает мне никаких ошибок. Поэтому почему strtolower() принимает функцию as параметр, и не давая ошибки, может кто-нибудь объяснить почему?

+0

BTW: полностью оффтопик, но raina77ow дал вам уже правильный ответ. Но посмотрите на pathinfo для вашего case => pathinfo ($ _ FILES ["file"] ["name"]). Дает вам массив со всем, что вам нужно (dirname, filename, extenstion и basename) http://php.net/manual/de/function.pathinfo.php –

ответ

5

Это не strtolower, который дает вам предупреждение - но end функция. Цитируя docs: конец

() продвигает внутренний указатель массива на последний элемент, и возвращает его значение. [...] Массив передается по ссылке, потому что он изменен функцией. Это означает, что вы должны передать ему реальную переменную , а не функцию, возвращающую массив, потому что только действительные переменные могут передаваться по ссылке.

В первом примере вы пытаетесь end результат explode вызова - то есть, а не действительной переменной. Хотя PHP может игнорировать такой вариант использования, он обычно означает, что вы сделали что-то по ошибке - и предупреждение E_STRICT пытается уведомить вас об этом.

Ваш третий пример отлично работает, потому что:

1) strtolower фактически не заботится о ссылке. Он возвращает строку со всеми алфавитными символами, преобразованными в нижний регистр, вместо изменения строки на месте.

2) end имеет переданную переменную - массив. Он возвращает свой последний элемент, продвигая внутренний указатель этого массива, ну, его конец. Вы пытались использовать этот внутренний указатель (с current или другими способами), вы увидите разницу.


Как Sidenote (уже упоминалось в комментариях по @DoktorOSwaldo), вы можете заменить материал все explode(end() простой pathinfo вызова:

$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION)); 
+0

Но тогда функция 'strtolower' принимается как ссылка. Почему это не ошибка? Можете ли вы подробнее рассказать? – rachmatsasongko

+0

Он не получил _функции_. Он получил результат вызова функции - последний элемент '$ filearray'. Тем временем внутренний указатель '$ filearray' был перенесен в последний элемент. – raina77ow

+0

Да, я просто прочитал дополнительное объяснение. +1 – rachmatsasongko

1

Поскольку некоторые функции в PHP передаются в качестве ссылки. конец является одной из этих функций. см. документ: http://php.net/manual/en/function.end.php

Но функция strtolower получает только обычный параметр.

Так почему же функция end получает ссылку? Конец не просто вернет последний элемент, но также переместит внутренний указатель массива к последнему элементу. поэтому, если вы вызываете текущий функция после конец функция вы получите последний элемент. Таким образом, в основном функция конца будет изменять массив, переданный в параметре. И поэтому он должен быть переменной, которую он может изменить, чтобы получить ссылку.

 Смежные вопросы

  • Нет связанных вопросов^_^