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