具有已知参数的数组

时间:2013-07-24 17:57:54

标签: php arrays

我不是那个新的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 ]这一点意味着让我感到困惑。它是否正在调用数组?为什么空白数组设置为变量?

感谢您为我清除

3 个答案:

答案 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()