4

私はwordpressのコアファイルを調べていて、このコードに出くわしました。変数名の前と=の後にアンパサンドがあることに気づきました。

私はこれを検索しようとしましたが、PHPマニュアルからこれに出くわしましたが、うまく説明されていないか、間違ったものを見ています!また、それが使用されているメソッドの外部で変数を変更するために使用されることもわかりましたが、それが変数の目的であり、変更されるので、これが正しい場合、どのように使用しますか?

function _make_cat_compat( &$category ) {

    if ( is_object( $category ) ) {
        $category->cat_ID = &$category->term_id;
        $category->category_count = &$category->count;
        $category->category_description = &$category->description;
        $category->cat_name = &$category->name;
        $category->category_nicename = &$category->slug;
        $category->category_parent = &$category->parent;
    } elseif ( is_array( $category ) && isset( $category['term_id'] ) ) {
        $category['cat_ID'] = &$category['term_id'];
        $category['category_count'] = &$category['count'];
        $category['category_description'] = &$category['description'];
        $category['cat_name'] = &$category['name'];
        $category['category_nicename'] = &$category['slug'];
        $category['category_parent'] = &$category['parent'];
    }
}
4

5 に答える 5

9

これは、関数が引数のコピーを処理する代わりに、引数を(参照により)変更することを意味します。関数の本体内のすべてのアンパサンドを削除します。引数の1つだけが必要です。

function foo(&$foo) { $foo++; }
function bar($foo) { $foo++; }
$foo = 10;
foo($foo);
foo($foo);

// prints 12, function foo() has incremented var $foo twice
echo "$foo\n";

bar($foo);
// still 12, as bar() is working on a copy of $foo
echo "$foo\n";


// However, since PHP 5.0, all objects are passed by reference [(or to be more specific, by identifier)][1]
class Foo {
    public $bar = 10;
}
$obj = new Foo;
echo "$obj->bar\n"; // 10, as expected

function objectIncrement($obj) { $obj->bar++; }

function objectRefIncrement(&$obj) { $obj->bar++; }

objectIncrement($obj);
echo "$obj->bar\n"; // 11, as expected, since objects are ALWAYS passed by reference (actually by identifier)
objectRefIncrement($obj);
echo "$obj->bar\n"; // 12

関数/メソッドで渡された引数を変更する場合は、参照によって明示的に渡すことをお勧めします。他の利点とは別に、コードもより明確で理解しやすくなります。

ところで、あなたはこれを行うことができます:

function _make_cat_compat( &$category ) {
    if (is_array( $category)) {
        $category = (object)$category;
    }

    $category->cat_ID = $category->term_id;
    $category->category_count = $category->count;
    $category->category_description = $category->description;
    $category->cat_name = $category->name;
    $category->category_nicename = $category->slug;
    $category->category_parent = $category->parent;
}

私にはすっきりしているように見えますが、あなたの具体的なケースはわかりません。そして、配列またはオブジェクトをどのように使用するかはわかりません。これは、いくつかの悪い方法が使用されていることを意味します。

于 2012-10-19T08:53:02.370 に答える
7

メソッドパラメータについて話すときは、&$variableを参照しcall by referenceます。したがって、この変数に加えた変更は、メソッドが実行されても残ります。

function a($arg) // call by value ($arg is a copy of the original)
{
    $arg += 1;
}
function b(&$arg) // call by reference ($arg IS the original)
{
    $arg += 1;
}

$myArg = 1;

a($myArg);
echo $myArg;

echo "\r\n";

b($myArg);
echo $myArg;

// Displays:
// 1
// 2

これは、リファレンスに関するPHPマニュアルのセクションです。

&=基本的に同じ意味ですが、とにかく参照による呼び出しがすでにあるため、このコンテキストでは役に立ちません。安全に削除できます。

于 2012-10-19T08:55:37.260 に答える
1

変数を参照として渡します。アンパサンドがないと、次のコードは機能しません。

$var = "content";

function test(&$v)
{

    $v = "this is new content";

}

test($var);

注:これはテストされていないコードですが、理論は十分に近いものです。別のスコープ内から変数を変更できるため、変数の値を渡すのではなく、この例では「コンテンツ」、変数自体への参照を渡すので、渡した変数を直接編集します。 。

于 2012-10-19T08:55:40.117 に答える
1

参照に関する正しいPHPマニュアルエントリは次のとおりです。http://php.net/manual/en/language.references.php

ほとんどの場合&、PHPは常に最初に参照を渡し、最初の書き込みアクセスでのみ変数のコピーを作成するため、アンパサンドを使用して参照を渡す必要はありません。

于 2012-10-19T08:54:16.927 に答える
0

s because this function doesn何も返さず、変更するだけで、すべてが返されます。

于 2012-10-19T08:54:10.577 に答える