В чем разница между ссылкой, указателем и идентификатором? - PullRequest
0 голосов
/ 06 июля 2018

Я читал руководство по PHP ссылка для концепции ООП и наткнулся на несколько примеров, которые я не смог понять.

a) Может кто-нибудь объяснить, передаются ли объекты по значению или по ссылке?

б) Что такое ссылка, указатель и идентификатор и в чем разница между ними?

Пример 1:

class A {
    public $foo = 1;
}  

class B {
    public function foo(A $bar)
    {
        $bar->foo = 42;
    }

    public function bar(A $bar)
    {
        $bar = new A;
    }
}

$f = new A;
$g = new B;
echo $f->foo . "n";

$g->foo($f);
echo $f->foo . "n";

$g->bar($f);
echo $f->foo . "n";

Ожидаемый результат:

1
42
1

Возвращаемый результат:

1
42
42

Пример 2:

class A
{
    public $v = 1;
}

function change($obj)
{
    $obj->v = 2;
}

function makezero($obj)
{
    $obj = 0;
}

$a = new A();

change($a);    
print_r($a); 
//Expected: A Object ( [v] => 2 ) 
//Returned: A Object ( [v] => 2 )  

makezero($a);    
print_r($a);
//Expected: 0 
//Returned: A Object ( [v] => 2 ) 

Ссылка 1

Ссылка 2

1 Ответ

0 голосов
/ 06 июля 2018

В соответствии с php docs :

По умолчанию аргументы функции передаются по значению (поэтому, если значение аргумента в функции изменяется, оно делаетне меняются за пределами функции).Чтобы функция могла изменять свои аргументы, они должны передаваться по ссылке.

Чтобы аргумент функции всегда передавался по ссылке, добавьте амперсанд (&) к имени аргумента в определении функции.

В B::foo вы изменяете не переменную, а свойство объекта переменной.Вот почему вы получаете 42

В B::bar вы изменяете переменную напрямую.Он изменен на новый экземпляр A.Внутри B::bar значение $bar->foo === 1.

Указатели: Указатели создаются всякий раз, когда объект создается и присваивается переменной.Эта переменная хранит адрес памяти для доступа к объекту.

Ссылки: Ссылки создаются с амперсандом (&).

//from your link posted
$a = new Foo; // $a is a pointer pointing to Foo object 0
$b = $a; // $b is a pointer pointing to Foo object 0, however, $b is a copy of $a
$c = &$a; // $c and $a are now references of a pointer pointing to Foo object 0
...