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

ここに私の理解がありますが、私は完全に間違っていると思います-変数アクションにはパラメーターのない配列が与えられ、関数が作成され、アクションがグローバルになり、グローバルスコープが与えられます。それから、どういうわけかparemをチェックするという、ちょっと理解できない条件があります。$actions[ $hook ]このビットが意味することは、私を混乱させます。配列を呼び出していますか?空の配列が変数に設定されるのはなぜですか?

私のためにこれを片付けてくれてありがとう

4

3 に答える 3

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;  

したがって、最終的には、配列値を持つ $hook のインデックスを持つグローバル $actions 変数があり、その配列値には $function の値で追加されたインデックスがあります。

于 2013-07-24T18:13:15.893 に答える
1

global $actionsは変数をグローバルにしません。関数の外部で作成されたという理由だけで、変数はすでにグローバルでした。この宣言により、関数は変数にアクセスできます。通常、関数は関数内で作成された変数にのみアクセスできます。

$actionsは 2 次元配列です。最初の次元は連想配列で、オフフック名をキーにしています。2 番目の次元は、そのフックに関連付けられている関数の線形配列です。これを使用すると、フックがトリガーされたときに、関連するすべての関数が実行されます。

if (!isset($action[$hook]))key を持つエントリが$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);
于 2013-07-24T18:09:14.943 に答える
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 に答える