Неустранимая ошибка: вызов функции-члена create () для необъекта в <file> - PullRequest
0 голосов
/ 17 августа 2010

Для проекта php я использую класс Collection для обработки своих объектов и отложенной загрузки в Java-подобные коллекции.

Теперь у моего объекта есть коллекция адресов электронной почты, например. Поэтому я вызываю функцию getEmailAddresses () объекта, который вызывает маппер для возврата коллекции адресов электронной почты.

Это работает нормально, но когда я делаю цикл foreach над своей коллекцией, он возвращает действительные данные со следующей ошибкой в ​​конце:

Fatal error: Call to a member function create() on a non-object in /foo/bar/Collection.php on line 89

Направляет на следующую функцию:

public function current()
    {
        if ($this->_collection instanceof Iterator)
            $key = $this->_collection->key();
        else
            $key = key($this->_collection);
        if ($key === null)
            return false;
        $item = $this->_collection[$key];
        if (!is_object($item)) {
            $item = $this->_gateway->create($item);
            $this->_collection[$key] = $item;
        }
        return $item;
    }

Эта строка:

$item = $this->_gateway->create($item);

_gateway - это адаптер, используемый коллекцией. Которым я не пользуюсь и держу его нулевым. Может быть, это как-то связано с этим?

У кого-нибудь есть подсказка? Поскольку все работает так, как должно, я могу прочитать данные коллекции. Это просто ошибка.

Ответы [ 3 ]

0 голосов
/ 17 августа 2010

Заменить

if (!is_object($item))

на

if (!is_object($item) && !is_null($this->_gateway))

Это, конечно, только гарантирует, что код не будет вызван, если шлюз не установлен, поэтому он ничего не делаетв $ item (что может быть не тем, что вы хотите).

0 голосов
/ 17 августа 2010

Уже получил!

Похоже, что если в запрошенной коллекции нет объектов, он просто пытается что-то сделать.

Если я сначала посчитаю элементы и сравниваю их с> 0он не возвращает никаких ошибок.Это будет проблемой, поэтому я обновлю класс, чтобы сначала проверить его.

Я не единственный, кто работает с ним, это не ошибка, которую вы ожидаете.

0 голосов
/ 17 августа 2010

Это только означает, что $this->_gateway не является объектом, и это должно быть. Это не может быть нулем.

Вы можете изменить эту строку:

$item = $this->_gateway->create($item);

до

if(is_object($this->_gateway)) {
  $item = $this->_gateway->create($item);
}

это исправит эту ошибку, но может привести к дальнейшим ошибкам в зависимости от того, что именно должно быть $item.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...