本文目录导读:

- 📚 目录导读
- PHP到底在网页里干什么?——先理解“脚本”的定位
- 第一个演示代码:
echo与print的微妙差异 - 变量与数据类型的“隐式转换”陷阱
- 控制结构:
if、foreach与match表达式的最佳实践 - 函数与数组:用“引用传递”避免内存浪费
- 表单处理演示:
$_POST与htmlspecialchars的安全姿势 - 面向对象入门:一个
User类的精简演示 - 常见问题快问快答(FAQ)
PHP入门实战:从零看懂演示代码的“骨架”与“灵魂”
📚 目录导读
- PHP到底在网页里干什么?——先理解“脚本”的定位
- 第一个演示代码:
echo与print的微妙差异 - 变量与数据类型的“隐式转换”陷阱
- 控制结构:
if、foreach与match表达式的最佳实践 - 函数与数组:用“引用传递”避免内存浪费
- 表单处理演示:
$_POST与htmlspecialchars的安全姿势 - 面向对象入门:一个
User类的精简演示 - 常见问题快问快答(FAQ)
PHP到底在网页里干什么?——先理解“脚本”的定位
很多初学者把PHP当成“网页语言”,但更准确地说,PHP是一种服务器端嵌入HTML的预处理脚本,当浏览器请求一个.php文件时,服务器执行PHP引擎,将动态内容(如数据库查询结果、用户登录状态)填充进HTML模板,然后返回纯HTML给浏览器。所以你的PHP代码永远不会被用户看到,看到的只是执行结果。
演示代码的核心意义:不是背诵语法,而是观察“输入(变量)→ 处理(逻辑)→ 输出(HTML)”这条流水线,下面每一段演示都围绕这条线展开。
第一个演示代码:echo与print的微妙差异
<?php // 演示1: echo 可以输出多个参数,print只能一个 echo "Hello", " ", "PHP!\n"; // 输出: Hello PHP! print "Hello PHP!\n"; // 输出: Hello PHP! ?>
要点:echo本质是语言结构(无返回值),print是函数(返回1)。性能上echo略快,但在实际业务中差异可忽略,我推荐统一用echo,因为你可能会在模板中大量输出变量,
$name = "张三"; echo "<p>欢迎, <strong>$name</strong>!</p>"; // 双引号内解析变量
变量与数据类型的“隐式转换”陷阱
PHP是弱类型语言,但陷阱比便利更常见,看这段演示:
<?php $price = "10"; // 字符串 $qty = 3; // 整数 echo $price * $qty; // 输出: 30 (字符串自动转换为数字) $total = "abc" + 5; // 警告: 非数值字符串转为0,结果: 5 ?>
精髓:现实项目里,用户输入的“价格”经常是字符串,如果直接参与运算,可能产生“类型污染”。建议用intval()或floatval()显式转换:
$price = intval($_POST['price']); // 强制转整数
控制结构:if、foreach与match表达式的最佳实践
传统if写法:
<?php
$status = 'gold';
if ($status == 'gold') {
$discount = 0.8;
} elseif ($status == 'silver') {
$discount = 0.9;
} else {
$discount = 1.0;
}
echo "折扣: $discount";
?>
PHP 8+ 的match表达式更简洁安全(不会像switch那样“落空”):
$discount = match($status) {
'gold' => 0.8,
'silver' => 0.9,
default => 1.0,
};
演示:遍历数组输出表格行
<?php
$users = ['Alice', 'Bob', 'Carol'];
foreach ($users as $index => $name) {
echo "<tr><td>" . ($index+1) . "</td><td>$name</td></tr>";
}
?>
函数与数组:用“引用传递”避免内存浪费
错误示范:返回一个大数组副本
<?php
function getLots($data) {
$result = [];
foreach ($data as $item) {
$result[] = strtoupper($item);
}
return $result; // 占用双倍内存
}
?>
优化演示:使用&引用参数,直接修改原数组
function upperInPlace(&$items) {
foreach ($items as &$v) {
$v = strtoupper($v);
}
unset($v); // 断开引用,防止意外修改
}
$arr = ['a', 'b'];
upperInPlace($arr);
print_r($arr); // 输出: Array ( [0] => A [1] => B )
表单处理演示:$_POST与htmlspecialchars的安全姿势
危险演示(直接输出用户输入):若输入<script>会XSS攻击
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$userMsg = $_POST['message'];
echo "你说的: $userMsg"; // ❌ 危险
}
?>
安全演示:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 1. 过滤掉多余空格、去标签(但保留有用换行)
$rawMsg = trim(strip_tags($_POST['message'] ?? ''));
// 2. 转义HTML实体后输出
$safeMsg = htmlspecialchars($rawMsg, ENT_QUOTES, 'UTF-8');
echo "你说了: " . nl2br($safeMsg);
}
?>
要点:htmlspecialchars将<、>、、、&转换为实体,这是防XSS的第一道防线,对于数据库存储,你还应该使用预处理语句(PDO预处理)。
面向对象入门:一个User类的精简演示
演示:构造函数、属性、静态方法
<?php
class User {
private string $name;
private string $email;
// 构造函数(PHP 8+ 支持属性声明直接注入)
public function __construct(string $name, string $email) {
$this->name = $name;
$this->email = $email;
}
// 公开方法
public function getProfile(): string {
return "名字: $this->name, 邮箱: $this->email";
}
// 静态方法:生成匿名用户
public static function guest(): self {
return new self('访客', 'guest@example.com');
}
}
$me = User::guest();
echo $me->getProfile(); // 输出: 名字: 访客, 邮箱: guest@example.com
?>
精髓:类把数据(属性)与行为(方法)绑定,在实际框架(Laravel)中,你用模型类代表数据库表,但底层原理就是new User()后调用方法。
常见问题快问快答(FAQ)
Q1:PHP和HTML混写时,缩进怎么统一?
A:推荐用短标签<?php ?>,然后整个文件保持一行纯PHP逻辑,最后混入HTML时用<?= $var ?>(这是echo的简写)。
<p>欢迎 <?= $name ?></p>
Q2:为什么表单中$_POST有时是空的?
A:检查三点:①<form method="post" action="...">确保方法为post;②输入框的name属性写对(如<input name="email">);③没有在提交前用JS清空DOM,如果文件在http://下,$_POST正常。
Q3:include和require选哪个?
A:require如果文件不存在会致命错误停止;include只警告但继续执行,对于核心配置文件(数据库连接),用require_once;对于模板片段(如页脚),用include。
Q4:如何调试简单PHP脚本?
A:用内置服务器php -S localhost:8000,然后在代码里用var_dump($var); exit;,生产环境不要用var_dump,改用error_log()记录到日志文件。
Q5:单引号和双引号字符串区别?
A:双引号会解析变量及转义(如\n),单引号只转义和。性能上单引号稍快,但可读性双引号好,如果你要拼接SQL,建议用双引号但注意SQL注入(始终用预处理)。
看懂PHP演示代码,就像学开车——先认识仪表盘(语法),再掌握方向盘(控制流),最后会看后视镜(调试)。建议自己动手改一改变量名、加一个条件分支、试一个错误输入,动手之后那些“为什么”才会变成“原来如此”,坚持每天写一个小演示脚本,一个月后你会发现自己已经能脱离教程写完整功能了。