Создать класс коллекции PHP, расширяющий массив

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

Есть ли готовый класс, который я должен расширять, вместо того, чтобы начинать с нуля? Я ожидаю, что есть spl, который я должен использовать, но я новичок в этой части PHP и не уверен, с чего начать. Недавно я наткнулся на class.arrayobject, но, похоже, он не расширен.

class Collection
{
    protected $stack=[];
    private $originalStack;

    public function __construct(array $nodes=[]) { //$nodes is an array of Node objects
        $this->stack=$nodes;
        $this->originalStack=array_merge(array(), $nodes);    //Arrays not passed by reference but the objects are!
    }

    public function getChanges(){
        $this->stack;
    }

    public function getPositionChanges($prop){
        return array_udiff_assoc($this->stack, $this->originalStack,
            function ($stack, $originalStack) {
                return is_numeric($stack->$prop) && is_numeric($originalStack->$prop)
                ?$stack->$prop - $originalStack->$prop
                :strcmp($stack->$prop, $originalStack->$prop);
            }
        );
    }

    public function getAll(){
        $this->stack;
    }

    public function getByPosition(int $position){
        $this->stack[$position];
    }

    public function getPropertyByPosition(int $position, $property){
        return $this->stack[$position]->$property;  //Uses __get
    }

    public function add(Node $elem){
        $this->stack[]=$elem;
    }

    public function delete(int $position){
        if (!isset($this->stack[$position])) throw new CollectionException('Index does not exist');
        unset($this->stack[$position]);
        $this->stack=$stack[]=array_values($this->stack);
    }

    public function move(int $initialPosition, int $finalPosition){
        if (!isset($this->stack[$initialPosition]) || !isset($this->stack[$finalPosition])) throw new CollectionException('Index does not exist');
        $node=$this->stack[$initialPosition];
        unset($this->stack[$initialPosition]);
        array_splice($this->stack, $finalPosition, 0, $node);
        $this->stack=array_values($this->stack);
        //?? return $this->stack;
    }

    public function update(int $position, $property, $value){
        if (!isset($this->stack[$position])) throw new CollectionException('Index does not exist');
        $this->stack[$position]->$property=$value;  //Uses __set
    }
}

Если я правильно понял вопрос, вы, вероятно, захотите вместо этого взглянуть на интерфейс ArrayAccess: php.net/manual/en/class.arrayaccess.php

Phil Cross 30.05.2018 11:39

@PhilCross А, я думаю, ты прав. Эти интерфейсы - для меня новая территория. Захватывающе, но немного устрашающе. Спасибо, что указали мне правильное направление. Знаете какие-нибудь хорошие учебники, объясняющие «общую картину»? Руководство отлично подходит для подробностей, но мне иногда трудно вывести из него концепцию. Спасибо

user1032531 30.05.2018 11:46

Лично я использую смесь видео и смотрю исходники других проектов. Laracasts.com предлагает отличные видео по PHP и Laravel (PHP-фреймворк), они очень хорошо объясняют некоторые основные концепции, шаблоны и т. д. Они также предлагают кучу бесплатных видео. Это того стоит. Что касается исходного кода, я много использую Laravel и люблю погружаться в исходный код. Это может быть довольно сложно, но если вы будете продолжать, вы начнете лучше понимать шаблоны и варианты дизайна.

Phil Cross 30.05.2018 11:49

@Eakethet Знаете ли вы, расширяет ли arrayaccess эти интерфейсы?

user1032531 31.05.2018 14:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
243
0

Другие вопросы по теме