可能重复:
如何在PHP中检查文件是ASCII还是二进制文件
我有一个函数可以接受一个图片文件的名称(普通字符串),或者直接接受作为二进制字符串的图像字节。就像使用file_get_contents
函数返回的那样。
如何区分这两种情况?
可能重复:
如何在PHP中检查文件是ASCII还是二进制文件
我有一个函数可以接受一个图片文件的名称(普通字符串),或者直接接受作为二进制字符串的图像字节。就像使用file_get_contents
函数返回的那样。
如何区分这两种情况?
如果您只使用 ASCII 字符的 32 到 126,并且没有任何对 Unicode 字符的期望,您可以检查输入是否仅由可打印字符组成。您可以使用 ctype_print() 来实现这一点。
if (ctype_print($filename)) { // this is most probably not an image
你也可以检查参数是否是有效的图像,或者是否存在一个以该名称命名的文件。
但创建两个不同的函数会更好、更可靠:
在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
}
然而,我认为使用适当命名的函数更容易处理,否则,如果您仅使用类进行类型区分,则会使事情变得不必要地复杂。