我的函数接受图像文件的名称(即普通字符串),或者它可以直接接受图像字节作为二进制字符串。由file_get_contents
返回。
我如何区分这两者?
答案 0 :(得分:15)
您可以检查输入是否仅由可打印字符组成。你可以用ctype_print():
来做到这一点if (ctype_print($filename)) { // this is most probably not an image
您还可以检查参数是否是有效图像,或者是否存在具有该名称的文件。
然而,创建两个单独的函数会更好,更可靠:
答案 1 :(得分:1)
在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
}
但是我认为更容易处理正确的命名函数,否则如果你只使用 类型区分类,你就会使事情变得不必要复杂。