HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

为什么我们青睐 PHP?

  • 2020-07-29
  • 本文字数:2660 字

    阅读完需:约 9 分钟

为什么我们青睐PHP?

Hologram,我们后端服务的搭建主要使用了两种编程语言:PHP 和 Python。 其中,PHP 组件最接近用户层,它提供了所有服务的 REST API 接口。


有人曾向我们提出疑问:大家都在唱衰 PHP,认为它“不仅笨重而且过时”,为什么你们还会重度使用 PHP?在我看来,PHP 得到这样评价的原因有两个:


  1. 人们早在 2005 年就开始使用它,当时它是一门非常年轻的语言,缺少很多真正有用或通用的功能特性,例如缺少对面向对象的特性支持。

  2. 为保持较好的兼容性,许多流行的应用程序(比如 Wordpress),它们并没有充分利用该语言的很多新功能特性,即使 PHP 的很多新功能特性发布很久了,开发人员仍然坚持使用老版本的 PHP。


虽然上述问题客观存在,但是我仍然想为 PHP 辩护一下——PHP 仍然是一门非常有用的编程语言,并且非常适合我们的需求。


我们都已经知道 PHP 具有一些不错的内置 Web 服务功能,例如可以获取 HTTP Header 信息、完整的 session cookie 支持等。但是,可能很多人不知道,PHP 在编程语言界仍占有一席之位,这与它的一些其他功能特性有关。接下来,我要阐述 PHP 的一些优点。

面向对象!

PHP 的早些版本不支持类对象,因此,代码很容易变得混乱起来。没有面向对象,我们就需要写一大串的 include 来引用需要的一些方法函数,并且还必须不断地将大量的参数变量传递给名称很长的函数。


现在,你无需有上面这种担心。如今的 PHP 具有强大的面向对象支持,包括类、构造函数、析构函数、命名空间和继承等所有必须的功能。


除此之外,PHP 具备一些特有的强大功能。

自动加载器

PHP 有一个非常有用的功能特性,如果某个类尚未加载,它可以自动加载该类的文件。这意味着在所有文件的头部可以不再包含 include / require 语句块。如果你要使用一个类对象,那么它已经被自动加载了。


就其本身而言,这已经非常好了,但是更高级的使用场景是,在你的应用程序中可以完全自定义特定的自动加载逻辑,并且能将多个自动加载器链接在一起。这意味着你所有的第三方库也将会被自动加载。


在你的代码中,只需创建类或调用它们的方法,那么一切都会为你自动加载。你无需通过编写代码加载或者像其他语言一样使用路径来加载特定内容。在测试代码之外的整个 Hologram 代码库中,我们可能仅有两次调用了include()require()


刚刚提到了第三方库,下面就说一下依赖管理。

依赖管理

PHP 的软件包管理系统不输于其他的编程语言。我们在 Hologram 上使用的是 Composer,这是最受欢迎的一个依赖管理工具。它使用起来非常简单,只需将配置参数保存在 JSON 文件中就可以了。你可以为每个软件包指定要使用的版本范围,并且它会生成一个锁定文件,将该锁定文件共享到代码库中,就能确保所有开发者使用的第三方依赖版本完全相同。


将新的依赖包添加到 JSON 文件中并进行安装,操作起来非常简单,只需要在终端执行以下命令:


composer install somepackage
复制代码

流行框架

如今,PHP 拥有一个强大的开发者社区,因此不仅有大量的工具库可供使用,而且拥有很多完整的框架可帮助简化应用程序的构建。在 Hologram 中,我们使用了 Slim 框架,该框架可以非常方便的定义 API 路由,还具有其他有用的功能,比如可以非常方便的添加用于身份验证以及速率限制的中间件等。


其他流行的框架还有 Laravel、Symfony 等。

PDO 数据库接口

在我用过的所有编程语言中,PHP 拥有最好用的数据库集成接口,而 PDO 是所有数据库接口的基础。PDO 的全称是 PHP Database Objects,它是执行 SQL 查询的首选方式。


它包括用于查询以及对结果分页的所有常用功能。还可以按“行”将数据存储到 PHP 关联数组,这意味着所有“列”数据在数组里存在着键值,且支持通过键值访问数组数据。


最棒的就是它支持参数化查询并可以防止 sql 注入。这意味着你可以执行以下操作:


// define $database as a PDO object$stmt = $database->prepare("SELECT * FROM users WHERE id = ?;");$result = $stmt->execute([$idnumber]);$rows = $result->fetchAll();
复制代码


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


你还可以做一些更酷的事情,例如,它还支持绑定命名参数:


// define $database as a PDO object$values = ['id' => 10, 'email' => 'someemail@hologram.io'];$stmt = $database->prepare('SELECT * FROM users WHERE id = :id AND email = :email;');$result = $stmt->execute($values);$rows = $result->fetchAll();
复制代码


在这种情况下,PDO 会在参数化查询的同时进行正确的参数替换。


无论什么类型的数据库引擎,PDO 都会对外公开相同的接口。当然,数据库引擎之间偶尔也会有 SQL 语句的差异,但是大多数情况下,你只需在初次连接数据库时指定好数据库的类型,然后就可以调用一套函数方法对所有数据库进行相同的操作。

Phinx 数据库迁移工具

说到数据库,我必须推荐一个非常好用的第三方库——Phinx。我们可以通过该工具来完成所有的数据库迁移工作。每当我们需要进行数据库模式变更时,可以使用 Phinx 在数据库上进行数据迁移操作。迁移过程如下所示:


$orders = $this->table('orders');$orders->addColumn('invoice_text', 'string', ['length'=>256, 'default'=>''])    ->update();
复制代码


你可以去Phinx官网查看详细的使用文档。

内置函数库

最后一个使 PHP 变得更便捷、好用的是它拥有出色的内置工具函数库。


假设你有一个来自数据库的结果集,该结果集是一个以行数组为元素的数组。假设你要从每个数组元素中提取 name 列。当然,我们可以使用 PHP 支持的 map 函数来执行此操作,但是还有更简单的方式执行此操作:


$names = array_column($rows, 'name');
复制代码


就这么简单,而且上面的方法运行速度非常快,因为 PHP 内核直接调用运行的 C 接口。


此外,还有很多类似的内置函数,从数组操作到解析 XML 到处理上传的文件,你都可以从 PHP 官方文档中查到具体的使用方法。


我列举一下自己常用的一些 PHP 内置函数:


array_chunk —— 对数组进行截取操作


array_unique —— 移除数组中的重复元素


DateTime —— 用于处理日期的方法,还可以解析简单的英语日期描述,例如“midnight first day of next month”


fpassthru —— 读取文件内容,并输出结果给用户。


str_getcsv —— 解析 CSV 格式字段的字符串,并返回一个包含所读取字段的数组。


urlencode —— 对字符串进行 URL 编码


不要忘记一些有用的符号运算符,例如?? ,它可以让你在对数组指定默认值的同时检查数组中索引是否存在。


$a = $some_array[$x] ?? 500;
复制代码

结论

大家可以考虑将 PHP 用于自己的项目!它比你想像中的要好很多。


英文原文:


Why We Don’t Hate PHP


2020-07-29 07:006547
用户头像
王坤祥 日拱一卒,功不唐捐。

发布了 76 篇内容, 共 18.4 次阅读, 收获喜欢 127 次。

关注

评论 3 条评论

发布
用户头像
php对于纯接口业务开发来说确实比较友好,但其他领域却无法涉足
2020-07-29 09:58
回复
其实接近用户层用于展示数据,PHP还是非常好用的。不要拿淘宝京东来说事,多数项目远远达不到那个复杂度。
2020-07-30 09:05
回复
哈哈,支持,现在太多人拿淘宝、京东说事了。
2020-08-11 10:55
回复
没有更多了
发现更多内容

科普:多领域分布式协同仿真

DevOps和数字孪生

协同仿真

大数据,领导者阵营!

腾讯云大数据

大数据

大模型微调方法总结:LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning

百度开发者中心

人工智能 深度学习 大模型

分享一些很优秀的URL设计

伤感汤姆布利柏

每日一题:LeetCode-162. 寻找峰值

Geek_4z9ami

Go 算法 LeetCode 分治 搜索

大模型高效微调技术

百度开发者中心

人工智能 深度学习 大模型

胡润研究院首次发布“全球猎豹企业榜”,涛思数据榜上有名

TDengine

涛思数据 tdengine 时序数据库

BRC-20铭文代币合约质押挖矿系统开发丨详情开发

l8l259l3365

Perfectly Clear Workbench for mac v4.6.0.2625永久激活版

iMac小白

【第七在线】季节性商品计划:如何应对时尚行业的快速变化

第七在线

云技术分享 | 使用快照和 AMI 镜像进行 Amazon EC2 的备份和恢复

亚马逊云科技 (Amazon Web Services)

Amazon EC2 Amazon S3 amazon-ebs backup

低代码:万事俱备,就差一个程序员

互联网工科生

软件开发 低代码 JNPF

Fine-tuning: 深度解析P-tuning v2在大模型上的应用

百度开发者中心

深度学习 nlp 大模型

Solidity之旅(十三)函数及其可见性和状态可变性

BSN研习社

逻辑多租场景下,故障爆炸半径的控制实践

华为云开发者联盟

开发 华为云 华为云开发者联盟

「大模型摇摇乐」狂欢落幕!盘点那些让你意想不到的应用集锦

飞桨PaddlePaddle

开发者 大模型 AI应用 文心一言

从聚水潭开始,自动化您的电商工作流程

RestCloud

零代码 CRM APPlink 聚水潭

2023开放原子开发者大会全日程

开放原子开源基金会

开源

数据库系列:业内主流MySQL数据中间件梳理

不在线第一只蜗牛

MySQL 数据库 数据

Aiseesoft Data Recovery for Mac(专业数据恢复软件)v1.8.6激活版

iMac小白

OmniReader Pro for mac(全能阅读器)v2.6.5激活版

iMac小白

【终极教程】cocos2dx-js 分批次混淆压缩js文件

Geek_66e2f3

身为程序员,这几款工具老少皆宜

高端章鱼哥

持续集成 单元测试 开发工具

GM EPUB Reader Pro for mac(电子书阅读器)v2.6.0免激活版

iMac小白

通过解析封装关键词搜索速卖通商品列表数据接口,速卖通API接口

tbapi

速卖通API接口 速卖通商品数据接口 关键词搜索速卖通接口 速卖通商品列表数据接口 速卖通商品列表接口

Axure RP 9 for Mac(交互式产品原型设计工具) v9.0.0.3682永久激活版

mac

Axure RP 9 苹果mac Windows软件 产品原型设计软件

身份管理如何提升中小企业生产力?

Authing

企业管理 中小企业 Authing 身份管理

速抢早鸟票|阿里云PolarDB开发者大会,高能来袭

阿里云瑶池数据库

阿里云 开发者大会 阿里云瑶池数据库 阿里云PolarDB

文心一言 VS 讯飞星火 VS chatgpt (161)-- 算法导论13.1 1题

福大大架构师每日一题

福大大架构师每日一题

一行代码修复100vh bug

快乐非自愿限量之名

CSS 前端 代码

为什么我们青睐PHP?_语言 & 开发_REUBEN BALIK_InfoQ精选文章