Можно ли расширить родительский класс метод, заменив его? Например:
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
)
Нет причин, просто например. Это что-то вроде return view('view-file', compact($item))
Если вместо этого вы использовали 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?
Вы можете возвращать массивы объектов / представлений и т. д. Главное, как вы поступаете с возвращаемым значением. Вы можете обнаружить, что проще разделить его на 2 метода, один из которых собирает данные, а другой возвращает представление. Это позволяет разделить функциональность и называть ее так, как вам нужно.
Если parent::edit()
возвращает результат от return view('view-file', compact($item))
. Подскажите, пожалуйста, как мне вставить $item2
в return view('view-file', compact($item, $item2))
. Не знаю, как разделить результат parent::edit()
.
Я добавил новый код, попробуйте и посмотрите, работает ли он так, как вам нужно.
Почему вы используете
compact()
?