为什么这个PHP对象会将项目附加到自身?

时间:2017-08-02 04:16:33

标签: php oop object

我是OOP的新手,似乎被困在我确定非常简单的事情上,但我不明白发生了什么。

以下示例代码:

class add_some {

    static $arr = array('a', 'b');

    static $new_arr = array();

    public static function iterate() {

        foreach (self::$arr as $v) {
            self::$new_arr[] = $v;
        }

    }

}

for ($i=0; $i < 3; $i++) {

    // instantiate the object
    $add_some = new add_some;

    // launch the method that copies items from $arr to $new_arr
    $add_some::iterate();

    echo '<pre>';
    print_r($add_some::$new_arr);
    echo "</pre>";

    unset($add_some);

}

循环并将 $ arr 中的项目添加到 $ new_arr ,它基本上将所有项目从$ arr复制到$ new_arr

代码实例化一个新对象并执行方法iterate(),该方法将$ arr中的项目复制到$ new_arr 3次。

每次迭代都会创建一个新对象$ add_some = new add_some;所以每次迭代应该只生成

Array
(
    [0] => a
    [1] => b
Array
(
    [0] => a
    [1] => b
)
Array
(
    [0] => a
    [1] => b
)

但由于某种原因,对象在每次迭代时都在不断增长......我不知道为什么 ..我试图破坏对象(未设置)并且不确定我是否应该做某事其他

Array
(
    [0] => a
    [1] => b
)
Array
(
    [0] => a
    [1] => b
    [2] => a
    [3] => b
)
Array
(
    [0] => a
    [1] => b
    [2] => a
    [3] => b
    [4] => a
    [5] => b
)

1 个答案:

答案 0 :(得分:4)

您正在使用::(Paamayim Nekudotayim)调用静态方法,您应该使用->而不使用静态函数。

静态意味着,保持全局,每次调用new时都不会实例化,它是static

例如,您可以调用静态方法:

class MyClass {
  static function MyFunc() { echo 'Stuff'; }
}

MyClass::MyFunc()

没有必要(也不应该)创建MyClass的实例来调用静态MyFunc

每次调用iterate时,它都会附加全局静态数组$arr

正确的方法是

class add_some {
  private $x = 1;
  private $arr = array('a', 'b');
  public  $new_arr = array();

  public function iterate() {
    foreach ($this->arr as $v) {
        $this->new_arr[] = $v;
    }
  }
}

for ($i=0; $i < 3; $i++) {
  $add_some = new add_some();
  $add_some->iterate();
  print_r($add_some->new_arr);
}