【PHP】从零开始的PHP学习

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 全局变量

变量数据来源例子
$_GETURL 里 ? 后面的参数?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');
// 输出: &lt;script&gt;alert(1)&lt;/script&gt;
// 把 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如果路径可控 -> 文件包含漏洞

本文为个人学习笔记,仅供技术交流 | 转载请联系作者 | 🔗 文章地址

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇