Расширить интерфейс с помощью общей логики

1

Предположим,

interface Foo {

}

class FooClass implements Foo {

}

Есть ли способ добавить логику к интерфейсу вне FooClass чтобы я мог это сделать:

$foo = new FooClass();
$foo->Bar();

где Bar - метод, применимый ко всем Foo? То, что я прошу, похоже на методы расширения в С#, но в моем случае я хочу расширить только интерфейсы.

Я знаю, что могу добавить пользовательский статическую функцию Bar, которая принимает Foo в качестве параметра, но я хочу знать, если есть что - нибудь в PHP, который дает мне $foo->Bar() сахар.

Редактировать: Я думаю, что я был недостаточно ясен. У меня есть пара подобных интерфейсов (и многие классы, реализующие их) из внешней библиотеки. Изменение их для абстрактных классов для меня не является вариантом.

  • 2
    Вы уверены, что не должны использовать абстрактный класс для этого?
  • 0
    К сожалению, я думаю, что самое близкое, что вы можете сделать, это определить функцию и ее параметры в interface Foo (то есть public function Bar(); ). Реализация указанной функции будет тогда требоваться любыми классами, реализующими ее, но все будет зависеть от того, как она ее реализовала.
Показать ещё 7 комментариев
Теги:
interface
extension-methods
syntactic-sugar

1 ответ

2
Лучший ответ

Я думаю, что самое близкое, что вы можете получить с PHP, - это так называемые черты.

<?php
interface Foo {

}

trait myTraits {
        function bar() { echo "BarMethod"; }
}

class FooClass implements Foo {
        use myTraits;
}

$foo = new FooClass();
$foo->Bar();
?>

Это выведет "BarMethod".

  • 0
    Это достойный вариант. Хотя мне придется добавить «использовать myTraits»; во всех классах, я думаю, что все в порядке. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню