Как использовать указатель в функции PHP? [дубликат]
На этот вопрос уже есть ответ здесь:
- Есть ли указатели в php? 9 ответов
В C мы можем использовать указатель для параметра функции:
test( *text);
function test( *txt){
//codes goes here
}
Возможно ли это в PHP?
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
.
На этой странице есть хорошее объяснение указателей
Есть ссылки, но это не то же самое, что указатели.
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.