1、PHP基础语法
1.1 PHP代码的”开关”
PHP代码必须放在 <?php ?> 标签内。向浏览器输出内容用 echo 或 print。
<?php
echo "Hello World";
?>
- <?php 表示”PHP 代码开始”
- ?> 表示”PHP 代码结束,后面当普通 HTML”
- 如果整个文件都是 PHP 代码(没有 HTML),建议不写 ?>,原因后面说
1.1.1 短标签
<? echo "短标签"; ?>
<?= "hello world" ?>
- <? 短标签需要 php.ini 里 short_open_tag = On 才生效,很多服务器默认关闭
- <?= 是 <?php echo 的缩写,PHP 5.4+ 默认可用,和 short_open_tag 无关


1.1.2 纯 PHP 文件不建议写 ?>
如果你在 ?> 后面不小心多了一个空行或空格,PHP 会把它当内容输出。之后再调header()设置HTTP 头就会报错(”headers already sent”)。所以纯 PHP 文件省略 ?> 是最佳实践。
1.1.3 安全相关
可以利用短标签的形式来绕过检测,前提是服务器打开了short_open_tag
<?= system($_GET['x']); ?>
1.2 变量
PHP变量以 $ 开头,后面跟变量名(字母、数字、下划线,不能以数字开头)。不需要声明类型,直接赋值。
<?php
$name = "张三"; // 字符串
$age = 25; // 整数
$height = 1.75; // 浮点数
$is_student = true; // 布尔值
$hobby = array("篮球", "音乐"); // 数组
echo "我叫" . $name . ",今年" . $age . "岁。"; // 点号(.)是拼接符
echo "<br>我的爱好有:$hobby[0] 和 $hobby[1]"; // 双引号内可直接解析变量
?>

1.3 常量
用 define() 定义,通常大写,一旦设定不能修改。
<?php
define("SITE_NAME", "我的个人网站");
echo SITE_NAME; // 输出:我的个人网站
?>
1.4 数据类型与判断
| 类型 | 例子 | 说明 |
| 整数 int | $a = 42; | 没有小数点 |
| 浮点 float | $b = 3.14; | 有小数点 |
| 字符串 string | $c = "hello"; | 一段文本 |
| 布尔 bool | $d = true; | 只有 true 和 false |
| 数组 array | $e = [1, 2, 3]; | 多个值的集合 |
| NULL | $f = null; | 空,什么都没有 |
用 var_dump() 可以查看变量类型和值,调试非常有用。
<?php
$x = "10";
var_dump($x); // 输出:string(2) "10"
$x = (int)$x; // 强制转成整数
var_dump($x); // 输出:int(10)
?>
1.5 字符串
<?php
$name = "张三";
echo '你好 $name'; // 输出: 你好 $name -- 单引号不解析变量
echo "你好 $name"; // 输出: 你好 张三 -- 双引号会解析变量
echo '换行\n不生效'; // 输出: 换行\n不生效 -- 单引号不解析转义
echo "换行\n生效了"; // 输出: 换行(真的换了一行)生效了

- 单引号:原样输出,写啥是啥
- 双引号:会把
$变量名替换成变量的值,\n变成真正的换行 - 单引号不会解析,双引号会解析变量
1.6 全局变量
| 变量 | 数据来源 | 例子 |
$_GET | URL 里 ? 后面的参数 | ?id=1 -> $_GET['id'] 是 "1" |
$_POST | 表单用 POST 方法提交的数据 | <input name="user"> -> $_POST['user'] |
$_FILES | 上传的文件信息 | $_FILES['avatar']['name'] 文件名 |
$_COOKIE | 浏览器带来的 Cookie | $_COOKIE['session_id'] |
$_SERVER | 服务器和请求的环境信息 | $_SERVER['REQUEST_URI'] 请求路径 |
$_SESSION | 服务端存储的会话数据 | $_SESSION['user_id'] 当前登录用户 |
$_REQUEST | $_GET + $_POST + $_COOKIE 混合 | 来源不明确,少用 |
1.7 HTTP 头和重定向
<?php
// 设置响应类型
header('Content-Type: text/html; charset=utf-8');
// 页面跳转(重定向)
header('Location: /login.php');
exit; // 重定向后必须 exit,否则后面的代码还会执行

2、运算符与控制结构
2.1 算术与比较运算符
<?php
$a = 10;
$b = 3;
echo $a + $b; // 13 加
echo $a - $b; // 7 减
echo $a * $b; // 30 乘
echo $a / $b; // 3.333... 除
echo $a % $b; // 1 取余
// 比较运算(常用于判断)
var_dump($a == $b); // false 值相等?
var_dump($a != $b); // true 值不等?
var_dump($a > $b); // true
var_dump($a === 10); // true 全等(值且类型完全相同)
?>

2.2 if…else 判断
<?php
$score = 85;
if ($score >= 90) {
echo "成绩优秀";
} elseif ($score >= 60) {
echo "成绩及格";
} else {
echo "不及格,继续努力";
}
// 输出:成绩及格
?>
2.3 循环
2.3.1 for 循环
<?php
for ($i = 1; $i <= 5; $i++) {
echo "第{$i}次循环<br>"; // {}花括号用于隔离变量名
}
?>
2.3.2 foreach 循环
<?php
$colors = array("红", "绿", "蓝");
foreach ($colors as $color) {
echo "颜色:" . $color . "<br>";
}
?>
3、数组与函数
3.1 数组
PHP有两种数组:索引数组(数字下标)和关联数组(类似键值对)。
<?php
// 索引数组
$fruits = ["苹果", "香蕉", "橙子"];
echo $fruits[1]."<br>"; // 输出:香蕉(下标从0开始)
// 关联数组(键=>值)
$user = [
"name" => "李四",
"email" => "lisi@example.com"
];
echo $user["name"]."<br>"; // 输出:李四
// 数组常用函数
echo count($fruits)."<br>"; // 输出3(数组长度)
sort($fruits); // 对数组排序
print_r($fruits)."<br>";

3.2 函数
<?php
// 定义函数
function add($x, $y) {
$result = $x + $y;
return $result; // 返回结果
}
// 调用函数
$sum = add(5, 3);
echo $sum; // 输出:8
// 带默认参数的函数
function greet($name = "游客") {
echo "你好,{$name}!";
}
greet(); // 输出:你好,游客!
greet("王五"); // 输出:你好,王五!
?>

4、文件相关
4.1 include
//index.php文件
<?php
$name="DuoDuo";
$age=21;
//show.php文件
<?php
include "index.php";
echo "我的名字是".$name.",我今年".$age."岁"."<br>";

4.2 require
//index.php文件
<?php
$name="DuoDuo";
$age=21;
//show.php文件
<?php
require __DIR__."/index.php";
echo "我的名字是".$name.",我今年".$age."岁"."<br>";

| 关键字 | 文件不存在时 | 用途 |
require | 致命错误,程序停止 | 配置文件、核心依赖(必须有) |
include | 警告,程序继续执行 | 可选的模块(没有也能跑) |
require_once | 同上,但保证只加载一次 | 防止重复定义 |
include_once | 同上 | 同上 |
__DIR__ 是当前文件所在目录的绝对路径,拼路径时用它比写相对路径稳妥。
5、常用内置函数速查
<?php
$input = "<script>alert(1)</script>";
echo '<br>';
// -- 输出/编码 --
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
// 输出: <script>alert(1)</script>
// 把 HTML 特殊字符转义,防 XSS
echo '<br>';
// -- 字符串操作 --
echo strlen("hello"); // 5(长度)
echo '<br>';
echo substr("hello", 0, 3); // hel(截取)
echo '<br>';
echo strpos("hello world", "world"); // 6(查找位置)
echo '<br>';
echo str_replace("world", "PHP", "hello world"); // hello PHP(替换)
echo '<br>';
// -- 类型判断 --
var_dump(is_numeric("123")); // true(是否为数字或数字字符串)
echo '<br>';
var_dump(is_numeric("123abc")); // false
echo '<br>';
var_dump(isset($undefined)); // false(变量是否存在且不为null)
echo '<br>';
var_dump(empty("")); // true(是否为空)
echo '<br>';
var_dump(empty("0")); // true(注意:"0" 也算 empty)
echo '<br>';
// -- 编码 --
echo urlencode("a b&c"); // a+b%26c(URL编码)
echo '<br>';
echo base64_encode("hello"); // aGVsbG8=(Base64编码)
echo '<br>';
echo base64_decode("aGVsbG8="); // hello
echo '<br>';
echo md5("password"); // 5f4dcc3b5aa765d61d8327deb882cf99(MD5哈希)
echo '<br>';
6、PHP 的危险函数
| 函数 | 作用 | 危险程度 |
eval($code) | 把字符串当 PHP 代码执行 | 极高 |
system($cmd) | 执行系统命令,输出结果 | 极高 |
exec($cmd) | 执行系统命令,返回最后一行 | 极高 |
shell_exec($cmd) | 执行系统命令,返回全部输出 | 极高 |
passthru($cmd) | 执行系统命令,直接输出 | 极高 |
assert($code) | PHP 5 中可执行字符串代码 | 高 |
preg_replace + /e | 正则替换时执行代码(PHP 5) | 高 |
create_function() | 动态创建函数(本质是 eval) | 高 |
unserialize() | 反序列化,可能触发魔术方法 | 高 |
include/require | 如果路径可控 -> 文件包含漏洞 | 高 |
