PHP array_key_last() 函数详解

array_key_last() 函数是PHP 7.3中引入的实用函数,与array_key_first()配对使用,用于安全地获取数组的最后一个键名。它提供了一种简洁、可靠的方式来访问数组的最后一个键,避免了手动移动数组指针到末尾的复杂性。

PHP版本要求: array_key_last() 函数需要 PHP 7.3.0 或更高版本。在旧版本中,您需要使用替代方法来实现相同功能。

函数定义和用途

array_key_last() 函数返回数组中最后一个元素的键名,而不改变数组的内部指针。这使得它成为处理数组末尾元素的理想选择,特别是在需要保持数组状态不变的情况下。

主要应用场景

  • 数组遍历控制: 在循环结束时获取最后一个键名
  • 数据验证: 检查数组是否以特定键名结尾
  • 日志处理: 获取日志数组的最新条目
  • 分页处理: 确定数据集的结束边界
  • 缓存管理: 基于数组最后一个键管理缓存

语法和参数

array_key_last(array);
参数 描述
array 必需。规定要处理的数组。
重要说明: 如果数组为空,array_key_last() 将返回 NULL。该函数不会改变数组的内部指针。

基本使用实例

实例 1:基本用法

演示如何使用 array_key_last() 获取数组的最后一个键名。

<?php
// 关联数组示例
$user = array(
    'id' => 101,
    'name' => '张三',
    'email' => 'zhangsan@example.com',
    'age' => 25,
    'city' => '北京'
);

echo "用户数组:";
print_r($user);

// 获取最后一个键名
$lastKey = array_key_last($user);
echo "最后一个键名: " . $lastKey . "\n";
echo "最后一个键对应的值: " . $user[$lastKey] . "\n";

// 数值数组示例
$colors = array('红色', '绿色', '蓝色', '黄色');
echo "\n颜色数组:";
print_r($colors);

$lastColorKey = array_key_last($colors);
echo "最后一个键名: " . $lastColorKey . "\n";
echo "最后一个颜色: " . $colors[$lastColorKey] . "\n";

// 输出:
// 最后一个键名: city
// 最后一个键对应的值: 北京
// 最后一个键名: 3
// 最后一个颜色: 黄色
?>

实例 2:处理空数组和边界情况

演示 array_key_last() 如何处理空数组和特殊键名。

<?php
// 空数组示例
$emptyArray = array();

echo "空数组:";
print_r($emptyArray);

$lastKey = array_key_last($emptyArray);
echo "最后一个键名: ";
var_dump($lastKey);

// 在实际使用中应该检查返回值
if($lastKey === null) {
    echo "数组为空,无法获取最后一个键名\n";
} else {
    echo "最后一个键名: " . $lastKey . "\n";
}

// 只有一个元素的数组
$singleElement = array('only_key' => '唯一值');
echo "\n单元素数组:";
print_r($singleElement);

$lastKey = array_key_last($singleElement);
echo "最后一个键名: " . $lastKey . "\n";
echo "对应的值: " . $singleElement[$lastKey] . "\n";

// 包含特殊键名的数组
$specialKeys = array(
    null => 'null键的值',
    0 => '零键的值',
    '' => '空字符串键的值',
    'normal_key' => '普通键的值'
);

echo "\n特殊键名数组:";
print_r($specialKeys);

$lastKey = array_key_last($specialKeys);
echo "最后一个键名: ";
var_dump($lastKey);
echo "最后一个键对应的值: " . $specialKeys[$lastKey] . "\n";
?>

与array_key_first()的配对使用

数组范围处理

演示如何同时使用 array_key_first() 和 array_key_last() 处理数组范围。

<?php
$products = array(
    'laptop' => '笔记本电脑',
    'phone' => '智能手机',
    'tablet' => '平板电脑',
    'watch' => '智能手表',
    'headphones' => '耳机'
);

echo "产品数组:";
print_r($products);

// 同时获取第一个和最后一个键名
$firstKey = array_key_first($products);
$lastKey = array_key_last($products);

echo "第一个键名: " . $firstKey . "\n";
echo "最后一个键名: " . $lastKey . "\n";
echo "产品范围: {$firstKey} - {$lastKey}\n";

// 计算数组跨度
function get_array_span($array) {
    if (empty($array)) {
        return null;
    }

    $first = array_key_first($array);
    $last = array_key_last($array);

    return array(
        'first_key' => $first,
        'last_key' => $last,
        'first_value' => $array[$first],
        'last_value' => $array[$last],
        'total_elements' => count($array)
    );
}

$spanInfo = get_array_span($products);
echo "数组跨度信息:";
print_r($spanInfo);

// 数组边界检查
function is_key_at_boundary($array, $key) {
    if (empty($array) || !array_key_exists($key, $array)) {
        return false;
    }

    $firstKey = array_key_first($array);
    $lastKey = array_key_last($array);

    if ($key === $firstKey) {
        return 'first';
    } elseif ($key === $lastKey) {
        return 'last';
    } else {
        return 'middle';
    }
}

// 测试边界检查
echo "键 'laptop' 的位置: " . is_key_at_boundary($products, 'laptop') . "\n";
echo "键 'headphones' 的位置: " . is_key_at_boundary($products, 'headphones') . "\n";
echo "键 'tablet' 的位置: " . is_key_at_boundary($products, 'tablet') . "\n";

// 数组切片处理
function get_array_edges($array, $edge_count = 1) {
    if (empty($array)) {
        return array();
    }

    $result = array();

    // 获取开头部分
    $keys = array_keys($array);
    $first_keys = array_slice($keys, 0, $edge_count);
    foreach ($first_keys as $key) {
        $result['first'][$key] = $array[$key];
    }

    // 获取结尾部分
    $last_keys = array_slice($keys, -$edge_count);
    foreach ($last_keys as $key) {
        $result['last'][$key] = $array[$key];
    }

    return $result;
}

$edges = get_array_edges($products, 2);
echo "数组首尾各2个元素:";
print_r($edges);
?>

实际应用案例

案例 1:日志记录处理

演示如何使用 array_key_last() 处理日志记录。

<?php
// 模拟日志记录数组(按时间戳排序)
$log_entries = array(
    '2023-10-01 08:00:00' => '用户登录',
    '2023-10-01 09:15:30' => '数据备份开始',
    '2023-10-01 10:30:45' => '数据备份完成',
    '2023-10-01 11:45:20' => '系统维护开始',
    '2023-10-01 12:30:15' => '系统维护结束',
    '2023-10-01 14:20:10' => '用户注销'
);

echo "日志记录:";
print_r($log_entries);

// 获取最新日志条目
$latest_log_key = array_key_last($log_entries);
$latest_log_message = $log_entries[$latest_log_key];

echo "最新日志时间: " . $latest_log_key . "\n";
echo "最新日志内容: " . $latest_log_message . "\n";

// 日志分析函数
function analyze_logs($logs) {
    if (empty($logs)) {
        return array('error' => '没有日志记录');
    }

    $first_key = array_key_first($logs);
    $last_key = array_key_last($logs);

    $analysis = array(
        'total_entries' => count($logs),
        'time_range' => array(
            'start' => $first_key,
            'end' => $last_key,
            'duration' => strtotime($last_key) - strtotime($first_key)
        ),
        'first_entry' => $logs[$first_key],
        'last_entry' => $logs[$last_key],
        'entries_per_hour' => count($logs) / max(1, (strtotime($last_key) - strtotime($first_key)) / 3600)
    );

    return $analysis;
}

$log_analysis = analyze_logs($log_entries);
echo "日志分析结果:";
print_r($log_analysis);

// 日志轮转功能
function rotate_logs(&$logs, $max_entries = 5) {
    if (count($logs) <= $max_entries) {
        return array(); // 无需轮转
    }

    $removed = array();
    $keys = array_keys($logs);

    // 保留最新的 $max_entries 条记录
    $keys_to_keep = array_slice($keys, -$max_entries);
    $keys_to_remove = array_slice($keys, 0, count($keys) - $max_entries);

    foreach ($keys_to_remove as $key) {
        $removed[$key] = $logs[$key];
        unset($logs[$key]);
    }

    return $removed;
}

echo "原始日志数量: " . count($log_entries) . "\n";
$removed_logs = rotate_logs($log_entries, 4);
echo "移除的日志数量: " . count($removed_logs) . "\n";
echo "保留的日志数量: " . count($log_entries) . "\n";
echo "保留的日志:";
print_r($log_entries);

// 获取当前日志状态
function get_log_status($logs) {
    if (empty($logs)) {
        return array(
            'status' => 'empty',
            'message' => '没有日志记录'
        );
    }

    $last_key = array_key_last($logs);
    $last_entry = $logs[$last_key];
    $last_time = strtotime($last_key);
    $current_time = time();
    $time_diff = $current_time - $last_time;

    $status = array(
        'last_entry_time' => $last_key,
        'last_entry_message' => $last_entry,
        'minutes_since_last_entry' => round($time_diff / 60, 2),
        'status' => $time_diff > 3600 ? 'stale' : 'active'
    );

    return $status;
}

$log_status = get_log_status($log_entries);
echo "当前日志状态:";
print_r($log_status);
?>

案例 2:分页和数据边界处理

演示如何使用 array_key_last() 处理分页和数据边界。

<?php
// 模拟数据库记录(按ID排序)
$records = array();
for ($i = 1001; $i <= 1020; $i++) {
    $records[$i] = "记录内容 {$i}";
}

echo "记录数组:";
print_r($records);

// 分页参数
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$per_page = 5;
$total_records = count($records);
$total_pages = ceil($total_records / $per_page);

// 计算分页边界
$first_record_id = array_key_first($records);
$last_record_id = array_key_last($records);

echo "分页信息:\n";
echo "总记录数: {$total_records}\n";
echo "每页显示: {$per_page}\n";
echo "总页数: {$total_pages}\n";
echo "当前页: {$page}\n";
echo "第一条记录ID: {$first_record_id}\n";
echo "最后一条记录ID: {$last_record_id}\n";

// 分页数据获取
function get_page_data($data, $page, $per_page) {
    $keys = array_keys($data);
    $total = count($keys);
    $total_pages = ceil($total / $per_page);

    if ($page < 1 || $page > $total_pages) {
        return array();
    }

    $start_index = ($page - 1) * $per_page;
    $page_keys = array_slice($keys, $start_index, $per_page);

    $page_data = array();
    foreach ($page_keys as $key) {
        $page_data[$key] = $data[$key];
    }

    return array(
        'data' => $page_data,
        'pagination' => array(
            'current_page' => $page,
            'per_page' => $per_page,
            'total_pages' => $total_pages,
            'total_records' => $total,
            'first_record' => array_key_first($page_data),
            'last_record' => array_key_last($page_data)
        )
    );
}

$page_result = get_page_data($records, $page, $per_page);
echo "第 {$page} 页数据:";
print_r($page_result);

// 基于最后一个键的无限滚动
function get_records_after($data, $last_seen_key, $limit = 5) {
    $keys = array_keys($data);
    $last_index = array_search($last_seen_key, $keys);

    if ($last_index === false) {
        return array(); // 键不存在
    }

    $next_index = $last_index + 1;
    if ($next_index >= count($keys)) {
        return array(); // 没有更多数据
    }

    $next_keys = array_slice($keys, $next_index, $limit);
    $result = array();
    foreach ($next_keys as $key) {
        $result[$key] = $data[$key];
    }

    return array(
        'data' => $result,
        'has_more' => ($next_index + $limit) < count($keys),
        'last_key' => array_key_last($result)
    );
}

// 测试无限滚动
echo "从记录 1005 开始获取后面5条:\n";
$scroll_data = get_records_after($records, 1005, 5);
print_r($scroll_data);

// 数据边界验证
function validate_data_range($data, $expected_first, $expected_last) {
    $actual_first = array_key_first($data);
    $actual_last = array_key_last($data);

    $issues = array();

    if ($actual_first !== $expected_first) {
        $issues[] = "第一个键不匹配: 期望 {$expected_first}, 实际 {$actual_first}";
    }

    if ($actual_last !== $expected_last) {
        $issues[] = "最后一个键不匹配: 期望 {$expected_last}, 实际 {$actual_last}";
    }

    return empty($issues) ? true : $issues;
}

// 测试数据验证
$validation_result = validate_data_range($records, 1001, 1020);
echo "数据范围验证: ";
if ($validation_result === true) {
    echo "通过\n";
} else {
    echo "失败 - " . implode(', ', $validation_result) . "\n";
}
?>

案例 3:缓存管理和数据同步

演示如何使用 array_key_last() 进行缓存管理和数据同步。

<?php
// 模拟缓存数据(按时间戳存储)
$cache_data = array(
    'cache_1696156800' => array('data' => '内容A', 'expires' => 1696157400),
    'cache_1696156900' => array('data' => '内容B', 'expires' => 1696157500),
    'cache_1696157000' => array('data' => '内容C', 'expires' => 1696157600),
    'cache_1696157100' => array('data' => '内容D', 'expires' => 1696157700),
    'cache_1696157200' => array('data' => '内容E', 'expires' => 1696157800)
);

echo "缓存数据:";
print_r($cache_data);

// 获取最新的缓存条目
$latest_cache_key = array_key_last($cache_data);
$latest_cache = $cache_data[$latest_cache_key];

echo "最新缓存键: " . $latest_cache_key . "\n";
echo "最新缓存数据:";
print_r($latest_cache);

// 缓存清理函数(基于时间和数量)
function clean_cache(&$cache, $max_entries = 10, $max_age = 3600) {
    $current_time = time();
    $removed_count = 0;

    // 基于数量的清理
    while (count($cache) > $max_entries) {
        $first_key = array_key_first($cache);
        unset($cache[$first_key]);
        $removed_count++;
    }

    // 基于时间的清理
    foreach ($cache as $key => $entry) {
        if ($current_time > $entry['expires']) {
            unset($cache[$key]);
            $removed_count++;
        }
    }

    return $removed_count;
}

echo "清理前的缓存数量: " . count($cache_data) . "\n";
$cleaned_count = clean_cache($cache_data, 3, 3600);
echo "清理的缓存条目: " . $cleaned_count . "\n";
echo "清理后的缓存数量: " . count($cache_data) . "\n";
echo "清理后的缓存:";
print_r($cache_data);

// 缓存同步功能
class CacheManager {
    private $cache = array();
    private $max_size;

    public function __construct($max_size = 100) {
        $this->max_size = $max_size;
    }

    public function set($key, $value, $ttl = 3600) {
        // 如果缓存已满,移除最旧的条目
        if (count($this->cache) >= $this->max_size) {
            $oldest_key = array_key_first($this->cache);
            unset($this->cache[$oldest_key]);
        }

        $this->cache[$key] = array(
            'value' => $value,
            'expires' => time() + $ttl
        );

        return true;
    }

    public function get($key) {
        if (!isset($this->cache[$key])) {
            return null;
        }

        $entry = $this->cache[$key];

        // 检查是否过期
        if (time() > $entry['expires']) {
            unset($this->cache[$key]);
            return null;
        }

        return $entry['value'];
    }

    public function getLatest() {
        if (empty($this->cache)) {
            return null;
        }

        $latest_key = array_key_last($this->cache);
        return $this->get($latest_key);
    }

    public function getOldest() {
        if (empty($this->cache)) {
            return null;
        }

        $oldest_key = array_key_first($this->cache);
        return $this->get($oldest_key);
    }

    public function getStats() {
        $latest_key = array_key_last($this->cache);
        $oldest_key = array_key_first($this->cache);

        return array(
            'total_entries' => count($this->cache),
            'latest_key' => $latest_key,
            'oldest_key' => $oldest_key,
            'latest_value' => $latest_key ? $this->get($latest_key) : null,
            'oldest_value' => $oldest_key ? $this->get($oldest_key) : null
        );
    }

    public function getAll() {
        return $this->cache;
    }
}

// 使用缓存管理器
$cacheManager = new CacheManager(5);

// 添加一些缓存数据
$cacheManager->set('user_101', array('name' => '张三', 'age' => 25));
$cacheManager->set('user_102', array('name' => '李四', 'age' => 30));
$cacheManager->set('user_103', array('name' => '王五', 'age' => 28));
$cacheManager->set('user_104', array('name' => '赵六', 'age' => 32));
$cacheManager->set('user_105', array('name' => '钱七', 'age' => 29));

echo "缓存管理器状态:";
print_r($cacheManager->getStats());

// 添加更多数据(会触发清理)
$cacheManager->set('user_106', array('name' => '孙八', 'age' => 27));

echo "添加新数据后的状态:";
print_r($cacheManager->getStats());

echo "最新的缓存值:";
print_r($cacheManager->getLatest());

echo "最旧的缓存值:";
print_r($cacheManager->getOldest());
?>

PHP 7.3以下版本的替代方案

兼容性解决方案

演示在PHP 7.3以下版本中如何实现 array_key_last() 的功能。

<?php
/**
 * array_key_last() 的兼容性实现
 * 用于 PHP 7.3 以下的版本
 */
if (!function_exists('array_key_last')) {
    function array_key_last(array $array) {
        if (empty($array)) {
            return null;
        }

        // 方法1: 使用 end() 和 key()
        end($array);
        return key($array);

        // 方法2: 使用 array_keys()(性能较差)
        // $keys = array_keys($array);
        // return $keys[count($keys) - 1] ?? null;
    }
}

/**
 * 安全的 array_key_last 实现
 */
function safe_array_key_last($array) {
    if (!is_array($array) || empty($array)) {
        return null;
    }

    if (function_exists('array_key_last')) {
        return array_key_last($array);
    }

    // 兼容性实现
    end($array);
    $last_key = key($array);
    reset($array); // 恢复指针位置

    return $last_key;
}

// 测试兼容性函数
$test_array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);

echo "测试数组:";
print_r($test_array);

echo "array_key_last() 结果: ";
var_dump(array_key_last($test_array));

echo "safe_array_key_last() 结果: ";
var_dump(safe_array_key_last($test_array));

// 验证指针位置未被改变
echo "验证指针位置: ";
var_dump(key($test_array));

// 性能比较
function benchmark_array_key_functions($array) {
    $iterations = 10000;

    // 测试 array_key_last 兼容版本
    $start = microtime(true);
    for ($i = 0; $i < $iterations; $i++) {
        $result = array_key_last($array);
    }
    $time1 = microtime(true) - $start;

    // 测试使用 end() 和 key()
    $start = microtime(true);
    for ($i = 0; $i < $iterations; $i++) {
        end($array);
        $result = key($array);
        reset($array);
    }
    $time2 = microtime(true) - $start;

    // 测试使用 array_keys()
    $start = microtime(true);
    for ($i = 0; $i < $iterations; $i++) {
        $keys = array_keys($array);
        $result = $keys[count($keys) - 1] ?? null;
    }
    $time3 = microtime(true) - $start;

    echo "性能比较 ({$iterations} 次迭代):\n";
    echo "array_key_last(): " . round($time1, 4) . " 秒\n";
    echo "end() + key() + reset(): " . round($time2, 4) . " 秒\n";
    echo "array_keys(): " . round($time3, 4) . " 秒\n";
}

// 运行性能测试
benchmark_array_key_functions($test_array);

// 批量处理函数
function process_array_edges($array, $callback) {
    if (empty($array)) {
        return null;
    }

    $first_key = array_key_first($array);
    $last_key = array_key_last($array);

    return $callback($first_key, $last_key, $array);
}

// 使用示例
$result = process_array_edges($test_array, function($first, $last, $array) {
    return array(
        'first_element' => $array[$first],
        'last_element' => $array[$last],
        'range' => "{$first} - {$last}"
    );
});

echo "数组边界处理结果:";
print_r($result);
?>

技术细节

返回值: 返回数组中最后一个元素的键名。如果数组为空,则返回 NULL。
PHP 版本: 7.3+
更新日志:
  • PHP 7.3.0 - 函数首次引入

注意事项和最佳实践

重要注意事项

  • PHP版本要求: 需要 PHP 7.3.0 或更高版本
  • 空数组处理: 对空数组返回 NULL,而不是报错
  • 内部指针: 不会改变数组的内部指针位置
  • 性能考虑: 比使用 end() + key() 或 array_keys() 更高效
  • 关联数组: 适用于关联数组和数值数组
  • 排序影响: 结果取决于数组的实际排序,不一定是最大值

最佳实践

  • 在使用前检查PHP版本,或提供兼容性实现
  • 始终检查返回值是否为NULL,特别是处理用户输入时
  • 对于性能敏感的应用,优先使用 array_key_last()
  • 结合 array_key_first() 使用,处理数组的两端
  • 在循环外部使用,避免不必要的性能开销
  • 对于排序数组,确保理解排序规则对结果的影响

实用工具函数

<?php
/**
 * 安全地获取数组的最后一个元素(键和值)
 */
function array_last_element($array) {
    if (empty($array)) {
        return null;
    }

    $lastKey = array_key_last($array);
    return array(
        'key' => $lastKey,
        'value' => $array[$lastKey]
    );
}

/**
 * 获取数组的后N个键名
 */
function array_last_keys($array, $count = 1) {
    if (empty($array) || $count <= 0) {
        return array();
    }

    $keys = array_keys($array);
    return array_slice($keys, -$count);
}

/**
 * 检查数组是否以特定键名结尾
 */
function array_ends_with_key($array, $expectedKey) {
    $lastKey = array_key_last($array);
    return $lastKey === $expectedKey;
}

/**
 * 获取数组最后一个元素的值
 */
function array_last_value($array) {
    $lastKey = array_key_last($array);
    return $lastKey !== null ? $array[$lastKey] : null;
}

/**
 * 获取数组的最后一个非空元素
 */
function array_last_non_empty($array) {
    $reversed = array_reverse($array, true);
    foreach ($reversed as $key => $value) {
        if (!empty($value)) {
            return array('key' => $key, 'value' => $value);
        }
    }
    return null;
}

// 测试工具函数
$sample_array = array(
    'name' => '张三',
    'age' => 25,
    'email' => 'zhangsan@example.com',
    'city' => '北京',
    'phone' => ''
);

echo "测试数组:";
print_r($sample_array);

echo "最后一个元素:";
print_r(array_last_element($sample_array));

echo "后2个键名:";
print_r(array_last_keys($sample_array, 2));

echo "是否以 'phone' 结尾: ";
var_dump(array_ends_with_key($sample_array, 'phone'));

echo "最后一个值: " . array_last_value($sample_array) . "\n";

echo "最后一个非空元素:";
print_r(array_last_non_empty($sample_array));

// 高级应用:数据流处理
class DataStreamProcessor {
    private $data = array();
    private $max_size;

    public function __construct($max_size = 1000) {
        $this->max_size = $max_size;
    }

    public function add($key, $value) {
        $this->data[$key] = $value;

        // 维护数据流大小
        if (count($this->data) > $this->max_size) {
            $oldest_key = array_key_first($this->data);
            unset($this->data[$oldest_key]);
        }
    }

    public function getLatest($count = 1) {
        if (empty($this->data)) {
            return array();
        }

        $keys = array_keys($this->data);
        $latest_keys = array_slice($keys, -$count);

        $result = array();
        foreach ($latest_keys as $key) {
            $result[$key] = $this->data[$key];
        }

        return $result;
    }

    public function getSince($key) {
        $keys = array_keys($this->data);
        $key_index = array_search($key, $keys);

        if ($key_index === false) {
            return array();
        }

        $since_keys = array_slice($keys, $key_index + 1);
        $result = array();
        foreach ($since_keys as $k) {
            $result[$k] = $this->data[$k];
        }

        return $result;
    }

    public function getStats() {
        return array(
            'total' => count($this->data),
            'first_key' => array_key_first($this->data),
            'last_key' => array_key_last($this->data),
            'latest_value' => $this->getLatest(1)
        );
    }
}

// 使用数据流处理器
$processor = new DataStreamProcessor(5);

// 添加数据
$processor->add('time_1', '数据1');
$processor->add('time_2', '数据2');
$processor->add('time_3', '数据3');
$processor->add('time_4', '数据4');
$processor->add('time_5', '数据5');

echo "数据流状态:";
print_r($processor->getStats());

// 添加更多数据(会触发清理)
$processor->add('time_6', '数据6');

echo "添加新数据后的状态:";
print_r($processor->getStats());

echo "最新的2条数据:";
print_r($processor->getLatest(2));

echo "从 time_3 之后的数据:";
print_r($processor->getSince('time_3'));
?>

本章总结

  • array_key_last() 用于安全地获取数组的最后一个键名
  • 需要 PHP 7.3.0 或更高版本
  • 空数组返回 NULL,不会产生错误或警告
  • 不改变数组的内部指针,这是与 end() + key() 的主要区别
  • 比替代方法性能更好,特别是在大型数组上
  • 适用于关联数组和数值数组
  • 通常与 array_key_first() 配对使用,处理数组的两端
  • 在旧版本PHP中可以通过兼容性函数实现相同功能
  • 特别适用于日志处理、分页、缓存管理等场景