【问题标题】:How to use a pointer in a PHP function? [duplicate]如何在 PHP 函数中使用指针? [复制]
【发布时间】:2015-05-16 10:34:58
【问题描述】:

在 C 语言中,我们可以使用指针作为函数参数:

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

在 PHP 中可以吗?

【问题讨论】:

标签: php pointers


【解决方案1】:

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的引用。

这个page上的指针有很好的解释

【讨论】:

  • 我已经更新了我的答案^^。
【解决方案2】:

有引用,但与指针相同。

php.net 有多个页面解释What References AreWhat References DoWhat References Are Not
那里也被多次提及

引用不是指针。

它们提供了一种将$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'

[Demo]

由此产生的陷阱存在于 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

[Demo]


底线:

引用允许没有它们就不可能实现的事情,但有时由于 PHP 的构建方式,它们的行为方式与人们期望的不同。

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 2010-10-21
    • 2015-03-24
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多