Php 我应该避免一长串IF语句吗?

Php 我应该避免一长串IF语句吗?,php,optimization,if-statement,Php,Optimization,If Statement,我应该避免在代码中有一长串序列化的IF语句吗?有时这似乎是不可避免的,但我不知道这是否只是我的经验不足 例如,如果您正在处理用户上传的图像,并且希望对任何错误提供准确的反馈,您可能会遇到以下情况: if($file["size"] == 0) { throw new Exception("ERROR: File was empty"); } if (($file["type"] != "image/gif") || ($file["type"] != "image/jpeg") ||

我应该避免在代码中有一长串序列化的IF语句吗?有时这似乎是不可避免的,但我不知道这是否只是我的经验不足

例如,如果您正在处理用户上传的图像,并且希望对任何错误提供准确的反馈,您可能会遇到以下情况:

if($file["size"] == 0) { 
    throw new Exception("ERROR: File was empty");
}

if (($file["type"] != "image/gif")
|| ($file["type"] != "image/jpeg")
|| ($file["type"] != "image/pjpeg")
|| ($file["type"] != "image/png")) {
    throw new Exception("ERROR: Image must be either GIF, PNG or JPEG!");
}

if ($file["size"] > 2000000) {
    throw new Exception("ERROR: Image must be than less 2MB!");
}

    if ($file["error"] > 0) {
    throw new Exception("UNKNOWN ERROR: ".$file['error']);
}

$imgDetails = getimagesize($file["tmp_name"]);

if($imgDetails['channels'] != 3){
    throw new Exception("ERROR: Image must be RGB.)";
}

if($imgDetails['0'] < 50 && $imgDetails['1'] < 50) {
    throw new Exception("ERROR: Image must be larger then 50 x 50.)";           
}
如果($file[“size”]==0){
抛出新异常(“错误:文件为空”);
}
如果($file[“type”]!=“image/gif”)
||($file[“type”]!=“image/jpeg”)
||($file[“type”!=“image/pjpeg”)
||($file[“type”!=“image/png”)){
抛出新异常(“错误:图像必须是GIF、PNG或JPEG!”);
}
如果($file[“size”]>2000000){
抛出新异常(“错误:图像必须小于2MB!”);
}
如果($file[“error”]>0){
抛出新异常(“未知错误:.$file['ERROR']);
}
$imgDetails=getimagesize($file[“tmp_name”]);
如果($imgDetails['channels'!=3){
抛出新异常(“错误:图像必须是RGB”);
}
如果($imgDetails['0']<50&$imgDetails['1']<50){
抛出新异常(“错误:图像必须大于50 x 50”);
}
直到文件最终通过所有测试并得到处理


这是“糟糕的做法”吗?

您可以创建一个限制集合,并编写代码来检查该集合,而不是列出任意限制

虽然我忘记了在javascript中执行此操作的方法,但类似于


希望这有点帮助>/p>我发现通常你所说的if链可以变形为函数的hashmap,其中一些选择器是它们的键

如果您有一个类似于
$processImage={“image/gif”=>函数processGIF(){blah}}
的哈希映射,那么您可以访问O(1)中的每个函数,而不是O(n/2)平均值(假设调用的正态分布也是不准确的)。不可否认,这并不重要,除非它经常发生

然后您可以使用
$processImage[“image/gif”]()调用该函数(我认为这是有效的语法,近年来我做的JS比php多得多。)

不过,我确实发现hashmap方法也具有很好的可扩展性和可读性,所以它就是这样


当然,重构它们是有好处的。。但在许多情况下,这样做的好处是最小的/根据情况而定的。

您可以使用数组中的
来缩短类型检查,但通常这是一种很好的形式,但将输出直接推出此函数除外。如果对类执行此操作,您可能希望使用异常,而不是直接推送错误输出


尽早返回,经常返回。

这是PHP,不是Javascript。听起来很明智!:)我读了一些关于例外情况的文章,这个博客完全把我弄糊涂了。以上是什么类型的例外。。。?这取决于你想走多远。如果您只想传递一条消息,那么可以使用基本异常类。设置异常类可以让您以不同的方式处理每种类型的异常,这可能是不需要的。谢谢,我现在更新了这个问题——只是为了更好地衡量:)