我们不讨厌PHP

2020-07-18 01:00:10

在Hologram这里,我们对后端堆栈使用两种主要的编程语言:PHP和Python。我们的PHP组件是用户最容易看到的组件,因为它是我们的整个REST API。

我们确实收到了一些问题,为什么我们要在如此重要的角色中使用PHP,因为传统观点认为PHP已经过时或笨重。我的观点是PHP受到这种观点的影响有两个原因:

人们早在2005年就学会了它,当时它还是一门年轻的语言,缺乏许多真正有用的或共同的功能,如类。

为了保持兼容性,许多流行的应用程序*咳嗽*Wordpress*咳嗽*没有利用很多新的东西,人们不得不在引入许多伟大的新功能之后很久才继续攻击老式的PHP。

正因为如此,我想为PHP辩护,认为它是一种非常有用的语言,非常适合我们的需求。

我想很多人已经知道PHP有一些很好的内置Web服务器功能,比如用于获取HTTP标头或内置会话cookie支持的全局数组,但他们可能不知道很多其他功能,这些功能使PHP总体上成为一种可靠的语言。

是的,在过去,PHP没有类,事情很快就会变得一团糟。我记得有一长串的include调用来拉入您需要的所有函数,并且必须不断地将大量参数传递给名称非常长的函数。

嗯,不要害怕;PHP现在有很好的对象支持。类、构造函数、析构函数、命名空间、继承等等。

但除此之外,它还介绍了PHP的一个更独特的伟大特性:

PHP有一个很有用的特性,如果类还没有装入,它可以自动装入类的文件。这意味着在所有文件的顶部不再有include/Required语句块。如果您使用一个类,那么它就会被加载。

就其本身而言,这已经很不错了,但是改变游戏规则的是,特定的自动加载逻辑可以在您的应用程序中完全定制,并且可以将多个自动加载程序链接在一起。这意味着您的所有第三方库也会自动加载。

在您的代码中,您只需创建类或调用它们的方法,一切都会自动完成。不需要手动包含任何内容,也不需要像在其他语言中那样使用包含路径。在测试代码之外的整个全息代码库中,我们可能会调用include()或request()两次。

PHP的包管理系统可以与其他语言的包管理系统相媲美。我们在全息图上使用的那个叫Composer,这是最流行的一个。它使用起来极其简单,并将所有设置存储在JSON文件中。您可以为每个包指定使用的版本范围,如果您想要格外小心地确保每个人都使用完全相同的包版本,它将生成一个可以签入repo的锁定文件。

要将新包添加到JSON文件并安装它,非常简单。

PHP现在有一个很棒的开发人员社区,所以不仅有大量的单独的库可以使用,而且有完整的框架可以帮助您更轻松地构建应用程序。在Hologram,我们使用Slim Framework,它有一个非常简单的路由器来定义我们的API调用,以及其他有用的功能,比如添加中间件的简单方法,这对身份验证和速率限制代码很方便。

PHP是我使用过的所有语言中最好的数据库集成,而PDO是它的基石。PDO代表PHP数据库对象,它是执行SQL查询的首选方式。

它包括用于运行查询和对结果进行分页的所有常用函数。行可以作为PHP关联数组返回,这意味着所有列在数组本身中都有正确的标签。

最好的部分是它支持参数化查询,并自动为您清理输入。这意味着您可以执行以下操作:

//将$DATABASE定义为PDO对象$stmt=$database->;prepare(";select*from user where id=?;";);$result=$stmt->;Execute([$idnumber]);$row=$result->;fetchAll();

PDO将自动替换该“?”使用$idnumber中的值,它将正确地进行转义,以防止SQL注入攻击。

//将$DATABASE定义为PDO对象$VALUES=[';id';=';Email';=&>;#39;=&>;ome [email protected]';];$stmt=$database->;Prepare(';SELECT*FROM USERS WHERE Where id=:id and email=:email;';);$result=$stmt->;EXECUTE($VALUES);$ROWS。

在这种情况下,PDO将正确替换该数组中的参数,同时仍对其进行清理。

PDO还公开所有相同的接口,而不考虑底层数据库引擎。当然,引擎之间偶尔会有SQL差异,但大多数情况下,您只需在初始连接时指定数据库类型,然后进行与其他任何操作相同的所有函数调用。

谈到数据库,我想提到一个非常棒的第三方库,我们使用名为Phinx的库来完成所有的数据库迁移。任何时候我们需要进行模式更改时,我们都会完全使用PHP代码进行定义,然后Phinx会在数据库上运行这些代码。迁移如下所示:

在PHP中使事情变得更容易、更快的最后一个方面是所有强大的内置实用程序函数。

假设您有一个来自数据库的结果集,该结果集将是行数组的数组。您希望从每个数据库中提取名称列。当然,您可以使用PHP也支持的map函数来实现这一点,但是为什么不使用简单的方法:

‍‍就是这样。而且速度非常快,因为这些都是在PHP的C内部运行的。

类似的还有几十种,从执行更多的数组操作到解析XML再到操作上传的文件,PHP都有关于它们的很好的文档。

DateTime-一个完整的类,用于处理日期,还可以解析简单的英文日期描述,如“下月的午夜第一天”

Str_getcsv-内置CSV解析的一部分,它从字符串中读取CSV行。

别忘了有用的运算符,比如??它允许您在指定默认值的同时检查数组中是否存在索引。