最近,我们查看了数千个项目的数据库,创造了PHP运用程序中的前10个缺点。我们将向您展示导致它们的缘故原由以及如何预防它们。避免这些“陷阱”将使您成为更好的开拓职员。
由于数据为王,我们网络,剖析并排名前十大PHP缺点。Rollbar网络每个项目的所有缺点,并总结每个项目发生的次数。我们通过根据指纹对缺点进行分组来实现此目的。如果第二个缺点只是第一个缺点的重复,我们将两个缺点分组。这为用户供应了一个很好的概述,而不是像在日志文件中看到的那样压倒性的大转储。
我们关注的是碰着缺点的项目数量,由于我们希望看到影响不同公司中大多数开拓职员的缺点。如果我们只查看每个缺点发生的次数,那么大批量客户可能会由于与大多数读者无关的缺点而压倒数据集。以下缺点最有可能影响您和您的公司。
我们将从最常见的开始更详细地描述每个缺点。末了,我们将分享最佳实践,以避免将其投入生产。
1. PHP解析缺点:语法缺点,意外的文件结束实行包含语法缺点的代码时,会发生解析缺点。语法缺点不须要很大,也不要繁芜,如下例所示。
$ test = “test”
代码将抛出,\"大众PHP Parse error: syntax error, unexpected end of file由于它在语句末端短缺分号。以下示例将成功实行。
$ test = “test” ;
2. E_WARNING:为foreach()供应的参数无效PHP foreach布局在PHP 4中引入,供应了一种迭代数组和可迭代工具的大略方法,例如实现\Traversable接口的工具。考试测验在具有不同数据类型或未初始化变量的变量上利用它。它将发出错误,例如下面的示例。
$ y_exceptions = null ;
foreach($ y_exceptions as $ thisException){
}
上面的代码抛出与“()供应的foreach无效参数”警告,由于$y_exceptions不是数组也不实现ArrayAccess,\Traversable或任何其它可迭代接口。
3. QueryException:SQLSTATE [23000]:完全性约束违例当我们的代码考试测验实行基于数据库架构违反完全性约束的SQL操作时,会发生非常。出于多种缘故原由可能会导致此缺点,包括考试测验将重复的主键值插入表中,或者不为一个或多个必需列供应值。
CREATE TABLE testtable(
user_name varchar(255)NOT NULL PRIMARY KEY,
password varchar(255)
);
$ user_name = “test” ;
$ data = array('user_name' => $ user_name);
DB :: table('testtable')- > insert($ data);
$ data = array('user_name' => $ user_name);
DB :: table('testtable')- > insert($ data);
在上面的示例中testtable有一个user_name具有主键约束的列。我们正在考试测验在user_name列中插入重复值。
4. QueryException:SQLSTATE [42S22]:找不到列当您的代码考试测验在未定义的列上操作时,可能会发生另一个非常。以下示例演示了这一点。
$ user_name = “test” ;
$ data = array('user_name' => $ user_name,'password' => $ password);
DB :: table('testtable')- > insert($ data);
在这种情形下,它抛出一个“未找到列”非常,由于我们试图将一个值插入到testtable不存在的密码列中。
5. GuzzleHttp \ Exception \ ClientException:客户端缺点Guzzle是一个PHP库,它使创建HTTP客户端以发送HTTP要乞降与Web做事集成变得微不足道。如果在传输考试测验期间发生缺点,则会抛出非常。详细来说,如果要求选项设置为true ,它将抛出一个GuzzleHttp ClientException来处理HTTP 400缺点http_errors。
此非常的扩展BadResponseException和GuzzleHttp\Exception\BadResponseException从延伸RequestException。以下示例有助于我们理解缺点。
$ client = new \ GuzzleHttp \ Client();
$ res = $ client - > request('GET','https://httpbin.org/status/404');
该示例抛出客户端非常“客户端缺点:GET https://httpbin.org/status/404导致404 NOT FOUND相应”。
此类缺点的根本缘故原由可能如下:
要求语法缺点。缺点的API版本。不支持的媒体类型。可以利用try catch块处理它们。以下示例显示了如何实行此操作。
try{
$ client - > request('GET','https://httpbin.org/status/404');
} catch(ClientException $ e){
echo Psr7 \ str($ e - > getRequest());
echo Psr7 \ str($ e - > getResponse());
}
您可以看到代码包含在try / catch块中,它将捕获任何ClientException抛出的代码。您可以扩展此示例以捕获其他更详细的扩展,例如上面提到的扩展。
6. GuzzleHttp \ Exception \ ServerException:做事器缺点这是Guzzle可以抛出的另一种非常。一个ServerException当被抛出HTTP 500缺点如果http_errors要求选项设置为true碰着。
$ client = new \ GuzzleHttp \ Client();
$ res = $ client - > request('GET','https://httpbin.org/status/503');
上面的示例抛出客户端非常“做事器缺点:
GET https://httpbin.org/status/503导致503 SERVICE UNAVAILABL相应”,由于该做事不可用。
此类缺点的根本缘故原由可能因此下任何一种:
您要求的格式或做事暂时不可用。您的做事器收到了您考试测验访问的做事器的缺点。这被称为“缺点网关”缺点。不支持您哀求的HTTP协议。ServerException,也可以通过利用try / catch块,如不才面的例子中进行处理。
try {
$ client - > request('GET','https://httpbin.org/status/503');
} catch(ServerException $ e){
echo Psr7 \ str($ e - > getRequest());
echo Psr7 \ str($ e - > getResponse());
}
正如前面的示例中捕获的一样ClientException,此示例将捕获ServerExceptions由于调用$client要求方法而导致的任何抛出。
7. QueryException:SQLSTATE [42S02]:基表或未找到视图当您的代码考试测验在不存在的数据库表上运行或(由于某种缘故原由)无法找到时,可能会抛出查询非常“基表或未查找的视图”。看看下面的例子。
$ user_name = “test” ;
$ data = array('user_name' => $ user_name);
DB :: table('testtable')- > insert($ data);
在我的情形下,它抛出,“SQLSTATE [42S02]:未找到基表或视图:1146表”由于我们试图将数据插入到数据库中不存在的表中。确保表首先涌现,以避免这些非常。或者,与前两个示例一样,将调用包装在try / catch块中,该块将捕获QueryException,如下例所示。
$ user_name = “test” ;
$ data = array('user_name' => $ user_name);
try {
DB :: table('testtable')- > insert($ data);
} catch(QueryException $ e){
printf(“发生缺点:%s \ n”,$ e-> getMessage());
}
8. PDOException:谢绝SQLSTATEHY000连接PDOExceptions代表PDO(PHP数据工具)引发的缺点,正如PHP手册所描述的那样,它是“ 用于访问PHP数据库的轻量级,同等的接口 ”。
“PDOException:Connection refused”的可能根本缘故原由可能因此下之一:
您没有足够的权限来访问数据库或以该用户身份实行该操作。您的数据库参数(做事器名称〜主机名和/或端口号,用户名,密码,数据库名称)禁绝确。您拥有数据库的做事器无法访问 - 它可能处于脱机状态。9. BadMethodCallException:调用Undefined Method在PHP中,当您考试测验调用类的未定义方法时,会发生“BadMethodCallException:调用未定义方法”缺点。看看下面的例子。
class Card {
}
var_dump(Card :: all());
上面的代码将抛出“BadMethodCallException:调用未定义的方法”,由于我们正在考试测验调用类all中尚不存在的方法Card。要避免这种非常,请确保在类中定义了被调用的方法。或者,您可以实现__call magic方法来处理对未定义方法的调用。但是,这种方法可能会变得混乱。
10. QueryException:SQLSTATE [42000]:语法缺点或访问冲突当您考试测验实行的SQL查询在语法上禁绝确时,会发生此类缺点。下面的示例将抛出错误“语法缺点或访问冲突”,由于select查询语句在语法上是禁绝确的。在这种情形下,from短缺关键字。
$ cards = DB :: select(“SELECT testtable”);
如果用户没有权限对数据库实行操作,也会发生此非常。如果用户没有插入权限,下面的示例将引发缺点。
$ user_name = “test” ;
$ data = array('user_name' => $ user_name);
DB :: table('testtable')- > insert($ data);
结论有几种开拓最佳实践可以帮助您避免在生产中碰着这些缺点。首先是利用像PhpStorm这样的好IDE ,它可以帮助您在开拓过程中利用和纠正语法。这将帮助您避免解析缺点进入生产。
另一个最佳实践是利用单元和集成测试工具,例如PHPUnit,Codeception,Behat和Selenium。这些可以帮助您防止生产代码(假设您精确支配),个中包含缺点。
HTTP做事器缺点等一些缺点并不是完备可以避免的。但是,编写良好的运用程序将优雅地处理它们,例如捕获它们并向用户显示缺点。
我们希望您学到了新的东西,并且可以更好地避免将来涌现缺点。我们也希望本指南可以帮助您办理您一贯在努力办理的问题。
理解影响用户的缺点并得到快速办理问题的好工具非常主要。Rollbar使您可以查看生产PHP缺点,并为您供应更多高下文以快速办理它们。例如,它供应了其他调试功能,如遥测和局部变量值,这使得它更随意马虎调试。