是否可以取消引用PHP中的引用? - php

我有一个数组用作堆栈来存储通过树的路径。每个元素都指向树中的一个节点,我想弹出最后一个元素,然后将该元素引用的对象设置为null。

基本上:

$node = array_pop($path);
*$node = null;

假设PHP和C-ish语言一样具有'*'运算符。现在,我有一个丑陋的解决方案,从父节点开始,记住我带了哪个孩子,然后将其设置为null,如下所示:

if($goLeft) {
    $parent->left = null;
} else {
    $parent->right = null;
}

我说这很丑,因为包含路径的数组是由我的树类中的公共函数创建的。我想公开在树的路径中直接在节点上工作的能力,而无需公开解决PHP中的特性(功能?)的实现细节。 ATM我需要在返回值中包含一个布尔值(在本例中为$ goLeft),以便可以解决无法取消引用引用的问题。

这是我第二次遇到此问题,因此,如果有人知道我可以做类似于第一段代码的方法,请分享!

(编辑)

在对&和数组的许多排列进行试验之后,事实证明,基本问题是我误解了得到错误的原因。

我试过了

$a = ($x > $y) ? &$foo[$bar] : $blah;

并得到“语法错误,意外的'&'”。我的解释是,问题出在$foo[$bar]上使用&运算符。实际上,罪魁祸首是“?”运算符,因为

if($x > $y) {
    $a = &$foo[$bar];
} else {
    $a = null;
}

工作完美。因此,我进行了一次大白鹅追逐,寻找不存在的问题的解决方法。只要不打破&的局限性,PHP就会做我想要的事情,即对变量所引用的对象(而不是变量本身)进行操作。例

$a1 = new SomeClass;
$a2 = &$a1;
$a3 = &$a2;
$a4 = &$a3;

$a4 = 42;    // This actually sets $a1 to 42
var_dump($a1); // Emits 42

让我感到困惑的是,我仍然认为对象是通过引用传递的(这是错误的),因此我认为如果表达式解析为对象,则&并不是必需的。我的意思是:

class A {
    public $b;
}

class B {}

$a = new A;
$a->b = new B; 

$c1 = $a->b; 
$c2 = &$a->b;

$c1 = 42; // Merely assigns 42 to $c1
$c2 = 42; // Assigns 42 to $a->b

事实证明,此确切问题已在http://www.php.net/manual/en/language.oop5.references.php处解决。希望在我第一次阅读时沉没!

参考方案

非常有趣的问题!我可能找到了一种解决方法:如果使用对象引用使用&运算符填充数组,则可以通过将该数组值设置为NULL销毁原始对象。您必须直接在数组上进行操作,而不是使用array_pop返回的变量。之后,您可以弹出数组以释放该位置(然后将包含一个NULL值)。

这就是我的意思(基于Rocket的代码):

$a=(object)'a';
$b=array(&$a);
$b[0] = NULL;
// array still contains an element
array_pop($b);
// now array is empty
var_dump($a); // NULL

http://codepad.org/3D7Lphde

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

更改默认的URL PHP - php

如何更改默认网址。例如www.example.com/index.php-> www.example.com现在,我要将其设置为www.example.com/test.php。我应该在php.ini中进行更改吗? 参考方案 假设您正在使用apache,则可以通过DirectoryIndex指令执行此操作。Check out the docs。

PHP:将字符串拆分为字母和数字部分的最佳方法 - php

我有几个格式的字符串AA11 AAAAAA1111111 AA1111111 分离字符串的字母和数字部分的最佳方法(最有效)? 参考方案 如果它们都是一系列字母,然后是一系列数字,并且没有非字母数字字符,那么sscanf()可能比regexp更有效$example = 'AAA11111'; list($alpha,$numeric) =…