我不是那个新的php,但我想弄清楚这段代码到底是怎么读的。
$actions = array();
function add_action( $hook, $function )
{
global $actions;
// create an array of function handlers if it doesn't already exist
if( !isset( $actions[ $hook ] ) )
$actions[ $hook ] = array();
// append the current function to the list of function handlers
$actions[ $hook ][] = $function;
}
这是我的理解,但我相信我完全错了 - 变量动作被赋予一个没有参数的数组,然后创建一个函数,并将动作转换为全局范围,赋予它全局范围。然后有一个条件我不明白,以某种方式检查parem。 $actions[ $hook ]
这一点意味着让我感到困惑。它是否正在调用数组?为什么空白数组设置为变量?
感谢您为我清除
答案 0 :(得分:1)
global $actions
不会使变量成为全局变量,因为它是在任何函数之外创建的,所以它已经是全局变量。该声明允许函数访问变量;通常,函数只能访问函数中创建的变量。
$actions
是一个二维数组。第一个维度是关联数组,键控摘机名称。第二个维度是与该钩子相关联的线性函数数组。可能的用途是当触发钩子时,将运行所有相关的功能。
if (!isset($action[$hook]))
检查$actions
数组中是否已存在密钥为$hook
的条目。如果没有,则创建一个包含空数组的新条目。
$actions[$hook][] = $function
将一个元素添加到该钩子的动作数组中。
要了解其工作原理,建议您运行一个反复调用add_action()
的简单脚本,并偶尔调用print_r($actions)
:
print_r($actions);
add_action('hook1', 'func1');
print_r($actions);
add_action('hook2', 'func2');
print_r($actions);
add_action('hook1', 'func3');
add_action('hook3', 'func4');
add_action('hook2', 'func5');
print_r($actions);
答案 1 :(得分:1)
首先,我们在全局范围内声明一个php变量$ actions:
$actions = array();
然后在函数中,使用global关键字声明您正在使用已定义的全局值,而不是在函数范围内创建新值:
global $actions;
接下来,它使用isset()函数来检查值$ hook是否作为全局$ actions的索引存在。如果索引不存在,它将创建该索引并为其指定一个空数组作为值。
// create an array of function handlers if it doesn't already exist
if( !isset( $actions[ $hook ] ) )
$actions[ $hook ] = array();
最后,它正在使用刚刚给出的数组上的括号运算符向它附加一个新值,在这种情况下它给它赋值$ function。
// append the current function to the list of function handlers
$actions[ $hook ][] = $function;
所以最后,你有一个全局$ actions变量,索引为$ hook,它有一个数组值,该数组值有一个索引,值为$ function。
答案 2 :(得分:0)
Blow-By-Blow Walkthrough
您发布的代码会创建一个名为$actions
的空数组。在函数内部,它然后使用global
语句来授予它对该数组的访问权,因为它是在函数外部声明的。这是必要的,因为否则函数会在每次运行时重置数组,如果它在其中声明的话。
条件(if
)检查变量$hook
是否是数组的键,如果不是,则创建一个数组元素,其名称为$hook
的值并将其初始化为空数组。
然后将变量$function
的值添加为已存在或刚刚创建的数组元素。
<强>分析强>
此代码旨在创建一个函数列表,这些函数在代码中的特定“钩子”点处调用,在这些点上调用这些函数,这是一个示例实现:
add_action('start', 'foo');
add_action('start', 'bar');
add_action('end', 'baz');
然后在代码执行的各个点,有指定的点,它检查要运行的操作,例如在代码的最开头:
foreach($actions['start'] as $function) {
$function();
}
以上内容会调用foo()
和bar()
。然后在代码的最后,你可以重复这个过程来调用那里的任何钩子(baz)。
foreach($actions['end'] as $function) {
$function();
}
上述内容会调用baz()
。