Как использовать указатель в функции PHP? [дубликат]


На этот вопрос уже есть ответ здесь:

В C мы можем использовать указатель для параметра функции:

test( *text);
function test( *txt){
 //codes goes here
}

Возможно ли это в PHP?

Author: whatyouhide, 2015-05-16

2 answers

Имена переменных в PHP начинаются с $, поэтому $entryId - это имя переменной. $this - это специальная переменная в объектно-ориентированном программировании на PHP, которая является ссылкой на текущий объект.

-> используется для доступа к элементу объекта (например, свойствам или методам) в PHP, как синтаксис в C++.

Итак, ваш код означает следующее: поместите значение переменной $entryId в поле (или свойство) entryId этого объекта.

Оператор & в PHP означает ссылку на передачу. Здесь вот пример:

$b=2;
$a=$b;
$a=3;
print $a;
print $b;
// output is 32

$b=2;
$a=&$b; // note the & operator
$a=3;
print $a;
print $b;
// output is 33

В приведенном выше коде, поскольку мы использовали оператор &, ссылка на то, куда указывает $b, хранится в $a. Таким образом, $a на самом деле является ссылкой на $b.

На этой странице есть хорошее объяснение указателей

 2
Author: Maraboc, 2017-05-23 12:08:23

Есть ссылки, но это не то же самое, что указатели.

Php.net имеет несколько страниц, объясняющих , Что такое Ссылки, Какие ссылки Делают и Какие ссылки Не являются.
Там также несколько раз упоминается, что

Ссылки не являются указателями.

Они предоставляют способ назначить $a $b, чтобы при переназначении $b, $a также изменения:

$a = 'a';
$b = &$a; // Reference
$b = 'b'; // Now $a == 'b'

Это может быть также используется для аргументов функции:

function myFunc(&$b)
{
    $b = 'b';
}
$a = 'a';
myFunc($a); // Now $a == 'b'

До PHP 5.3.0 также можно было сделать так называемую "передачу времени вызова по ссылке", где у вас было бы "обычное" объявление функции и вместо этого используйте оператор & в вызове:

function myFunc($b)
{
    $b = 'b';
}
$a = 'a';
myFunc(&$a); // As of PHP 5.3.0 produces a Fatal Error, saying:
             // Call-time pass-by-reference has been removed; If you would like to pass argument by reference, modify the declaration of myFunc().

Но будьте осторожны! Назначение другой ссылки не приведет к обновлению исходной ссылки:

$a = 'a';
$b = 'b';
$c = &$a;
$c = &$b; // $a == 'a'

[ Демо-версия ]

Ловушка, возникающая в результате этого, существует с ключевым словом global.

$a = 'a';
$b = 'b';

function myFunc()
{
    global $a, $b;
    $a = &$b;
    var_dump($a);
}

myFunc();       // 'b'
var_dump($a);   // 'a'

Это потому, что global $a фактически означает $a = &$GLOBALS['a'], поэтому присвоение ему новой ссылки не приведет к обновлению $GLOBALS.
Конечно, вы можете предотвратить это, используя $GLOBALS напрямую.
Но если вы вообще используете глобальные, вам, вероятно, все равно следует пересмотреть свой дизайн.

Со ссылками теперь также существует разница между установкой переменной = NULL и использованием unset().
= NULL следует ссылкам, unset() не делает:

$a = 'a';
$b = &$a;
unset($b); // $a == 'a'

$a = 'a';
$b = &$a;
$b = NULL; // $a == NULL

[ Демонстрация ]


Итог:

Ссылки допускают вещи, которые были бы невозможны без них, но иногда ведут себя не так, как можно было бы ожидать, из-за того, как был построен PHP.

 1
Author: Siguza, 2015-05-16 11:21:03