PHP OOP:育儿对象/功能?

时间:2010-05-28 15:37:59

标签: php arrays oop

如何根据以下示例正确完成PHP中的父级功能? 在每次addArray调用时,我可以确保我的数组没有被覆盖并且数组中的先前值会丢失吗?

function arraybase() {
    $this->array = new ArrayObject();

    return $this;
}

function addArray($value) {
     parent::$this->arraybase();

    $this->array->append($value);
    return $this;

}


$this->addArray('1')->addArray('2')->addArray('3'); 

// outputs:
Array
(
    [0] => 3
)

3 个答案:

答案 0 :(得分:2)

function addArray中,您将继续使用以下行重新创建数组:

parent::$this->arraybase();

删除此行并在想要创建时调用arraybase。

答案 1 :(得分:1)

嗯,首先,您不需要parent::$this->arraybase()。只做$this->arraybase()。事实上,我甚至不确定你的方式是否是有效的语法。但我离题了。

至于您的具体问题,您可以:

  1. 添加构造函数(并从->arraybase()移除addArray()调用):

    public function __construct() {
        $this->array = new ArrayObject();
    }
    
  2. ->arraybase()

    的电话周围添加if检查
    public function addArray($value) {
        if (!isset($this->array) || !is_object($this->array)) {
            $this->arraybase();
        }
        ...
    }
    
  3. 就个人而言,我会做#1。它将更可靠,更快速,并且更符合OOP范例。

    编辑:添加构造函数

    所以,如果你的基类有这个构造函数:

    public function __construct($some, $vars) {
        ......
    }
    

    您可以在扩展课程中执行此操作:

    public function __construct($some, $vars) {
        parent::__construct($some, $vars);
        $this->array = new ArrayObject();
    }
    

    注意:除非其中一位父母有__construct方法,否则不要致电parent::__construct() ...

答案 2 :(得分:0)

为什么要在ArrayObject周围设置包装器?如果它是为了增加链接方法调用的可能性,那么你最好扩展ArrayObject:

<?php
class MyArrayObject extends ArrayObject {

    public function append($value)
    {
        parent::append($value);
        return $this;
    }
}

$ao = new MyArrayObject();
$ao->append('a')->append('b')->append('c');
var_dump($ao->getArrayCopy());
/*
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}
*/