Массив объектов в PHP

Я создал класс, который хранит некоторую информацию в своих атрибутах. Он содержит метод add(), который добавляет новый набор информации ко всем присутствующим в этом классе атрибутам.

Я бы хотел, чтобы его объекты вели себя как смещения массива. Например, вызов:

$obj = new Class[0];

создаст объект, содержащий первый набор информации.

Я также хотел бы использовать цикл foreach() в этом классе.

Изменения атрибутов должны быть запрещены снаружи класса, но я должен иметь к ним доступ.

Это возможно?


person khernik    schedule 23.11.2012    source источник
comment
Вот ваш ответ. stackoverflow.com/questions/8612190/массив php-объектов   -  person danijar    schedule 23.11.2012
comment
Что ж, это мы должны приветствовать вас : PP   -  person moonwave99    schedule 23.11.2012
comment
Это был не дубликат. Связанный дубликат ничего не говорит о неизменности.   -  person goat    schedule 24.11.2012
comment
ОЧЕНЬ плохо сформулированный вопрос, но уж точно не дубликат 8612190.   -  person vladr    schedule 24.11.2012


Ответы (4)


Что вам нужно, это ArrayObject он полностью реализует IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable

Пример

echo "<pre>";
$obj = new Foo(["A","B","C"]);
foreach ( $obj as $data ) {
    echo $data, PHP_EOL;
}

echo reset($obj) . end($obj), PHP_EOL; // Use array functions on object
echo count($obj), PHP_EOL; // get total element

echo $obj[1] ; // you can get element
$obj[0] = "D"; //  Notice: Sorry array can not be modified 

Выход

A
B
C
AC
3
B

Используемый класс

class Foo extends ArrayObject {
    public function offsetSet($offset, $value) {
        trigger_error("Sorry array can not be modified");
    }
}
person Baba    schedule 23.11.2012

Вот как вы можете создать несколько экземпляров с разными значениями конструктора.

$objConfig = array( 
    array('id'=>1 , 'name'=>'waqar') , 
    array('id'=>2 , 'name'=>'alex')
);
$objects = array();

for($i=0; $i<count($objConfig) ; $i++)
{
    $objects[$i] = new ClassName($objConfig[$i]);
}
person Waqar Alamgir    schedule 23.11.2012

Вам нужно реализовать интерфейс ArrayAccess, примеры довольно просты.

В любом случае, я настоятельно не рекомендую вам смешивать классы и поведение массивов из-за плохого дизайна: доступ к массивам следует использовать только для того, чтобы сделать синтаксис более кратким.

Воспользуйтесь всеми преимуществами классов, магических методов, рефлексии: за пределами ассоциативных массивов существует яркий и счастливый мир.

person moonwave99    schedule 23.11.2012

В таком случае, почему у вас просто нет массива экземпляров вашего класса? Очень простой пример:

/**
 * @var MyClass[]
 */
$myClasses = array();

$myClasses[] = new myClass();

Или же используйте один из более специализированных классов SPL, здесь: http://php.net/manual/en/book.spl.php, например SplObjectStorage (мне это не нужно, но, похоже, это то, что вам нужно)

Наконец, вы можете свернуть свой собственный, просто создав класс, который расширяет ArrayAccess и применяет ваш тип класса?

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

person Paul S    schedule 23.11.2012