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

这意味着该函数将修改参数(通过引用)而不是处理它的副本。删除函数体内的所有与号,只有参数中的一个是必需的。

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

这是关于参考的正确 PHP 手册条目:http: //php.net/manual/en/language.references.php

在大多数情况下,您不需要使用 & 号传递引用,&因为 PHP 将始终首先传递引用,并且只会在第一次写访问时创建变量的副本。

于 2012-10-19T08:54:16.927 回答
1

它将变量作为参考传递。如果没有&符号,则以下代码将不起作用:

$var = "content";

function test(&$v)
{

    $v = "this is new content";

}

test($var);

注意:这是未经测试的代码,但理论足够接近。它允许在不同的范围内修改变量,所以不是传递变量的值,在这个例子中 - “内容”,你传递一个对变量本身的引用,所以你直接编辑你传入的变量.

于 2012-10-19T08:55:40.117 回答
0

s because this function doesn不会返回任何东西,只是修改,等等。

于 2012-10-19T08:54:10.577 回答