PHP 使用说明

1. PHP 简介

PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,特别适合Web开发并可嵌入HTML中。

主要特点:

  • 开源免费
  • 跨平台(Windows、Linux、macOS等)
  • 易于学习和使用
  • 与HTML紧密集成
  • 支持多种数据库
  • 强大的字符串处理能力

2. PHP 安装与配置

2.1 集成环境安装(推荐初学者)

XAMPP安装步骤:

  1. 访问 Apache Friends 下载最新版本的XAMPP
  2. 运行安装程序并按照提示完成安装
  3. 启动XAMPP控制面板,启动Apache和MySQL服务
  4. 在浏览器中访问 http://localhost 验证安装成功

2.2 基础配置

PHP的主要配置文件是php.ini,常用配置项:

; 设置时区
date.timezone = Asia/Shanghai

; 配置错误报告
error_reporting = E_ALL
display_errors = On

; 配置文件上传
file_uploads = On
upload_max_filesize = 20M

; 配置内存限制
memory_limit = 128M

3. PHP 基础语法

3.1 PHP 标记

PHP代码可以嵌入到HTML中,使用特殊的标记包围:

<?php
// PHP代码在这里
?>

对于只包含PHP代码的文件,结束标记?>可以省略。

3.2 输出内容

常用的输出函数:

<?php
echo "Hello, World!";
print "使用print输出";

$array = ["apple", "banana", "orange"];
print_r($array); // 打印数组
var_dump($array); // 打印变量详细信息
?>

3.3 注释

<?php
// 这是单行注释

/*
这是多行注释
可以跨越多行
*/
?>

4. PHP 数据类型

PHP支持以下数据类型:

4.1 标量类型

<?php
// 布尔型
$is_valid = true;
$is_admin = false;

// 整型
$age = 30;
$hex_value = 0xFF; // 十六进制,等于255

// 浮点型
$price = 9.99;
$pi = 3.14159;

// 字符串
$str1 = "双引号字符串,可以解析变量:$name";
$str2 = '单引号字符串,原样输出:$name';
?>

4.2 复合类型

<?php
// 索引数组
$colors = ["red", "green", "blue"];

// 关联数组
$person = [
  "name" => "张三",
  "age" => 30,
  "email" => "zhangsan@example.com"
];

// 对象
class Person {
  public $name;
  public $age;
}

$person = new Person();
$person->name = "张三";
$person->age = 30;
?>

4.3 特殊类型

<?php
// NULL
$variable = null;

// 资源(例如文件句柄)
$file = fopen("example.txt", "r");
fclose($file);
?>

5. 变量和常量

5.1 变量

<?php
// 变量声明和赋值
$name = "张三";
$age = 30;

// 变量命名规则:
// 1. 变量名必须以字母或下划线开头
// 2. 变量名只能包含字母、数字和下划线
// 3. 变量名区分大小写
$name = "张三";
$Name = "李四"; // 不同的变量
?>

5.2 常量

<?php
// 使用 define() 函数定义常量
define("PI", 3.14159);
echo PI;

// 使用 const 关键字定义常量
const MAX_USERS = 100;
echo MAX_USERS;

// 魔术常量
 echo __LINE__; // 当前行号
 echo __FILE__; // 当前文件路径
 echo __FUNCTION__; // 当前函数名
 echo __CLASS__; // 当前类名
?>

5.3 超全局变量

<?php
// 常用超全局变量
// $_GET - 获取URL参数
 echo $_GET["id"];

// $_POST - 获取POST请求数据
 echo $_POST["username"];

// $_SESSION - 会话变量
 session_start();
 $_SESSION["user_id"] = 123;

// $_SERVER - 服务器信息
 echo $_SERVER["REMOTE_ADDR"]; // 客户端IP地址
 echo $_SERVER["REQUEST_METHOD"]; // 请求方法
?>

6. 运算符

6.1 算术运算符

<?php
$a = 10;
$b = 5;

$c = $a + $b; // 加法
$c = $a - $b; // 减法
$c = $a * $b; // 乘法
$c = $a / $b; // 除法
$c = $a % $b; // 取模

$a++; // 自增
$a--; // 自减
?>

6.2 赋值运算符

<?php
$a = 10;
$a += 5; // 等同于 $a = $a + 5
$a -= 5; // 等同于 $a = $a - 5
$a .= "abc"; // 字符串连接赋值
?>

6.3 比较运算符

<?php
$a = 10;
$b = "10";

var_dump($a == $b); // true(值相等)
var_dump($a === $b); // false(值和类型都相等)
var_dump($a != $b); // 不等于
var_dump($a > $b); // 大于
var_dump($a < $b); // 小于
?>

6.4 逻辑运算符

<?php
$x = true;
$y = false;

var_dump($x && $y); // 逻辑与
var_dump($x || $y); // 逻辑或
var_dump(!$x); // 逻辑非
var_dump($x xor $y); // 逻辑异或
?>

6.5 三元运算符

<?php
// 基本三元运算符
$age = 20;
$status = ($age >= 18) ? "成年人" : "未成年人";

// 空合并运算符(PHP 7+)
$name = $_GET["name"] ?? "Guest";
?>

7. 控制结构

7.1 条件语句

<?php
// if 语句
$age = 20;
if ($age >= 18) {
  echo "成年人";
}

// if-else 语句
if ($age >= 18) {
  echo "成年人";
} else {
  echo "未成年人";
}

// switch 语句
$day = "Monday";
switch ($day) {
  case "Monday":
    echo "星期一";
    break;
  case "Tuesday":
    echo "星期二";
    break;
  default:
    echo "其他星期";
}
?>

7.2 循环语句

<?php
// while 循环
$i = 1;
while ($i <= 5) {
  echo "数字:$i<br>";
  $i++;
}

// for 循环
for ($i = 1; $i <= 5; $i++) {
  echo "数字:$i<br>";
}

// foreach 循环(用于数组)
$colors = ["red", "green", "blue"];
foreach ($colors as $color) {
  echo "颜色:$color<br>";
}

// 关联数组的遍历
$person = ["name" => "张三", "age" => 30];
foreach ($person as $key => $value) {
  echo "$key: $value<br>";
}
?>

8. 函数

8.1 函数的定义和调用

<?php
// 定义函数
function sayHello() {
  echo "Hello, World!";
}

// 调用函数
sayHello();

// 带参数的函数
function greet($name) {
  echo "Hello, $name!";
}

greet("张三");

// 带默认参数的函数
function welcome($name = "Guest") {
  echo "Welcome, $name!";
}

welcome(); // 输出 "Welcome, Guest!"

// 带返回值的函数
function add($a, $b) {
  return $a + $b;
}

$result = add(5, 3);
echo $result; // 输出 8
?>

8.2 函数的作用域

<?php
// 全局变量
$global_var = "全局变量";

// 在函数内部访问全局变量
function test() {
  global $global_var;
  echo $global_var;
  
  // 或使用 $GLOBALS 超全局数组
  echo $GLOBALS["global_var"];
}

test();

// 静态变量
function counter() {
  static $count = 0;
  $count++;
  echo "计数:$count<br>";
}

counter(); // 计数:1
counter(); // 计数:2
?>

9. 数组

9.1 数组的创建

<?php
// 索引数组
$colors = ["red", "green", "blue"];

// 关联数组
$person = [
  "name" => "张三",
  "age" => 30,
  "email" => "zhangsan@example.com"
];

// 多维数组
$users = [
  ["name" => "张三", "age" => 30],
  ["name" => "李四", "age" => 25]
];
?>

9.2 数组的访问和修改

<?php
$colors = ["red", "green", "blue"];

// 访问数组元素
 echo $colors[0]; // 输出 "red"

// 修改数组元素
$colors[1] = "yellow";

// 添加数组元素
$colors[] = "purple";

// 关联数组的访问和修改
$person = ["name" => "张三", "age" => 30];
$person["email"] = "zhangsan@example.com";
?>

9.3 常用数组函数

<?php
// 数组长度
$colors = ["red", "green", "blue"];
echo count($colors); // 输出 3

// 检查数组中是否存在某个值
$found = in_array("green", $colors); // true

// 数组排序
$numbers = [3, 1, 4, 2, 5];
sort($numbers); // 升序排序
rsort($numbers); // 降序排序

// 关联数组排序
$age = ["张三" => 30, "李四" => 25];
asort($age); // 按值升序排序
ksort($age); // 按键升序排序

// 数组合并
$array1 = ["red", "green"];
$array2 = ["blue", "yellow"];
$merged = array_merge($array1, $array2);

// 数组过滤
$numbers = [1, 2, 3, 4, 5];
$even_numbers = array_filter($numbers, function($n) {
  return $n % 2 == 0;
});

// 数组映射
$numbers = [1, 2, 3];
$squared = array_map(function($n) {
  return $n * $n;
}, $numbers);
?>

10. 字符串处理

10.1 字符串的定义

<?php
// 双引号字符串
$name = "张三";
$greeting = "Hello, $name!";

// 单引号字符串
$greeting = 'Hello, $name!';

// Heredoc 语法
$text = <<<EOT
这是一个多行文本。
可以包含变量:$name
EOT;
?>

10.2 常用字符串函数

<?php
$str = "Hello, World!";

// 获取字符串长度
echo strlen($str); // 13

// 查找子串位置
echo strpos($str, "World"); // 7

// 替换子串
$new_str = str_replace("World", "PHP", $str);

// 转换大小写
echo strtolower($str); // 小写
echo strtoupper($str); // 大写

// 去除空白字符
$str = "  Hello  ";
echo trim($str); // "Hello"

// 截取子串
echo substr($str, 0, 5); // "Hello"

// 分割字符串
$str = "apple,banana,orange";
$fruits = explode(",", $str);

// 连接数组元素
$joined = implode(", ", $fruits);
?>

11. 日期和时间

<?php
// 获取当前日期和时间
echo date("Y-m-d H:i:s"); // 例如:2023-04-15 14:30:45

// 自定义日期格式
echo date("Y年m月d日 H:i:s");

// 设置时区
date_default_timezone_set("Asia/Shanghai");

// 创建特定日期的DateTime对象
$date = new DateTime("2023-04-15");
echo $date->format("Y-m-d");

// 修改日期
$date->modify("+1 day");
echo $date->format("Y-m-d");

// 计算日期差值
$date1 = new DateTime("2023-01-01");
$date2 = new DateTime("2023-12-31");
$interval = $date1->diff($date2);
echo $interval->format("%y年%m月%d天");

// 获取时间戳
echo time();
?>

12. 文件操作

12.1 文件的读取

<?php
// 读取整个文件到字符串
$content = file_get_contents("example.txt");
echo $content;

// 读取整个文件到数组(每行作为数组元素)
$lines = file("example.txt");
foreach ($lines as $line) {
  echo $line . "<br>";
}

// 逐行读取文件
$file = fopen("example.txt", "r");
if ($file) {
  while (($line = fgets($file)) !== false) {
    echo $line . "<br>";
  }
  fclose($file);
}
?>

12.2 文件的写入

<?php
// 写入字符串到文件
$content = "这是要写入的内容";
file_put_contents("example.txt", $content);

// 追加内容到文件
file_put_contents("example.txt", $content, FILE_APPEND);

// 使用 fwrite 写入
$file = fopen("example.txt", "w");
if ($file) {
  fwrite($file, "这是第一行\n");
  fwrite($file, "这是第二行\n");
  fclose($file);
}
?>

12.3 文件和目录操作

<?php
// 检查文件是否存在
if (file_exists("example.txt")) {
  echo "文件存在";
}

// 获取文件大小
echo filesize("example.txt") . " bytes";

// 复制文件
copy("source.txt", "destination.txt");

// 重命名/移动文件
rename("oldname.txt", "newname.txt");

// 删除文件
unlink("example.txt");

// 创建目录
mkdir("newdir");

// 读取目录内容
$files = scandir("mydir");
foreach ($files as $file) {
  if ($file != "." && $file != "..") {
    echo "文件名:$file<br>";
  }
}
?>

13. 类和对象(面向对象编程)

13.1 类的定义和对象的创建

<?php
// 定义类
class Person {
  // 属性(成员变量)
  public $name;
  public $age;
  
  // 构造函数
  function __construct($name, $age) {
    $this->name = $name;
    $this->age = $age;
  }
  
  // 方法(成员函数)
  function sayHello() {
    echo "Hello, my name is {$this->name}.";
  }
}

// 创建对象(实例化类)
$person = new Person("张三", 30);

// 访问对象的属性
 echo $person->name; // 输出 "张三"

// 调用对象的方法
$person->sayHello();
?>

13.2 属性和方法的访问控制

<?php
class Person {
  public $name; // 公共属性
  protected $email; // 受保护的属性
  private $phone; // 私有属性
  
  // ...其他代码
}

13.3 继承

<?php
// 父类
class Person {
  protected $name;
  
  function __construct($name) {
    $this->name = $name;
  }
  
  public function sayHello() {
    echo "Hello, my name is {$this->name}.";
  }
}

// 子类继承父类
class Student extends Person {
  private $studentId;
  
  function __construct($name, $studentId) {
    parent::__construct($name);
    $this->studentId = $studentId;
  }
  
  // 重写父类的方法
  public function sayHello() {
    echo "Hello, I'm a student: {$this->name}.";
  }
}

$student = new Student("张三", "1001");
$student->sayHello();
?>

14. 错误处理

14.1 错误类型

PHP中的错误类型包括:

  • E_ERROR:致命的运行时错误
  • E_WARNING:运行时警告
  • E_NOTICE:运行时通知
  • E_PARSE:编译时解析错误
  • E_DEPRECATED:已弃用的功能警告

14.2 异常处理

<?php
// 抛出异常
try {
  $num = -5;
  
  if ($num < 0) {
    throw new Exception("数值不能为负数");
  }
  
  echo "数值是正数: $num";
} catch (Exception $e) {
  // 捕获异常
  echo "错误: " . $e->getMessage();
} finally {
  // 无论是否发生异常,finally块都会执行
  echo "<br>处理完成";
}

// 自定义异常类
class InvalidEmailException extends Exception {
  public function errorMessage() {
    return "无效的邮箱地址: " . $this->getMessage();
  }
}
?>

15. 会话管理

<?php
// 启动会话
session_start();

// 设置会话变量
$_SESSION["username"] = "张三";
$_SESSION["user_id"] = 123;

// 访问会话变量
 echo "欢迎回来," . $_SESSION["username"];

// 检查会话变量是否存在
if (isset($_SESSION["username"])) {
  echo "用户已登录";
}

// 销毁会话
 session_destroy();
?>

16. 数据库操作(使用PDO)

16.1 连接数据库

<?php
// 数据库连接信息
$host = "localhost";
$dbname = "test_db";
$username = "root";
$password = "password";

try {
  // 创建PDO实例
  $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
  
  // 设置PDO错误模式为异常
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  
  echo "数据库连接成功";
} catch(PDOException $e) {
  echo "数据库连接失败: " . $e->getMessage();
}
?>

16.2 执行SQL查询

<?php
// SELECT查询
$stmt = $pdo->prepare("SELECT * FROM users WHERE age > :age");
$stmt->bindParam(':age', $age, PDO::PARAM_INT);
$age = 18;
$stmt->execute();

// 获取所有结果
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

// INSERT插入
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
$name = "张三";
$email = "zhangsan@example.com";
$stmt->execute();

// 获取插入的ID
echo "新用户ID: " . $pdo->lastInsertId();

// UPDATE更新
$stmt = $pdo->prepare("UPDATE users SET age = :age WHERE id = :id");
$stmt->bindParam(':age', $age);
$stmt->bindParam(':id', $id);
$age = 31;
$id = 1;
$stmt->execute();

// DELETE删除
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->bindParam(':id', $id);
$id = 1;
$stmt->execute();
?>

17. 常用工具和最佳实践

17.1 调试技巧

<?php
// 使用 var_dump() 打印变量信息
$array = ["apple", "banana"];
var_dump($array);

// 使用 print_r() 打印易于理解的信息
echo "<pre>";
print_r($array);
echo "</pre>";

// 记录错误日志
error_log("这是一条错误信息");

// 使用 xdebug 扩展进行高级调试
?>

17.2 安全性考虑

<?php
// 防止SQL注入(使用预处理语句)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->bindParam(':username', $username);

// 防止XSS攻击(转义HTML)
$user_input = $_POST["input"];
$safe_input = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

// 密码哈希
$password = "user_password";
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

// 验证密码
if (password_verify($password, $hashed_password)) {
  echo "密码正确";
}

// 过滤输入数据
$email = filter_var($_POST["email"], FILTER_VALIDATE_EMAIL);
if ($email === false) {
  echo "无效的邮箱地址";
}
?>

17.3 性能优化

<?php
// 使用单引号而不是双引号(如果不需要变量解析)
$str1 = '这是一个普通字符串'; // 更快
$str2 = "这是一个包含变量的字符串: $var";

// 避免在循环中执行昂贵的操作
$count = count($array); // 在循环外计算
for ($i = 0; $i < $count; $i++) {
  // 循环体
}

// 使用PHP内置函数(通常用C实现,速度更快)
$string = str_replace("old", "new", $string); // 比手动实现更快

// 合理使用缓存
$cache_key = "data_" . $user_id;
if (apc_exists($cache_key)) {
  $data = apc_fetch($cache_key);
} else {
  // 从数据库获取数据
  $data = fetchFromDatabase($user_id);
  apc_store($cache_key, $data, 3600); // 缓存1小时
}
?>

18. 总结

本指南涵盖了PHP的核心概念和常用功能,包括基础语法、数据类型、控制结构、函数、数组、字符串处理、文件操作、面向对象编程、错误处理、会话管理和数据库操作等内容。通过学习和实践这些知识,您可以开始编写PHP应用程序并逐步提高您的编程技能。

要深入学习PHP,建议参考以下资源:

祝您在PHP编程之旅中取得成功!

更多推荐