字符串函数
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 扩展示例
<?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 扩展示例
<?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)
- 使用适当的错误日志级别