【问题标题】:How to alter a compound data type by modifying a returned private data member?如何通过修改返回的私有数据成员来更改复合数据类型?
【发布时间】:2015-11-19 01:50:16
【问题描述】:

正如this page 所提到的,PHP 有八种原始数据类型,即标量(布尔、整数、浮点、字符串)、复合(数组和对象)和特殊(null 和资源)。

我想问一下,由于数组是复合数据类型,因此它们应该通过引用返回,这与返回时复制的标量不同。所以我应该能够更改返回的私有数据成员(在 C++ 中这是有效的)。那么为什么内部数组数据类型没有改变(根据代码中的注释)?

注意:我知道以这种方式更改私有数据成员是不好的编码,但我想知道为什么它不起作用。

Here is a link to the code on ideone.com.

<?php

class Foo {

  private $values;

  public function __construct() {

    $this->values = array();

  }

  public function addElement($key, $value) {

    $this->values[$key] = $value;

  }

  public function getValues() {

    return $this->values;

  }

}

$foo = new Foo();
$foo->addElement("hello", "John Doe");
//WHY DOESN'T THE FOLLOWING LINE ALTER $foo->values ?
$foo->getValues()["goodbye"] = "Jane Doe";

var_dump($foo);

【问题讨论】:

    标签: php arrays return-value private


    【解决方案1】:

    1 .返回本地变量? $values 不存在。

    public function getValues() {
        return $values;
    }
    
    1. 返回全局变量

      公共函数 getValues() {

      return $this->values;
      

      }

    【讨论】:

      【解决方案2】:

      根据this page,数组不是通过引用返回,而是在返回时复制(我很想知道对象在返回时是否被复制:如果是的话,我会感到惊讶)。无论如何,要通过引用返回数组,请在方法名称前使用&amp;

      public function &getValues() {
      
        return $this->values;
      
      }
      

      输出:

      object(Foo)#1 (1) {
        ["values":"Foo":private]=>
        array(2) {
          ["hello"]=>
          string(8) "John Doe"
          ["goodbye"]=>
          string(8) "Jane Doe"
      

      这是ideone.com上的代码。

      【讨论】:

        猜你喜欢
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-05
        • 2016-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多