PHP ООП: родительские объекты / функции? - PullRequest
1 голос
/ 28 мая 2010

Как правильно работают родительские функции в 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 ]

2 голосов
/ 28 мая 2010

В function addArray вы продолжаете воссоздавать массив со строкой:

parent::$this->arraybase();

Удалите эту строку и вызовите arraybase, если вы хотите ее создать.

1 голос
/ 28 мая 2010

Ну, во-первых, вам не нужно parent::$this->arraybase(). Просто сделай $this->arraybase(). На самом деле, я даже не уверен, что у вас есть правильный синтаксис. Но я отвлекся.

Что касается вашей конкретной проблемы, вы можете:

  1. Добавить конструктор (и удалить вызов ->arraybase() из addArray()):

    public function __construct() {
        $this->array = new ArrayObject();
    }
    
  2. Добавьте проверку if для звонка на ->arraybase():

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

Лично я бы сделал # 1. Это будет более надежным, быстрым и более соответствующим парадигмам ООП.

РЕДАКТИРОВАТЬ: Добавление информации о конструкторе

Итак, если ваш базовый класс имеет этот конструктор:

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

Вы бы сделали это в вашем расширенном классе:

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

ПРИМЕЧАНИЕ. Не звоните parent::__construct(), если только у одного из родителей нет метода __construct ...

0 голосов
/ 28 мая 2010

Почему вы хотите установить оболочку вокруг 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"
}
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...