我第一次接触PHP大概是十几年前,那时候做个动态网站,大家基本就两个选择:ASP或者PHP。ASP是微软家的,得用Windows服务器,花钱。PHP呢?随便找个Linux空间就能跑,免费,代码写起来还顺手。
后来慢慢发现,PHP能活到现在还这么流行,靠的不仅仅是免费。下面聊聊它真正实用的那些特性。每个我都会尽量说透,配上例子。
1.执行速度:快得不讲道理
PHP跑得快,尤其是跟JSP、ASP比。原因很简单:它自己管内存。
什么意思呢?就是PHP处理完一个请求后,会把用过的内存自己清理掉。不像某些语言,得等操作系统来回收。这样一来,服务器负担轻了,响应速度自然就上去了。
举个例子:你用PHP写个循环,处理一万条数据。它会在执行过程中自动管理内存,处理完就把临时变量清掉。换成同样逻辑的Python脚本,可能内存占用会越来越高,直到崩掉。
个人经验:之前在虚拟主机上跑一个CMS系统,PHP7版本的响应时间比PHP5快了将近一倍。同样的服务器,同样的流量,升级版本就有效果。
专业名词:ZendEngine、OPcache、内存管理、请求生命周期
2.开源:真免费,随便改
这个不用多说。PHP的源码就在网上挂着呢,你去 php.net 随便下。想加功能?改源码。想修bug?自己动手。
关键是不花钱。对创业公司、个人开发者来说,成本这块能省不少。
对比一下:.NET以前要买Windows服务器授权,SQLServer也要钱。PHP+MySQL免费,跑在Linux上,稳得很。
现在的PHP8系列,所有新特性也都是开放讨论、开放实现的。你甚至可以向官方提建议。
专业名词:PHPLicense、Zend引擎、PHP基金会
3.语法:熟悉,好上手
PHP的语法跟C、Java、Perl很像。学过其中任何一个,看PHP代码基本能猜个不离十。
最基本的写法:
<?php
$name = "代码号";
echo "欢迎 " . $name . " 回来";
?>
就这三行。<?php...?> 是标签,里面写PHP代码。变量前面加 $,字符串用点号拼接。简单直接。
个人建议:新手别一上来就学框架,先写原生PHP。把语法、数组操作、函数这些练熟,后面用Laravel或ThinkPHP会很轻松。很多人一上来就装Composer、配路由,结果基础不牢,出问题了连调试都不知道从哪入手。
专业名词:标记语言、变量、字符串拼接、控制结构
4.可嵌入HTML:混合开发很方便
这个特性是PHP的杀手锏。你可以在HTML文件里直接插PHP代码。
看例子:
<!DOCTYPE html>
<html>
<head><title>代码号学习示例</title></head>
<body>
<h1>欢迎</h1>
<p>当前时间:<?php echo date("Y-m-d H:i:s"); ?></p>
</body>
</html>
看到没?<?php...?> 直接嵌在HTML中间。页面静态部分用HTML写,动态部分用PHP生成。不用额外建什么模板文件。
为什么不用别的方案:比如Java的JSP,虽然也能嵌,但配置麻烦,还要部署到Tomcat之类的容器。PHP呢?文件放上去就能跑。
项目开发中,很多人会用PHP配合模板引擎(比如Smarty、Blade)。但原理都是一样的:PHP先生成HTML,再发给浏览器。
专业名词:内嵌脚本、模板引擎、输出缓冲
5.跨平台:Windows、Mac、Linux随便换
你可以在Windows上写PHP代码,然后直接上传到Linux服务器上跑。不用改任何东西。
我自己就干过这事:本地用Windows+XAMPP开发,写完上传到CentOS服务器。文件复制过去,数据库配置改一下,直接跑起来。
Mac用户也一样。PHP官方对三大系统都支持得很好。
唯一要注意的:文件路径写法。Windows用反斜杠 \,Linux/Mac用正斜杠 /。建议代码里统一用 DIRECTORY_SEPARATOR 常量,或者直接全部用正斜杠 './folder/file.php',Linux和Windows都认。
专业名词:POSIX兼容、DIRECTORY_SEPARATOR、环境变量
6.数据库支持:主流的基本都支持
PHP连数据库太方便了。MySQL、PostgreSQL、SQLite、SQLServer、Oracle……基本你能想到的,它都有驱动。
最推荐的方式:PDO
PDO是PHP自带的一个数据库抽象层。你用PDO写的代码,换数据库时几乎不用改。
示例(连MySQL):
<?php
$pdo = new PDO("mysql:host=localhost;dbname=test", "root", "password");
$stmt = $pdo->query("SELECT * FROM users");
foreach ($stmt as $row) {
echo $row['name'] . "<br>";
}
?>
换成SQLite也就改一下DSN:
$pdo = new PDO("sqlite:database.db");
为什么不用mysqli:mysqli只支持MySQL。PDO能支持12种数据库。万一以后要换成PostgreSQL,mysqli的代码得重写,PDO的只改一行。
个人经验:2016年做过一个项目,开始用MySQL,后来客户非要换成SQLServer。幸亏当时用了PDO,就改了连接字符串和几个日期函数,其他没动。要是用的mysqli,那得重写上千行。
专业名词:PDO、ODBC、预处理语句、防止SQL注入
7.错误报告:跑的时候就能发现问题
PHP有内置的错误常量,能在运行时直接告诉你哪里出问题了。
常用几个:
-
E_ERROR:致命错误,代码直接停。比如调用不存在的函数。
-
E_WARNING:警告,不停止运行。比如include一个不存在的文件。
-
E_NOTICE:小问题提示。比如用了一个没定义的变量。
-
E_PARSE:语法错误,连跑都跑不起来。
-
E_STRICT:提示你改进代码规范。
开发时可以这样设置,显示所有错误:
error_reporting(E_ALL);
ini_set('display_errors', 1);
到了线上环境,记得关掉显示,改成记日志:
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
个人建议:开发阶段一定把错误级别开到较高。很多人觉得Notice无所谓,但Notice多了说明代码不规范,早晚出事。我习惯用 error_reporting(E_ALL|E_STRICT),把能开的都开了。
专业名词:错误级别、异常处理、try-catch、日志记录
8.弱类型:不用声明变量类型
PHP是动态类型的。你不需要先声明 int$a,直接用就行。
<?php
$var = 10; // 整数
$var = "hello"; // 字符串,没问题
$var = 3.14; // 浮点数,也没问题
$var = true; // 布尔值,照样可以
?>
PHP会自动识别类型,也自动做类型转换。
比如字符串跟数字拼接:
$num = 5;
$text = "有 " . $num . " 条记录";
$num 自动转成字符串。
为什么不用强制类型:弱类型写小项目快,改起来方便。但大项目容易埋坑。PHP7开始加了 declare(strict_types=1),可以开启严格模式。看项目规模和个人习惯。
专业名词:动态类型、类型抖动、类型声明、类型安全
9.服务器支持:什么Web服务器都能跑
Apache、Nginx、IIS、LiteSpeed、Caddy……PHP基本通吃。
最常见组合:
-
Apache+mod_php:老牌组合,稳定,配置简单。
-
Nginx+PHP-FPM:性能好,高并发优选。
现在开发环境用Docker也挺多,一个 php:apache 镜像就全搞定了。
部署小提示:不管用哪个服务器,记得把PHP的错误日志跟Web服务器的日志分开,排查问题方便。
专业名词:SAPI、PHP-FPM、mod_php、FastCGI
10.安全性:该有的都有
没有绝对安全的语言,但PHP提供了很多安全机制。关键看你用不用。
主要功能:
-
输入验证:
filter_var()验证邮箱、URL、整数 -
数据过滤:
htmlspecialchars()防XSS -
会话安全:可以改session名称、设置过期时间
-
密码处理:
password_hash()和password_verify() -
CSRF防护:自己加token验证
基本示例(防SQL注入+防XSS):
<?php
// 防 SQL 注入:用预处理
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);
// 防 XSS:输出时转义
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>
个人经验:新手最容易忽略的是文件上传安全。上传图片不要光检查后缀,要用 getimagesize() 真的读一下文件头。我就遇到过有人把PHP文件改成.jpg上传,然后通过别的方式执行的漏洞。
专业名词:XSS、SQL注入、CSRF、会话劫持、输入净化
11.控制力强:代码量少,干活快
同样一个功能,PHP可能10行就写完了,Java可能要30行。
比如读一个文件所有内容:
$content = file_get_contents("data.txt");
两行(甚至一行)搞定。Java你得开FileInputStream、BufferedReader、循环读、关闭流……
PHP的数组函数也特别丰富。count、array_map、array_filter、array_merge……几十个函数直接调用。
举个实际例子:把用户列表里的名字提取出来:
$names = array_column($users, 'name');
一行。换其他语言?先遍历,再push,再返回。
专业名词:内置函数、数组操作、SPL标准库
12.社区庞大:不怕遇到问题没人帮
PHP的社区是真的活跃。你遇到的大部分问题,早就有人踩过坑了。
-
官方文档:
php.net上面每个函数都有用户评论、示例代码 -
论坛:StackOverflow、Reddit的r/PHP
-
中文社区:PHP中文网、LearnKu(原LaravelChina)
-
开源项目:GitHub上搜一下,成千上万
个人经验:从PHP5.2一直到8.2,每次升级碰到不兼容的问题,Google一下基本10分钟内有答案。社群各种课程、问答、文档都很齐。
尤其新手,去社区搜“PHP入门教程”,能找到大量免费资源。代码号学习编程这类平台也是跟着社群生态起来的。
专业名词:PHP-FIG、PSR规范、Composer、Packagist
本节课程知识要点
-
PHP执行快,靠的是自己的内存管理
-
开源免费,所有资源随便用
-
语法像C/Java,好上手
-
能直接嵌HTML,省事
-
跨平台,开发生产环境不打架
-
数据库支持全,推荐PDO
-
错误报告清晰,找问题方便
-
弱类型灵活,7以上也可以开严格模式
-
主流Web服务器都能跑
-
安全功能齐全,开发者得会用
-
代码量少,控制灵活
-
社区大,学起来不孤单