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

为什么这个PHP对象会将项目附加到自身上?,php,oop,object,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;

我是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);

}
但由于某种原因,对象会随着每次迭代而不断增长。。。。我不知道为什么。。我试图销毁对象(未设置),但不确定是否应该执行其他操作

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

MyClass::MyFunc()

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

静态意味着,在全局范围内保持这种状态,它不是每次调用new时都实例化的,而是
静态的

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

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);
}
不需要(也不应该)创建
MyClass
的实例来调用静态
MyFunc

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

正确的方法是

类添加一些{
私人$x=1;
private$arr=array('a','b');
public$new_arr=array();
公共函数iterate(){
foreach($this->arr as$v){
$this->new_arr[]=$v;
}
}
}
对于($i=0;$i<3;$i++){
$add_some=新建add_some();
$add_some->iterate();
打印($add\u some->new\u arr);
}

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

静态意味着,在全局范围内保持这种状态,它不是每次调用new时都实例化的,而是
静态的

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

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);
}
不需要(也不应该)创建
MyClass
的实例来调用静态
MyFunc

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

正确的方法是

类添加一些{
私人$x=1;
private$arr=array('a','b');
public$new_arr=array();
公共函数iterate(){
foreach($this->arr as$v){
$this->new_arr[]=$v;
}
}
}
对于($i=0;$i<3;$i++){
$add_some=新建add_some();
$add_some->iterate();
打印($add\u some->new\u arr);
}

+1为了在一定程度上抵消反对票,这个问题还不算太糟,也不值得这样做。这个问题描述得很清楚,对于一个刚接触OOP的人来说,被这个问题弄糊涂也不是没有道理的。谢谢,我有点困惑,我在OOP上做了两门课程,尽管它们是初学者课程,但没有提到即使在对象被破坏后仍在内存中维护静态属性。这个问题可能会对其他新手有所帮助。+1为了在一定程度上抵消反对票,这个问题不是那么糟糕,不值得他们回答。这个问题描述得很清楚,对于一个刚接触OOP的人来说,被这个问题弄糊涂也不是没有道理的。谢谢,我有点困惑,我在OOP上做了两门课程,尽管它们是初学者课程,但没有提到即使在对象被破坏后仍在内存中维护静态属性。这个问题可能会对其他新手有所帮助。php开发人员将::称为Paamayim Nekudotayim是常见的吗?如果是这种情况,那真的很奇怪。php开发团队没有费心通过4个主要版本来修复它,这太疯狂了。还有什么需要修复的呢?Paamayim Nekudotayim在希伯来语中的意思是双冒号。。。关于它有一个完整的讨论,尽管我们拥有很多Zend开发者,但我认为一个普遍使用的英语术语会更合适。顺便说一句,一个非常粗糙的方法是通过执行$add_some::$new_arr=null来取消静态属性的设置;在每节课结束时iteration@Geoffrey作为一个以希伯来语为母语的人,我知道这意味着什么。我真的不知道如何回应你的想法,在PHP语言中引用希伯来语是正常的,也许还可以添加一些中文、希腊文和亚拉姆语。它在希伯来语中甚至听起来都不好,它的意思是“两个冒号”而不是“两个冒号”。php开发人员将::称为Paamayim Nekudotayim是常见的吗?如果是这种情况,那真的很奇怪。php开发团队没有费心通过4个主要版本来修复它,这太疯狂了。还有什么需要修复的呢?Paamayim Nekudotayim在希伯来语中的意思是双冒号。。。关于它有一个完整的讨论,尽管我们拥有很多Zend开发者,但我认为一个普遍使用的英语术语会更合适。顺便说一句,一个非常粗糙的方法是通过执行$add_some::$new_arr=null来取消静态属性的设置;在每节课结束时iteration@Geoffrey作为一个以希伯来语为母语的人,我知道这意味着什么。我真的不知道如何回应你的想法,在PHP语言中引用希伯来语是正常的,也许还可以添加一些中文、希腊文和亚拉姆语。它在希伯来语中甚至听起来都不好,它的意思是“两个冒号”而不是“两个冒号”。
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);
}