【问题标题】:PHP OOP: Parenting objects/functions?PHP OOP:育儿对象/功能?
【发布时间】:2010-05-28 15:37:59
【问题描述】:

根据以下示例,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
)

【问题讨论】:

  • 数组 ([0] => 1, [1] => 2, [3] => 3);

标签: php arrays oop


【解决方案1】:

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

parent::$this->arraybase();

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

【讨论】:

    【解决方案2】:

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

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

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

      public function __construct() {
          $this->array = new ArrayObject();
      }
      
    2. 围绕对->arraybase()的调用添加一个if检查:

      public function addArray($value) {
          if (!isset($this->array) || !is_object($this->array)) {
              $this->arraybase();
          }
          ...
      }
      

    就个人而言,我会做#1。它将更可靠、更快,并且更符合 OOP 范式。

    编辑:添加构造函数信息

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

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

    你会在你的扩展类中这样做:

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

    注意:不要调用parent::__construct(),除非其中一个父母有 __construct 方法...

    【讨论】:

    • 我不能在不影响同一个类中的所有其他函数(方法?)的情况下制作 __construct,对吧?
    • 当然可以。如果您需要调用父构造函数,只需从构造函数中调用parent::__construct()。您需要确保提供正确的参数,但这就是 OOP 的重点。能够“扩展”功能。不只是使用它...
    • 嗨,我完全不明白你的意思。你介意用一个例子更新你的帖子吗?非常感谢!
    【解决方案3】:

    为什么要为 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"
    }
    */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      • 2016-02-14
      • 2015-09-06
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多