Как проверить, является ли это обычная строка или двоичная строка в PHP?
Возможный дубликат:
Как проверить, является ли файл ASCII или двоичным в PHP
У меня есть функция, которая принимает либо имя файла изображения (т.е. нормальную строку), либо может принимать байты изображения в виде двоичной строки. Как возвращено file_get_contents
.
Как я могу различать два?
Ответы
Ответ 1
Вы можете проверить, состоит ли вход, состоящий только из печатных символов. Вы можете сделать это с помощью ctype_print():
if (ctype_print($filename)) { // this is most probably not an image
Вы также можете проверить, является ли аргумент допустимым изображением, или если файл с таким именем существует.
Однако было бы лучше и надежнее создать две отдельные функции:
- load_image_from_string(), который всегда принимает изображение как параметр
- и load_image_from_file(), которые будут читать файл и вызывать load_image_from_string()
Ответ 2
В PHP все строки являются двоичными (начиная с текущего PHP 5.3), поэтому нет никакого различия. Таким образом, вы не можете отличить, если аргумент - это двоичные данные или имя файла технически (строка или строка).
Однако вы можете создать вторую функцию, которая обрабатывает файлы, которые повторно используют функцию, связанную с данными изображения. Таким образом, имя функции указывает, какой параметр он ожидает.
Если вам необходимо принять решение на основе типа, переданного как параметр функции, вы должны добавить контекст к данным. Один из способов - сделать параметры определенного типа:
abstract class TypedString
{
private $string;
public final function __construct($string)
{
$this->string = (string) $string;
}
public final function __toString()
{
return $this->string;
}
}
class FilenameString extends TypedString {}
class ImageDataString extends TypedString {}
function my_image_load(TypedString $string)
{
if ($string instanceof FilenameString)
{
$image = my_image_load_file($string);
}
elseif ($string instanceof ImageDataString)
{
$image = my_image_load_data($string);
}
else
{
throw new Exception('Invalid Input');
}
# continue loading the image if needed
}
function my_image_load_file($filename)
{
# load the image from file and return it
}
function my_image_load_data($data)
{
# load the image from data and return it
}
Однако я считаю, что проще иметь дело с правильными именованными функциями, иначе вы делаете ненужные вещи, если используете классы только для дифференциации типов.