0

我对 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;  
}  

这是我的理解,但我相信我完全错了 - 变量动作被赋予一个没有参数的数组,然后创建一个函数并将动作变成一个全局的全局范围。然后有一个条件,我不明白以某种方式检查一个参数。$actions[ $hook ]这一点的含义让我感到困惑。它是在调用数组吗?为什么将空白数组设置为变量?

感谢您为我解决这个问题

4

3 回答 3

1

global $actions不会使变量成为全局变量,它已经是全局变量,因为它是在任何函数之外创建的。该声明允许函数访问变量;通常,函数只能访问在函数内创建的变量。

$actions是一个二维数组。第一个维度是关联数组,以脱钩名称为键。第二维是与该钩子关联的函数的线性数组。可能的用途是,当触发钩子时,将运行所有关联的函数。

if (!isset($action[$hook]))$actions检查数组中是否已经有一个带有 key 的条目$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);
于 2013-07-24T18:09:14.943 回答
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。

于 2013-07-24T18:13:15.893 回答
0

逐吹演练

您发布的代码创建了一个名为$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()and bar()。然后在代码结束时,您可以重复该过程以调用那里的任何钩子(baz)。

foreach($actions['end'] as $function) {
    $function();
}

上面会调用baz().

于 2013-07-24T18:12:10.307 回答