Метод расширения php при его переопределении

Можно ли расширить родительский класс метод, заменив его? Например:

class Foo {

    public function edit() {
     $item = [1,2];
     return compact($item);
    }
}

class Bar extends Foo {
    public function edit() {
     // !!! Here, is there any way I could import $item from parent class Foo?
     $item2 = [3,4]; //Here, I added (extended the method with) some more variables
     return compact($item, $item2); // Here I override the return of the parent method.
    }
}

Проблема в том, что я не могу редактировать класс Foo каким-либо образом, поскольку это пакет поставщика.

Я не хочу редактировать методы поставщика, которые мне нужно расширить (добавить что-то еще к их функции return)

Почему вы используете compact()?

Nigel Ren 27.10.2018 17:36

Нет причин, просто например. Это что-то вроде return view('view-file', compact($item))

Victordb 27.10.2018 17:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
2
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вместо этого вы использовали array_merge(), он, вероятно, покажет результаты лучше ...

class Foo {

    public function edit() {
        $item = [1,2];
        return $item;
    }
}

class Bar extends Foo {
    public function edit() {
        $item = parent::edit();  // Call parent method and store returned value
        $item2 = [3,4]; //Here, I added (extended the method with) some more variables
        return array_merge($item, $item2); // Here I override the return of the parent method.
    }
}

$a = new Bar();
print_r($a->edit());

Это выведет -

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

Таким образом, вызов parent::edit() вернет массив из родительского класса, и он будет добавлен к массиву из функции второго класса.

Обновлять:

Я не могу это проверить, но, надеюсь, это даст вам то, что вам нужно ...

class Foo {
    protected function getData() {
        return [1,2];
    }
    public function edit() {
        return return view('view-file', compact($this->getData()));
    }
}

class Bar extends Foo {
    protected function getData() {
        $item = parent::edit();
        $item2 = [3,4];
        return array_merge($item, $item2);
    }

}

Это означает, что вы создаете представление только в базовом классе, все, что вы делаете, это добавляете дополнительную информацию в производный класс.

А если return не возвращает только 1 переменную? Или возвращается какое-то представление вместе с переменной, что-то вроде return view('view-file', compact($item)). Возможно ли, если метод больше, чем то, что я написал, просто импортировать в класс Bar весь код в методе редактирования Foo?

Victordb 27.10.2018 17:51

Вы можете возвращать массивы объектов / представлений и т. д. Главное, как вы поступаете с возвращаемым значением. Вы можете обнаружить, что проще разделить его на 2 метода, один из которых собирает данные, а другой возвращает представление. Это позволяет разделить функциональность и называть ее так, как вам нужно.

Nigel Ren 27.10.2018 17:53

Если parent::edit() возвращает результат от return view('view-file', compact($item)). Подскажите, пожалуйста, как мне вставить $item2 в return view('view-file', compact($item, $item2)). Не знаю, как разделить результат parent::edit().

Victordb 27.10.2018 18:22

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

Nigel Ren 27.10.2018 18:38

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