EP047. “修复 Undefined array key 警告(isset() 用法)”
🔒 登录后可标记已读📌 验证情况特别说明:这一讲的内容我核对过 sources/Section 10/38-2021/38-end、39-2021/39-end、40-2021/40-end 三个代码资料夹的 functions.php,发现三个版本里 pageBanner() 都还是维持原来的 !$args['xxx'] 写法,没有一个包含这一讲要教的 isset() 修复。也就是说,官方发的这几个课程代码压缩包本身没跟上这一讲的修改(EP048 的「加防护条件」倒是有反映在 39-end/40-end 里,但那是在没有 isset() 的旧写法基础上加的)。所以跟本项目其它篇不一样,下面的代码块没有 -end 资料夹可以核对,是照着这一讲的 transcript 原文抄的——不过这一讲的 transcript 本身就是一篇写好的图文教程,前后代码都完整贴出来了,不是靠听写重建,可信度还可以,但请知悉这一点。
上一讲写的 pageBanner() 里,三处 if (!$args['title']) 这类判断在现代 PHP 里会报 "Undefined array key" Warning,因为直接访问一个可能不存在的数组键本身就是不被允许的。这一讲把这三处判断全部换成 isset($args['xxx']),用 PHP 专门设计好的工具去「检查键是否存在」,而不是直接硬碰它的值,从而消除警告。
[截图:修复前,前台页面顶部出现的"Undefined array key"PHP Warning 文字(页面 HTML 顶端)]
涉及文件
wp-content/themes/fictional-university-theme/functions.php(修改:pageBanner()函数内 3 处判断条件)
代码实现
// wp-content/themes/fictional-university-theme/functions.php
// 修改:title 判断,! $args['title'] → !isset($args['title'])
if (!isset($args['title'])) {
$args['title'] = get_the_title();
}
// 修改:subtitle 判断
if (!isset($args['subtitle'])) {
$args['subtitle'] = get_field('page_banner_subtitle');
}
// 修改:photo 判断
if (!isset($args['photo'])) {
if (get_field('page_banner_background_image')) {
$args['photo'] = get_field('page_banner_background_image')['sizes']['pageBanner'];
} else {
$args['photo'] = get_theme_file_uri('/images/ocean.jpg');
}
}
要点:
- 只改了判断条件本身(
!$args['xxx']→!isset($args['xxx'])),函数体其余逻辑不变。 - transcript 原文强调:这是很常见的坑,尤其是接手别人项目、或者把老项目升级到新版 PHP 环境时,经常会撞到这种警告,知道怎么用
isset()处理是基本功。
Hook / Function 速查
| 名称 | 类型 | 用途 |
|---|---|---|
isset($var) | PHP 内建 function | 检查变量(或数组键)是否存在且不为 null,不会因为键不存在而报警告 |
常见坑
- 老版本 PHP 允许直接判断一个可能不存在的数组键(比如
!$args['title'])而不报错,但现代 PHP 会抛 "Undefined array key" Warning。 - 该用
isset()的地方直接写!$args['xxx'],就是这个警告的根源;改法就是把整个「获取键值」的动作换成「检查键是否存在」的动作。
延伸 / 后续讲座会用到
下一讲 EP048 会在 photo 判断的条件里再加两个防护条件(AND !is_archive() AND !is_home()),避免归档页被第一篇文章的图片污染 banner;EP049 会把 pageBanner() 套用到项目里剩下的所有模板文件。
Sources
Udemy:
- Become a WordPress Developer: Unlocking Power With Code — Section 10, EP047