web-dev-qa-db-ja.com

Global $ current_screenとget_current_screen()を使うことの違いは何ですか?

私は get_current_screen(); を見てきました。私が使用できるグローバル $current_screen; もあるのを見ました。

これが2つの例です。

// Using function
function wpse_post_notice() {

    $screen = get_current_screen();

    // Only run in post/page creation and edit screens
    if ( $screen->post_type === 'post' ) {
        return 'This is a post';
    }

}

// Using gloabl
function wpse_post_notice() {

    global $current_screen;

    // Only run in post/page creation and edit screens
    if ( $current_screen->post_type === 'post' ) {
        return 'This is a post';
    }

}

1つの方法が他の方法よりも優れていると考えられますか?もしそうならなぜですか?

5
grappler

あなたの例では、現在違いはありません。ある場合は、同じオブジェクトを取得します。それを試してみてください:

global $current_screen;
$current_screen->foo = 1;

$screen = get_current_screen();
$screen->foo = 2;

echo '$current_screen->foo: ' . $current_screen->foo; // 2!

簡単な理由:オブジェクトはPHPではコピーとして渡されません。

しかし:グローバル変数は本当に悪いです、なぜなら誰でもいつでも変更できるからです。遠い、遠い、WordPressはこのグローバル変数を非推奨にするかもしれません。オブジェクトを取得するために関数ラッパーを使用しているのであれば、問題ないはずです。そうでなければ、あなたのコードは通知を出すかもしれません。

そして、あなたが本当にオブジェクトを手に入れたかどうか常にチェックしてください。 $current_screen->post_typeが存在しない可能性があります。

4
fuxia

get_current_screen関数は実際にはグローバル$ current_screen変数を使用しますが、違いは、関数get_current_screenがグローバル変数$ current_screenが設定されているかどうかを確認してからnullを返すか、または$ current_screen。

私はこれを考慮して、私はあなたがこの余分なissetチェックを含めるようにget_current_screen関数を使うことを勧めます。

WordPressのソースコード (wp-admin/includes/screen.php)の174行目で見てください。

0
Mestika