실제로 PHP 인터페이스에는 목적이 있습니다.
다른 개발자를 위한 계약서이자 사용 설명서입니다. 그러나 인터페이스가 어떤 용도로 사용되는지 이해하는 것은 여전히 어렵습니다.
Basic
Interface는 직접 인스턴스화할 수는 없지만 구현할 수 있는 추상 클래스입니다.
이것은 기본적인 예입니다
interface MyInterface { public function setName(string $name); public function getName(); } class MyClass implements MyInterface { private $name; public function setName(string $name) { $this->name = $name; } public function getName() { return $this->name; } }
MyClass
는 setName()
및 getName()
메서드를 구현해야 합니다. 이렇게 하지 않으면 치명적인 오류가 발생합니다. MyClass
必须实现 setName()
和 getName()
方法。如果你不照做,你就会遇到致命错误。
Fatal error: Class MyClass contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (MyInterface::setName, MyInterface::getName)
此外,接口中定义的方法的访问性必须为公开的,并且接口中不能定义类成员。
原因
开发者使用接口来描述一个或者一组类的共同行为。
但是为什么只负责封装实现而不负责处理每个类的详细信息呢?
为了解耦!
接口允许你在不更改详细信息的情况下更改实现,也就是你使用此实现的方式。
更多高级示例
任何缓存系统都需要以下功能
基于此,我们可以创建如下的缓存接口
interface CacheInterface { public function set(string $key, $val); public function get(string $key); public function delete(string $key); }
以这种方式,就可以让开发者知道需要实现缓存接口,具体怎么实现,我们不需要知道。结果就是我们可以在不修改使用方式的情况下方便地切换缓存系统
因此,在不改变缓存系统在项目中的使用方式的情况下更改缓存系统是很容易的。
Symfony 示例
我们来看刚才例子的具体应用。对于 Symfony 而言,如果你想要实现任何缓存系统,最佳实践就是按照下面的方式来做
use Symfony\Contracts\Cache\CacheInterface; class MyClass { private $cache; public function __construct(CacheInterface $cache) { $this->cache = $cache; } }
通过依赖注入,将缓存接口注入到我们的类中。下次我们修改缓存系统时,MyClass 类不需要做任何的改变。
多实现 VS 多继承
PHP 不支持多继承,下面这种方式是不可能的
class MyClass extends ClassX, ClassY {}
之所以不允许这样做部分原因是由于 Diamond 问题.
不过,你可以这么做
class ClassY extends ClassX {} class MyClass extends ClassY {}
但是 ClassX
和 ClassY
치명적인 오류: MyClass 클래스에는 2개의 추상 메서드가 포함되어 있으므로 abstract로 선언하거나 나머지 메서드(MyInterface::setName, MyInterface::getName)를 구현해야 합니다.또한, 인터페이스는 공개여야 하며 인터페이스에서 클래스 멤버를 정의할 수 없습니다. 이유
개발자는 인터페이스를 사용하여 클래스 또는 클래스 그룹의 일반적인 동작을 설명합니다.
근데 왜 구현의 캡슐화만 담당하고 각 클래스의 세부 사항을 처리하는 책임은 없나요? 디커플링을 위해! 인터페이스를 사용하면 세부 사항, 즉 이 구현을 사용하는 방법을 변경하지 않고도 구현을 변경할 수 있습니다. 고급 예시 🎜🎜🎜🎜 모든 캐싱 시스템에는 다음 기능이 필요합니다.🎜class MyClass implements InterfaceX, InterfaceY {}🎜이렇게 하면 개발자는 캐시 인터페이스를 구현해야 한다는 것을 알 수 있습니다. 그것을 구현하면 우리는 알 필요가 없습니다. 그 결과, 캐시 시스템이 사용되는 방식을 변경하지 않고도 쉽게 캐시 시스템을 전환할 수 있습니다. 🎜🎜 따라서 프로젝트에서 캐시 시스템이 사용되는 방식을 변경하지 않고도 캐시 시스템을 쉽게 변경할 수 있습니다. 🎜🎜🎜🎜Symfony 예제🎜🎜🎜🎜이제 예제의 구체적인 적용을 살펴보겠습니다. Symfony의 경우 캐싱 시스템을 구현하려는 경우 가장 좋은 방법은 다음과 같이 수행하는 것입니다🎜rrreee🎜종속성 주입을 통해 캐시 인터페이스를 클래스에 주입합니다. 다음에 캐시 시스템을 수정하면 MyClass 클래스를 변경할 필요가 없습니다. 🎜🎜🎜🎜다중 구현 VS 다중 상속🎜🎜🎜🎜PHP는 다중 상속을 지원하지 않습니다. 다음 방법은 불가능합니다.🎜rrreee🎜이것이 허용되지 않는 이유 중 일부는 다이아몬드 문제 때문입니다.🎜🎜그러나 가능합니다. 이렇게 하면 🎜rrreee🎜 하지만
ClassX
와 ClassY
는 서로 다른 작업을 처리할 수 있으므로 상속을 사용하는 것은 의미가 없습니다. 🎜🎜여러 동작을 수행하려는 경우 여러 인터페이스를 가질 수 있습니다🎜rrreee🎜즉, 상위 클래스를 공유하는 대신 일부 클래스가 기능의 일부를 공유하도록 할 수 있습니다. 🎜🎜🎜🎜요약🎜🎜🎜🎜PHP 인터페이스는 클래스의 메소드 템플릿으로, 분리된 구현 및 사용에 매우 유용합니다. 🎜🎜이 기능은 유연성을 유지하고 모든 개발자가 일련의 규칙을 따르고 있는지 확인해야 할 때 특히 유용합니다. 🎜🎜【관련 튜토리얼 추천: "🎜PHP Tutorial🎜"】🎜위 내용은 PHP의 인터페이스 사용에 대해 이야기해 보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!