Если я использую
strtolower(end(explode('.',$_FILES['file']['name'])));
это дает мне ошибку
Строгие стандарты PHP: только переменные должны передаваться по ссылке в
Я думал, что хорошо, я просто храню значения в переменных сначала, а затем использую Explode
$filename = $_FILES['file']['name'];
$filearray = explode('.',$filename);
и работает нормально
Но у меня есть другая линия
strtolower(end($filearray));
Я думал, что это должно дать мне ту же ошибку, я имею в виду, что я должен сначала сохранить end($filearray)
в переменной, затем используйте эту переменную в strtolower()
,
Но это не дает мне никакой ошибки, так почему strtolower()
Принимая функцию в качестве параметра, а не выдавая ошибку, может кто-нибудь объяснить, почему?
Это не strtolower
это дает вам предупреждение — но end
функция. Цитируя документы:
end () продвигает внутренний указатель массива до последнего элемента, и
возвращает свое значение. […] Массив передается по ссылке, потому что он
модифицируется функцией. Это означает, что вы должны передать это реальным
переменная, а не функция, возвращающая массив, потому что только фактическая
переменные могут быть переданы по ссылке.
В вашем первом примере вы пытаетесь end
результат explode
вызов — т.е. не настоящая переменная. Хотя PHP может игнорировать такой вариант использования, он обычно означает, что вы сделали что-то по ошибке — и предупреждение E_STRICT пытается уведомить вас об этом.
Ваш третий пример работает нормально, потому что:
1) strtolower
на самом деле не заботится о ссылке. Это возвращается строка со всеми буквенными символами, преобразованными в нижний регистр вместо изменения строки на месте.
2) end
имеет переданную переменную — массив. Он возвращает свой последний элемент, одновременно продвигая внутренний указатель этого массива до его конца. Вы пытались использовать этот внутренний указатель (с current
или каким-либо другим способом), вы увидите разницу.
В качестве обозначения (уже упоминалось в комментариях @DoktorOSwaldo), вы можете заменить все explode(end()
вещи с простым PathInfo вызов:
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
Потому что некоторые функции в php передаются как ссылки. конец является одной из тех функций. смотри документ: http://php.net/manual/en/function.end.php
Но strtolower Функция получает только нормальный параметр.
Так почему же конец функция получает ссылку? Конец не только вернет последний элемент, но также переместит внутренний указатель массива на последний элемент. так что если вы позвоните ток функция после конец Функция вы получите последний элемент.
Таким образом, в основном функция конца изменяет массив, переданный в параметре. И поэтому это должна быть переменная, которую можно изменить, чтобы получить в качестве ссылки.