PHP参考手册

快速查找PHP函数、语法和用法

PHP参考手册

本参考手册提供PHP函数、语法和用法的快速查询。使用搜索功能或浏览分类快速找到你需要的信息。

字符串函数

PHP提供了丰富的字符串处理函数,用于操作、格式化和分析文本数据。字符串在PHP中是基本数据类型之一,可以包含任意字符序列。

strlen() - 获取字符串长度

语法: int strlen ( string $string )

描述: 返回给定字符串的长度。对于多字节字符串,请使用mb_strlen()函数。

参数: $string - 要计算长度的字符串

返回值: 字符串的长度,如果字符串为空则返回0

示例
<?php
$str = "Hello World";
echo strlen($str); // 输出: 11

$empty = "";
echo strlen($empty); // 输出: 0

$chinese = "你好世界";
echo strlen($chinese); // 输出: 12 (UTF-8编码下每个中文字符占3字节)
echo mb_strlen($chinese, 'UTF-8'); // 输出: 4
?>

strpos() - 查找字符串首次出现的位置

语法: int|false strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

描述: 返回 needle 在 haystack 中首次出现的数字位置。注意:位置从0开始计数。

参数:

  • $haystack - 被搜索的字符串
  • $needle - 要查找的字符串
  • $offset - 可选,搜索的起始位置

返回值: 找到返回位置,未找到返回false

示例
<?php
$str = "Hello World";
$pos = strpos($str, "World");
echo $pos; // 输出: 6

$pos2 = strpos($str, "world"); // 注意大小写
var_dump($pos2); // 输出: bool(false)

$pos3 = strpos($str, "o", 5); // 从位置5开始搜索
echo $pos3; // 输出: 7
?>

substr() - 返回字符串的子串

语法: string substr ( string $string , int $start [, int $length ] )

描述: 返回字符串 string 由 start 和 length 参数指定的子字符串。

参数:

  • $string - 输入字符串
  • $start - 起始位置,可为负数(从末尾开始计数)
  • $length - 可选,子串长度,可为负数(从末尾截断)
示例
<?php
$str = "Hello World";
echo substr($str, 6); // 输出: World
echo substr($str, 0, 5); // 输出: Hello
echo substr($str, -5); // 输出: World
echo substr($str, 0, -6); // 输出: Hello

// 处理中文字符串时使用mb_substr
$chinese = "你好世界";
echo mb_substr($chinese, 0, 2, 'UTF-8'); // 输出: 你好
?>

str_replace() - 子字符串替换

语法: mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

描述: 该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。

参数:

  • $search - 要查找的值
  • $replace - 替换 search 的值
  • $subject - 被搜索替换的字符串或数组
  • &$count - 可选,如果指定,将被设置为替换执行的次数
示例
<?php
$str = "Hello World";
$new_str = str_replace("World", "PHP", $str);
echo $new_str; // 输出: Hello PHP

// 数组替换
$search = ['Hello', 'World'];
$replace = ['Hi', 'Universe'];
$new_str2 = str_replace($search, $replace, $str);
echo $new_str2; // 输出: Hi Universe

// 使用计数参数
$count = 0;
$str3 = "apple apple apple";
$new_str3 = str_replace("apple", "orange", $str3, $count);
echo $new_str3; // 输出: orange orange orange
echo $count; // 输出: 3
?>

trim() - 去除字符串首尾空白字符

语法: string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )

描述: 去除字符串首尾处的空白字符(或者其他字符)。

参数:

  • $str - 待处理的字符串
  • $character_mask - 可选,指定要去除的字符
示例
<?php
$str = "   Hello World   ";
echo "'" . trim($str) . "'"; // 输出: 'Hello World'

// 去除特定字符
$str2 = "###Hello World###";
echo trim($str2, "#"); // 输出: Hello World

// 相关函数 ltrim() 和 rtrim()
$str3 = "   Hello World   ";
echo "'" . ltrim($str3) . "'"; // 输出: 'Hello World   '
echo "'" . rtrim($str3) . "'"; // 输出: '   Hello World'
?>

其他常用字符串函数

  • strtolower() - 将字符串转换为小写
  • strtoupper() - 将字符串转换为大写
  • ucfirst() - 将字符串的首字母转换为大写
  • ucwords() - 将字符串中每个单词的首字母转换为大写
  • explode() - 使用一个字符串分割另一个字符串
  • implode() - 将一个一维数组的值转化为字符串
  • htmlspecialchars() - 将特殊字符转换为HTML实体
  • strip_tags() - 从字符串中去除HTML和PHP标签
  • addslashes() - 使用反斜线引用字符串
  • stripslashes() - 反引用一个引用字符串

数组函数

PHP数组是一种强大的数据结构,可以存储多个值。数组函数提供了对数组进行排序、搜索、修改和操作的各种方法。

count() - 计算数组中的单元数目

语法: int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] )

描述: 统计数组中的元素数量。对于对象,如果实现了Countable接口,则返回该接口的count()方法的返回值。

参数:

  • $array_or_countable - 数组或可计数的对象
  • $mode - 可选,如果设为COUNT_RECURSIVE(或1),count()将递归地对数组计数
示例
<?php
$arr = ['a', 'b', 'c'];
echo count($arr); // 输出: 3

// 多维数组
$multi_arr = [
    'fruits' => ['apple', 'banana', 'orange'],
    'colors' => ['red', 'green', 'blue']
];
echo count($multi_arr); // 输出: 2
echo count($multi_arr, COUNT_RECURSIVE); // 输出: 8 (2个键 + 6个值)
?>

array_push() - 将一个或多个单元压入数组的末尾

语法: int array_push ( array &$array , mixed $value1 [, mixed $... ] )

描述: 将一个或多个单元压入数组的末尾(入栈)。注意:如果你使用array_push()来给数组增加一个单元,还不如用$array[] =,因为这样没有调用函数的额外负担。

示例
<?php
$arr = ['a', 'b'];
array_push($arr, 'c', 'd');
print_r($arr); // 输出: Array ( [0] => a [1] => b [2] => c [3] => d )

// 使用 $array[] = 语法
$arr2 = ['a', 'b'];
$arr2[] = 'c';
$arr2[] = 'd';
print_r($arr2); // 输出: Array ( [0] => a [1] => b [2] => c [3] => d )
?>

array_pop() - 弹出数组最后一个单元

语法: mixed array_pop ( array &$array )

描述: 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。

示例
<?php
$arr = ['a', 'b', 'c'];
$last = array_pop($arr);
echo $last; // 输出: c
print_r($arr); // 输出: Array ( [0] => a [1] => b )

// 实现栈结构
$stack = [];
array_push($stack, 'apple', 'banana', 'cherry');
echo array_pop($stack); // 输出: cherry
echo array_pop($stack); // 输出: banana
echo array_pop($stack); // 输出: apple
?>

array_merge() - 合并一个或多个数组

语法: array array_merge ( array $array1 [, array $... ] )

描述: 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

示例
<?php
$arr1 = ['a', 'b'];
$arr2 = ['c', 'd'];
$result = array_merge($arr1, $arr2);
print_r($result); // 输出: Array ( [0] => a [1] => b [2] => c [3] => d )

// 关联数组合并
$arr3 = ['name' => 'John', 'age' => 25];
$arr4 = ['age' => 26, 'city' => 'New York'];
$result2 = array_merge($arr3, $arr4);
print_r($result2); // 输出: Array ( [name] => John [age] => 26 [city] => New York )
?>

array_key_exists() - 检查数组里是否有指定的键名

语法: bool array_key_exists ( mixed $key , array $array )

描述: 数组里有键 key 时,array_key_exists() 返回 TRUE。key 可以是任何能作为数组索引的值。

示例
<?php
$arr = ['name' => '张三', 'age' => 25];
if (array_key_exists('name', $arr)) {
    echo "键 'name' 存在";
}

// 与 isset() 的区别
$arr2 = ['name' => null];
var_dump(array_key_exists('name', $arr2)); // bool(true)
var_dump(isset($arr2['name'])); // bool(false)
?>

其他常用数组函数

  • array_keys() - 返回数组中所有的键名
  • array_values() - 返回数组中所有的值
  • in_array() - 检查数组中是否存在某个值
  • array_search() - 在数组中搜索给定的值,如果成功则返回相应的键名
  • array_slice() - 从数组中取出一段
  • array_splice() - 把数组中的一部分去掉并用其它值取代
  • sort() - 对数组排序
  • rsort() - 对数组逆向排序
  • asort() - 对数组进行排序并保持索引关系
  • ksort() - 对数组按照键名排序
  • array_filter() - 用回调函数过滤数组中的单元
  • array_map() - 为数组的每个元素应用回调函数
  • array_reduce() - 用回调函数迭代地将数组简化为单一的值

文件函数

PHP提供了丰富的文件系统函数,用于创建、读取、写入、删除和操作文件及目录。

file_get_contents() - 将整个文件读入一个字符串

语法: string file_get_contents ( string $filename [, bool $use_include_path = FALSE [, resource $context [, int $offset = 0 [, int $maxlen ]]]] )

描述: 将整个文件读入一个字符串。该函数是用于将文件的内容读入到一个字符串中的首选方法。

示例
<?php
$content = file_get_contents('example.txt');
echo $content;

// 读取远程文件
$html = file_get_contents('https://www.example.com/');
echo $html;

// 使用上下文
$opts = [
    'http' => [
        'method' => "GET",
        'header' => "Accept-language: en\r\n" .
                  "Cookie: foo=bar\r\n"
    ]
];
$context = stream_context_create($opts);
$file = file_get_contents('https://www.example.com/', false, $context);
?>

file_put_contents() - 将一个字符串写入文件

语法: int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )

描述: 和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

示例
<?php
$data = "Hello World";
file_put_contents('example.txt', $data);

// 追加内容
$new_data = "\nNew Line";
file_put_contents('example.txt', $new_data, FILE_APPEND);

// 锁定文件
$data2 = "Locked content";
file_put_contents('example.txt', $data2, LOCK_EX);
?>

is_file() - 判断给定文件名是否为一个正常的文件

语法: bool is_file ( string $filename )

描述: 判断给定文件名是否为一个正常的文件。

示例
<?php
if (is_file('example.txt')) {
    echo "example.txt 是一个文件";
}

// 与 is_dir() 的区别
$filename = 'example.txt';
if (is_file($filename)) {
    echo "$filename 是一个文件";
} elseif (is_dir($filename)) {
    echo "$filename 是一个目录";
} else {
    echo "$filename 不存在";
}
?>

file_exists() - 检查文件或目录是否存在

语法: bool file_exists ( string $filename )

描述: 检查文件或目录是否存在。

示例
<?php
if (file_exists('example.txt')) {
    echo "example.txt 存在";
}

// 检查目录是否存在
if (file_exists('/path/to/directory')) {
    echo "目录存在";
}
?>

其他常用文件函数

  • fopen() - 打开文件或者URL
  • fclose() - 关闭一个已打开的文件指针
  • fwrite() - 写入文件(可安全用于二进制文件)
  • fread() - 读取文件(可安全用于二进制文件)
  • fgets() - 从文件指针中读取一行
  • feof() - 测试文件指针是否到了文件结束的位置
  • rename() - 重命名一个文件或目录
  • unlink() - 删除文件
  • copy() - 拷贝文件
  • mkdir() - 新建目录
  • rmdir() - 删除目录
  • scandir() - 列出指定路径中的文件和目录
  • pathinfo() - 返回文件路径的信息
  • basename() - 返回路径中的文件名部分
  • dirname() - 返回路径中的目录部分

日期函数

PHP提供了强大的日期和时间处理功能,包括日期格式化、时间戳转换、时区设置等。

date() - 格式化一个本地时间/日期

语法: string date ( string $format [, int $timestamp = time() ] )

描述: 返回将整数 timestamp 按照给定的格式字串而产生的字符串。

示例
<?php
echo date('Y-m-d H:i:s'); // 输出: 2023-11-15 14:30:25
echo date('Y年m月d日'); // 输出: 2023年11月15日

// 使用特定时间戳
$timestamp = strtotime('2023-01-01');
echo date('Y-m-d', $timestamp); // 输出: 2023-01-01

// 常用格式字符
echo date('l'); // 星期几的完整文本表示
echo date('F'); // 月份的完整文本表示
echo date('W'); // ISO-8601 格式年份中的第几周
echo date('z'); // 年份中的第几天
?>

time() - 返回当前的 Unix 时间戳

语法: int time ( void )

描述: 返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。

示例
<?php
echo time(); // 输出: 1700041825

// 计算未来时间
$next_week = time() + (7 * 24 * 60 * 60);
echo '现在: ' . date('Y-m-d') . "\n";
echo '下周: ' . date('Y-m-d', $next_week);

// 计算脚本执行时间
$start = time();
// 执行一些操作...
sleep(2);
$end = time();
echo "脚本执行时间: " . ($end - $start) . " 秒";
?>

strtotime() - 将任何英文文本的日期时间描述解析为 Unix 时间戳

语法: int strtotime ( string $datetime [, int $baseTimestamp = time() ] )

描述: 将任何英文文本的日期时间描述解析为 Unix 时间戳。

示例
<?php
echo strtotime("now"); // 当前时间戳
echo strtotime("10 September 2023"); // 指定日期时间戳
echo strtotime("+1 day"); // 明天的时间戳
echo strtotime("+1 week 2 days 4 hours 2 seconds"); // 复杂时间计算
echo strtotime("next Monday"); // 下周一
echo strtotime("last Friday"); // 上周五

// 结合 date() 使用
echo date('Y-m-d', strtotime("+1 month")); // 一个月后的日期
?>

其他常用日期函数

  • mktime() - 取得一个日期的 Unix 时间戳
  • checkdate() - 验证一个格里高里日期
  • getdate() - 取得日期/时间信息
  • gmdate() - 格式化一个 GMT/UTC 日期/时间
  • idate() - 将本地时间日期格式化为整数
  • date_default_timezone_set() - 设定用于一个脚本中所有日期时间函数的默认时区
  • date_default_timezone_get() - 取得一个脚本中所有日期时间函数所使用的默认时区
  • DateTime 类 - 面向对象的日期时间处理

数学函数

PHP提供了丰富的数学函数,用于执行各种数学运算,包括基本算术、三角函数、对数函数等。

常用数学函数示例

数学函数示例
<?php
// 基本数学函数
echo abs(-5); // 绝对值: 5
echo ceil(4.3); // 向上取整: 5
echo floor(4.7); // 向下取整: 4
echo round(3.14159, 2); // 四舍五入: 3.14

// 幂和指数
echo pow(2, 8); // 2的8次方: 256
echo sqrt(16); // 平方根: 4
echo exp(1); // e的1次方: 2.718281828459
echo log(10); // 自然对数: 2.302585092994

// 三角函数
echo sin(deg2rad(30)); // 正弦值: 0.5
echo cos(deg2rad(60)); // 余弦值: 0.5
echo tan(deg2rad(45)); // 正切值: 1

// 随机数
echo rand(1, 100); // 1到100之间的随机整数
echo mt_rand(1, 100); // 更好的随机数生成器

// 进制转换
echo decbin(10); // 十进制转二进制: 1010
echo bindec('1010'); // 二进制转十进制: 10
echo dechex(255); // 十进制转十六进制: ff
echo hexdec('ff'); // 十六进制转十进制: 255
?>

数据库函数

PHP支持多种数据库操作方式,包括MySQLi、PDO等扩展,用于连接和操作数据库。

MySQLi 扩展示例

MySQLi 连接和查询
<?php
// 连接数据库
$mysqli = new mysqli("localhost", "username", "password", "database");

// 检查连接
if ($mysqli->connect_error) {
    die("连接失败: " . $mysqli->connect_error);
}

// 预处理语句查询
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);

// 设置参数并执行
$name = "John";
$email = "john@example.com";
$stmt->execute();

echo "新记录插入成功";

// 关闭连接
$stmt->close();
$mysqli->close();
?>

PDO 扩展示例

PDO 连接和查询
<?php
try {
    // 连接数据库
    $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
    // 设置 PDO 错误模式为异常
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 预处理语句查询
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);
    
    // 设置参数并执行
    $id = 1;
    $stmt->execute();
    
    // 获取结果
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);
    
} catch(PDOException $e) {
    echo "错误: " . $e->getMessage();
}

// 关闭连接
$pdo = null;
?>

PHP版本兼容性

了解不同PHP版本之间的特性差异对于编写可移植的代码非常重要。下表列出了PHP主要版本之间的一些关键特性差异。

特性 PHP 5.6 PHP 7.0 PHP 7.4 PHP 8.0 PHP 8.1
标量类型声明 不支持 支持 支持 支持 支持
返回类型声明 不支持 支持 支持 支持 支持
空合并运算符 不支持 支持 支持 支持 支持
飞船运算符 不支持 支持 支持 支持 支持
匿名类 不支持 支持 支持 支持 支持
命名参数 不支持 不支持 不支持 支持 支持
属性 不支持 不支持 不支持 支持 支持
Match表达式 不支持 不支持 不支持 支持 支持
纤程(Fiber) 不支持 不支持 不支持 不支持 支持
只读属性 不支持 不支持 不支持 不支持 支持
版本选择建议:
  • 新项目建议使用PHP 8.0或更高版本
  • 现有项目应至少升级到PHP 7.4以获取安全更新
  • PHP 5.6及更早版本已停止支持,存在安全风险
  • 定期检查PHP官方支持版本页面获取最新信息

PHP最佳实践

遵循PHP最佳实践可以编写出更安全、高效和可维护的代码。

代码风格和规范

  • 遵循PSR标准(PSR-1, PSR-2, PSR-12)
  • 使用有意义的变量和函数名
  • 保持函数和方法简短(通常不超过20行)
  • 使用适当的注释和文档块
  • 避免使用全局变量

安全实践

  • 对所有用户输入进行验证和过滤
  • 使用预处理语句防止SQL注入
  • 对输出进行适当的转义防止XSS攻击
  • 使用密码哈希函数(password_hash)存储密码
  • 实施CSRF保护

性能优化

  • 使用OPcache加速PHP执行
  • 避免在循环中执行数据库查询
  • 合理使用缓存(APCu, Redis, Memcached)
  • 优化自动加载(使用Composer)
  • 使用适当的错误日志级别