Представьте, что ни один из объектов в массиве не имеет идентификатор, который вы ищете. Ваша функция просто вернет null
. Например, с пустым массивом.
Как вы можете видеть, возвращение null
не означает, что функция не работает. Он отлично работает и сделал то, что вы указали, просто, что такой объект не существует.
Это зависит от вас, чтобы решить, что делать, если это произойдет. Как вы не сказали, в вашем вопросе, существует не так много, чтобы добавить, но предложить вам несколько вариантов:
Вы можете проверить, если функция возвращает null
, а затем принять его как «не найден» дела.
$result = $collection->getObjectById($id);
if (null === $result) {
# object not found
} else {
# object found
}
Вы можете выбросить исключение внутри функции, если функция должна вызываться только для существующих объектов:
public function getObjectById($id) {
foreach ($this->_rootObject as $root) {
if ($id == $root->getId()) {
return $root;
}
}
throw new InvalidArgumentException(sprintf('Not a valid ID: %d', $id));
}
или, наконец:
предлагают дополнительную для проверки существующего идентификатора:
private function findById($id) {
foreach ($this->_rootObject as $object) {
if ($id == $object->getId()) {
return $object;
}
}
return null;
}
public function hasObjectById($id) {
return null !== $this->findById($id);
}
public function getObjectById($id) {
if (null !== $root = $this->findById($id)) {
return $root;
}
throw new InvalidArgumentException(sprintf('Not a valid ID: %d', $id));
}
Кроме того, вы можете быть заинтересованы, чтобы создать себе класс с именем, который инкапсулирует ваши потребности, так что вам не нужно осуществить, что в вашем «я управляю объектом коллекции корня» объект, который больше, чем косвенные. Тогда это в основном ваш собственный класс коллекции. Пример:
interface Identifiable {
public function getId();
}
/**
* Example Object Class
*/
class MyObject implements Identifiable {
private $id;
public function __construct($id) {
$this->id = (int) $id;
}
public function getId() {
return $this->id;
}
}
/**
* Example Collection
*/
class IdentifiableCollection implements Countable, IteratorAggregate
{
private $objects;
public function attach(Identifiable $object) {
$id = $object->getId();
$this->objects[$id] = $object;
}
public function count() {
return count($this->objects);
}
public function has($id) {
return isset($this->objects[$id]);
}
public function getById($id) {
if ($this->has($id)) {
return $this->objects[$id];
}
throw new InvalidArgumentException(sprintf("No object is identifiable for %d", $id));
}
public function getIterator() {
return new ArrayIterator($this->objects);
}
}
// create the collection
$collection = new IdentifiableCollection();
// fill the collection with some objects (ID 1 - 20)
foreach(range(1, 20) as $id) {
$collection->attach(new MyObject($id));
}
// test if an id exists and return object
$id = 2;
var_dump($collection->has($id), $collection->getById($id));
// iterate over the collection
foreach ($collection as $object) {
var_dump($object);
}
Этот класс коллекции предлагает только прикреплять объекты, а не удалять их, но при необходимости их можно расширить. Также можно расширить существующий класс, например, ArrayObject
или SplObjectStorage
, если вы хотите повторно использовать существующие функции.Пример приведен в другой ответ в несколько смежный вопрос:
если добавить эту строку после цикла Еогеасп Инициализатора, что является результатом? echo $ id. ':'. $ Корне-> GetId(); – Gavin
ничего не получается! – Nll
Из чего следует, что цикл не итерации? что означает, что ему нечего переплетать, требуемых интерфейсов не поддерживается. Если у вас нет пользовательской буферизации. Трудно узнать больше, не имея возможности увидеть, как формируется myClasse. Это приводит нас к ответу @JvdBerg. Вы пытались включить отчет об ошибках: error_reporting (E_ALL); ini_set ('display_errors', '1'); – Gavin