最近,我们查看了数千个项目的数据库,创造了PHP运用程序中的前10个缺点
我们将向您展示导致它们的缘故原由以及如何预防它们。
避免这些“陷阱”将使您成为更好的开拓职员。

由于数据为王,我们网络,剖析并排名前十大PHP缺点。
Rollbar网络每个项目的所有缺点,并总结每个项目发生的次数。
我们通过根据指纹对缺点进行分组来实现此目的。
如果第二个缺点只是第一个缺点的重复,我们将两个缺点分组。
这为用户供应了一个很好的概述,而不是像在日志文件中看到的那样压倒性的大转储。

我们关注的是碰着缺点的项目数量,由于我们希望看到影响不同公司中大多数开拓职员的缺点。
如果我们只查看每个缺点发生的次数,那么大批量客户可能会由于与大多数读者无关的缺点而压倒数据集。
以下缺点最有可能影响您和您的公司。

psr7php项目标10年夜PHP毛病以及若何避免这些毛病 HTML

我们将从最常见的开始更详细地描述每个缺点。
末了,我们将分享最佳实践,以避免将其投入生产。

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缺点,并为您供应更多高下文以快速办理它们。
例如,它供应了其他调试功能,如遥测和局部变量值,这使得它更随意马虎调试。