Только переменные должны быть переданы по ссылке
// 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'
);
Есть идеи? Через 2 дня все еще застрял.
14 ответов
Назначить результат explode
к переменной и передать эту переменную end
:
$tmp = explode('.', $file_name);
$file_extension = end($tmp);
Проблема в том, что end
требует ссылки, потому что это изменяет внутреннее представление массива (то есть делает указатель текущего элемента указателем на последний элемент).
Результат explode('.', $file_name)
не может быть превращен в ссылку. Это ограничение в языке PHP, которое, вероятно, существует по причинам простоты.
Все остальные уже сообщили вам причину, по которой вы получаете ошибку, но вот лучший способ сделать то, что вы хотите сделать:$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
Php 7-совместимое правильное использование:
$fileName = 'long.file.name.jpg';
$tmp = explode('.', $fileName);
$fileExtension = end($tmp);
echo $fileExtension;
// jpg
Сохранить массив из explode() в переменную, а затем вызвать end() для этой переменной:
$tmp = explode('.', $file_name);
$file_extension = end($tmp);
кстати: я использую этот код, чтобы получить расширение файла:
$ext = substr( strrchr($file_name, '.'), 1);
где strrchr
извлекает строку после последнего .
а также substr
отрезает .
Ответ, данный в другом месте,
$tmp = explode('.', $fileName);
$file_extension = end($tmp);
правильный и действительный. Он выполняет то, что вы пытаетесь сделать.
Почему?
Функция делает не совсем то, что вы думаете. Это связано с тем, как PHP
Для использования у вас должен быть реальный массив, к которому прикреплен (обычно незаметно) текущий указатель элемента. В
Результат не является фактическим массивом. Это выход функции. Следовательно, вы не можете бежать
Просто установите вывод
Так что насчет скобок?
Это не ошибка. Еще раз, это требование языка.
Дополнительные круглые скобки (например,
Это еще одно правильное и действенное решение. Возможно, это лучшее решение, поскольку занимает меньше места. Хороший рецензент или сопровождающий должен внимательно следить за тем, что вы пытаетесь сделать, когда они видят лишние скобки.
Если вы используете линтер или программу SCA, такую как PHPCS, дополнительные скобки могут не понравиться, в зависимости от используемого вами профиля линтинга. Это ваш линтер, скажите ему, что вы хотите, чтобы он сделал для вас.
В некоторых других ответах также перечислены такие вещи, как оператор распространения или
Я просто использую
приставка
Это решение действительно, но неверно. Это действительно так, потому что это решает проблему. Вот и все его достоинства.
Подавление ошибок - всегда плохая практика. На то есть много причин. Одна очень большая проблема заключается в том, что вы пытаетесь подавить одно конкретное условие ошибки (созданное вами), но префикс подавления ошибок подавляет все ошибки.
В этом случае вам, вероятно, это сойдет с рук. Тем не менее, плохие программные привычки - это обман и, скорее всего, в будущем заставит вас обманывать все больше и больше. Вы будете нести ответственность за неверный код. Но я не кодовая полиция, это ваш кодекс. Это действительно так, потому что это решает проблему.
Хорошо, а какой ответ лучше?
Делайте то, что предлагает @ryeguy . Не выполняйте манипуляции со строками для решения четко определенной проблемы, которую платформа уже решает за вас. Использовать
Это имеет дополнительное преимущество, заключающееся в том, что он действительно делает то, что вы хотите, а именно находит расширение в имени файла. Есть небольшая разница.
Вы получаете текст после последней точки. Это отличается от поиска расширения файла. Учтите имя файла,
Еще раз, я не полиция кодекса. Делай то, что тебе больше всего подходит.
Так как он поднимает флаг более 10 лет, но работает нормально и возвращает ожидаемое значение, небольшой оператор stfu - самая хорошая плохая практика, которую вы все ищете:
$file_extension = @end(explode('.', $file_name));
end(...[explode('.', $file_name)])
работает с PHP 5.6. Это задокументировано в RFC, но не в самих документах PHP.
Попробуй это:
$parts = explode('.', $file_name);
$file_extension = end($parts);
Причина в том, что аргумент в пользу end
передается по ссылке, так как end
изменяет массив путем перемещения его внутреннего указателя на последний элемент. Если вы не передаете переменную, нет ничего для ссылки, на которую можно указать.
Увидеть end
в руководстве по PHP для получения дополнительной информации.
PHP жалуется, потому что end()
ожидает ссылку на что-то, что он хочет изменить (которая может быть только переменной). Однако вы передаете результат explode()
прямо к end()
без сохранения сначала в переменную. В тот момент, когда explode()
возвращает ваше значение, оно существует только в памяти и никакая переменная не указывает на него. Вы не можете создать ссылку на что-то (или что-то неизвестное в памяти), что не существует.
Или другими словами: PHP не знает, является ли значение, которое вы ему даете, является прямым значением или просто указателем на значение (указатель также является переменной (целым числом), в которой хранится смещение памяти, где находится фактическое значение проживает). Так что PHP ожидает здесь указатель (ссылку) всегда.
Но так как это все еще просто уведомление (даже не рекомендуется) в PHP 7, вы можете спокойно игнорировать уведомления и использовать оператор игнорирования вместо полной деактивации отчетов об ошибках для уведомлений:
$file_extension = @end(explode('.', $file_name));
Точно так же, как вы не можете сразу индексировать массив, вы также не можете вызвать end для него. Сначала назначьте его переменной, затем вызовите end.
$basenameAndExtension = explode('.', $file_name);
$ext = end($basenameAndExtension);
Официальное руководство по PHP: end()
параметры
array
Массив. Этот массив передается по ссылке, потому что он модифицируется функцией. Это означает, что вы должны передавать ей реальную переменную, а не функцию, возвращающую массив, потому что только реальные переменные могут передаваться по ссылке.
предполагать:
function endSimulator (&$var) {
echo $var;
}
function explodeSimulator ($var) {
return $var;
}
теперь, в противоречии сexplodeSimulator
который может получить «выходные данные функций», которые вы можете передатьendSimulator
только по переменным, иначе php говорит: «только переменные должны передаваться по ссылке», вы можете проверить это с помощью кода ниже:
endSimulator(explodeSimulator(":)")); // warnings arise
почему?
потому что когда php достигает "& символа", он ищет после него "указатель на sth (переменную в общих чертах)", любая переменная является "указателем" (на перимитив или ссылку - см. дополнительную информацию), но функции могут быть оценивать значения, а не указатели! (хотя я думаю, что в javascript они указывают на переменную с тем же именем, что и соответствующая функция),
другими словами, когда вы используетеendSimulator(explodeSimulator(":)"))
, переводчик вижу что-то вродеendSimulator(":)")
, как вы знаете, вы не можете отправить ":)" в функцию, которая просто получает указатели,
поэтому, наконец, вы можете решить это следующим образом:
$explodeSimulatorOutput = explodeSimulator(":)");
endSimulator($explodeSimulatorOutput);
Дополнительная информация
Я думаю, что многие здесь неоднозначно относятся к фразе «передавать по ссылке». Обратите внимание, что «передается по ссылке» — это общая идея, и ее можно использовать в самых разных ситуациях, например:
a=10 // a <-- 10;
// content of a is passed by a value into it
b="a" // b <-- "a";
// content of b is passed by a value into it
obj = {a,b} // obj <-- {} <-- 10,"a";
// content of obj is passed by a reference (which is {}) into it
function func1 (var) {...}
// the "var" variable is passing by value
function func2 (&var) {...}
// the "var" variable is passing by reference into the function
«передача по ссылке» в этой теме относится к концепцииfunc2
нетa
,b
илиobj
Во-первых, вам нужно будет сохранить значение в такой переменной
$value = explode("/", $string);
Затем вы можете использовать функцию конца, чтобы получить последний индекс из массива, как это
echo end($value);
Я надеюсь, что это будет работать для вас.
$file_extension = end(explode('.', $file_name)); // ОШИБКА НА ЭТОЙ ЛИНИИ
изменить эту строку как,
$ file_extension = end ((взорваться ('.', $ file_name))); // нет ошибок
Техника проста, пожалуйста, поставьте еще одну скобку для взрыва,
(взорваться ()), тогда только он может выполнять самостоятельно..