在PHP中使用指针是否可行?

4
我知道引用和指针不同:http://php.net/manual/en/language.references.arent.php 问题是,PHP是否支持指针?
根据以下示例,我猜在处理对象时我们使用的就是指针:
class Entity
{
  public $attr;
}

class Filter
{
  public function filter(Entity $entity)
  {
    $entity->attr = trim($entity->attr);
  }
}

$entity = new Entity;
$entity->attr = '  foo  ';
$filter = new Filter;
$filter->filter($entity);
echo $entity->attr; // > 'foo', no white space

上述示例中使用了指针,还是像使用引用时那样交换内存?

编辑

另一个示例:

以下代码是否会进行内存交换:

class Entity
{
  public $attr;
}
$entity = new Entity;
$entity->attr = 1;
$entity->attr = 2;

C中类似这样的:

int* attr;
*attr = 1;
*attr = 2;

当您使用对象时,所有变量都指向同一个对象,并且类似于在C或C ++等语言中使用指针。 - Barmar
在函数参数中,@mario 中的 Entity $entity 不会是一个新对象,而是被称为参数的同一个旧对象。 - zzlalani
在函数参数中定义类型会使它们变得严格,但不会创建新对象。如果我有错误,请纠正我。 - zzlalani
@zzlalani 噢,好的。所以OP是在问隐式对象引用。 - mario
更新了问题并提供了一个新的例子。 - superhero
2个回答

3
当您将一个对象作为参数传递给函数时,变量本身被复制,但它所具有的属性指向原始对象的属性,例如:
function test(Something $bar)
{
    $bar->y = 'a'; // will update $foo->y
    $bar = 123; // will not update $foo
}

$foo = new Something;
$foo->y = 'b';
test($foo);
// $foo->y == 'a';

在该函数内,内存引用看起来有些像这样:

$bar ---+
        +---> (object [ y => string('b') ])
$foo ---+

$bar = 123;之后,它看起来像这样:

$bar ---> int(123)

$foo ---> (object [ y => 'b' ])

@ErikLandvall 这就告诉我们内存是如何工作的...... 在函数内部,$bar->y 基本上是 $foo->y 的指针,只不过没有可见的解引用 :) - Ja͢ck
好的,我发现用 PHP 解释时有点难以理解。你能否将相同的代码改写成 C 的形式呢?那会大有裨益。 - superhero
我之所以问这个问题,是因为 PHP 背后的魔力使得真正发生的事情难以理解。 - superhero
@ErikLandvall 好的,我已经添加了一个内存近似的ASCII图。 - Ja͢ck
@ErikLandvall 你为什么关心内存地址?PHP应该将其抽象化,让你可以专注于编程...你懂的 :) - Ja͢ck
显示剩余6条评论

1

如果您在这一行中提问

$entity->attr = trim($entity->attr);

$entity 是新内存或旧内存的引用。它是旧内存(或指针)的引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接