我对 PHP 和一般编程很陌生。我一直在使用 PHP 处理一些需要我创建类的事情,这很好,除了我似乎无法让我的类方法在作为类属性的数组上工作。我一定是做了一些根本性错误的事情,因为无论项目如何,它似乎都不起作用。
这是我刚刚写的一个示例(我认为发布一个简短的示例会比发布我的实际项目的代码更容易,因为我的实际项目的代码有点长且复杂)。
class Test {
public $testArray;
public $testInt;
public function __construct() {
$this->testArray = array();
for ($i=1; $i<=20; $i++) {
$this->testArray[] = array(1, 2);
}
$this->testInt = 4;
}
public function testf() {
$this->testInt += 1;
foreach ($this->testArray as $n) {
$n[] = 3;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在最后添加一些代码,以便打印出正在发生的事情:
$obj = new Test;
echo 'Before function call:';
echo '<br />testArray:<br />';
foreach ($obj->testArray as $n) {
print_r($n);
echo '<br />';
}
echo '<br />testInt: ';
echo $obj->testInt;
echo '<br />';
echo '<br />';
echo '<br />';
$obj->testf();
echo 'After function call:';
echo '<br />testArray:<br />';
foreach ($obj->testArray as $n) {
print_r($n);
echo '<br />';
}
echo '<br />testInt: ';
echo $obj->testInt;
echo '<br />';
Run Code Online (Sandbox Code Playgroud)
然后你最终看到的是,在函数调用之后,testInt变量发生了变化,但变量testArray没有变化。
如果其中任何内容不够清楚,请告诉我。这已经让我发疯有一段时间了。预先感谢您花时间查看我的问题。
当你这样做时:
foreach ($this->testArray as $n) {
$n[] = 3;
}
Run Code Online (Sandbox Code Playgroud)
您没有修改 testArray 的值。你正在制作它们的副本。每当您在 PHP 中将一个值分配给另一个变量时,您都会复制该值。(对象是一个例外,但这与这里无关。)
如果要修改原始版本,则需要通过其自己的变量名称来引用它,如下所示:
foreach ($this->testArray as $index => $value) {
$this->testArray[$index][] = 3;
}
Run Code Online (Sandbox Code Playgroud)
您需要在 foreach 循环中添加一些内容:
foreach ($this->testArray as &$n) {
$n[] = 3;
}
Run Code Online (Sandbox Code Playgroud)
应该可以做到这一点。&$n 表示引用数组元素而不是复制它。如果您想覆盖它,您可能还想将 $n[] 更改为 $n。