Как проверить, является ли это обычная строка или двоичная строка в 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
}

Однако я считаю, что проще иметь дело с правильными именованными функциями, иначе вы делаете ненужные вещи, если используете классы только для дифференциации типов.