>백엔드 개발 >PHP 튜토리얼 >PHP 인터페이스 사용에 대한 일부 요약

PHP 인터페이스 사용에 대한 일부 요약

伊谢尔伦
伊谢尔伦원래의
2017-07-03 10:40:551627검색

PHP의 인터페이스는 처음부터 끝까지 논란이 많았습니다. 인터페이스가 매우 좋다고 말하는 사람도 있고, 인터페이스가 쓸모없다는 사람도 있습니다. 우선 맛이 좋다, 나쁘다를 판단하는 기준이 무엇인지부터 알아야 합니다. 의심할 여지 없이 이는 Java/C++와 비교됩니다. 위의 예와 논의에서 PHP의 인터페이스는 "계약 지향 프로그래밍"에서는 충분하지 않으며 적절한 역할을 수행하지 않습니다.

사실 Machine 클래스의 선언은 일반 클래스 앞에 와야 합니다. 인터페이스는 시스템에서 제공하는 일련의 사양을 제공하고, 머신 클래스는 인터페이스에 대한 API 세트를 제공하고 이를 구현하며, 마지막으로 사용자 정의 클래스를 제공합니다. Java에서 인터페이스(멀티 스레드 실행 가능 인터페이스, 컨테이너 컬렉션 인터페이스 등)가 인기 있는 이유는 시스템이 우리를 위해 작업의 처음 두 부분을 수행하고 프로그래머는 이를 보장하기 위해 특정 구현 클래스만 작성하면 되기 때문입니다. 인터페이스를 사용하고 제어할 수 있습니다.

인터페이스를 사용하는 이유는 무엇인가요? 인터페이스의 이점은 무엇입니까? 인터페이스 자체는 구현을 제공하지 않고 사양만 제공합니다. 클래스가 인터페이스를 구현한다는 것을 안다면 인터페이스에서 호출할 수 있는 메서드만 알면 됩니다.

PHP에서는 인터페이스의 의미가 제한되어 있고 인터페이스를 사용할 수 있는 곳이 많지 않습니다. PHP의 인터페이스는 디자인 문서로 축소되어 팀의 기본 계약 역할을 수행할 수 있습니다.

<?php
interface Cache
{
/**
 * describe:缓存管理,项目经理定义接口,技术人员负责实现
 */
    const maxKey = 10000;                  //最大换存量
    public function getCache($key);        //获取缓存
    public function setCache($key,$value); //设置缓存
    public function flush();               //清空缓存
}


PHP는 약한 유형이고 유연성을 강조하므로 대규모로 인터페이스를 사용하는 것은 권장되지 않으며 일부 "커널" 코드에서만 인터페이스를 사용하는 것이 좋습니다. 인터페이스가 있어야합니다. 의미론적 관점에서 보면 추상 클래스를 더 많이 사용할 수 있습니다. 추상 클래스와 인터페이스의 비교에 대해서는 자세히 설명하지 않겠습니다.

또한, PHP5는 객체 지향의 특수 기능을 많이 향상시켰으며, 그 중 SPL(라벨이 붙은 PHP 라이브러리)이 일부 인터페이스를 구현하려는 시도가 있는데, 그 중 가장 중요한 것은 반복기 인터페이스입니다. 이 인터페이스를 구현하면 개체를 foreach 구조에서 사용할 수 있으므로 사용 형식이 상대적으로 통일됩니다. 예를 들어 SPL에는 DirectoryIterator 클래스가 있습니다. 이 클래스는 SplFileInfo 클래스를 통합하고 Iterator, Traversable 및 SeekableIterator의 세 가지 인터페이스를 구현합니다. 그런 다음 이 클래스의 인스턴스는 상위 클래스 SplFileInfo의 모든 기능을 얻을 수 있습니다. 또한 Iterator를 구현합니다. 인터페이스 에 의해 표시됩니다.

Iterator 인터페이스의 프로토타입은 다음과 같습니다.

* current()
    This methodreturns the current index&#39;s value. You are solely responsible for tracking what thecurrent index is as the interface does not do this for you.

*key()
    This method returns the value of the current index&#39;s key. For foreach loops this is extremely important so that the key value can be populated.
    
*next()
    This method moves the internal index forward one entry.
    
*rewind()
    This method should reset the internal index to the first element.

*valid()
    This method should return true or false if there is a current element. It is called after rewind() or next().

클래스가 Iterator를 구현하도록 선언하는 경우 이 다섯 가지 메서드를 구현해야 합니다. 이 다섯 가지 메서드가 구현되면 이 클래스의 인스턴스를 쉽게 반복할 수 있습니다. 여기서 DirectoryIterator 클래스를 사용할 수 있는 이유는 시스템이 이미 Iterator 인터페이스를 구현했기 때문이므로 다음과 같이 사용할 수 있습니다.

<?php
$dir = new DirectoryIterator(dirname(FILE));

foreach ($dir as $fileInfo)
{
    if(!$fileInfo->isDir())
    {
        echo $fileInfo->getFilename(),"\t",$fileInfo->getSize(),PHP_EOL;
    }
}

DirectoryIterator 클래스를 사용하지 않고 직접 구현하면, 코드의 양이 늘어날 뿐만 아니라, 반복할 때의 스타일도 균일하지 않습니다. 작성한 클래스가 Iterator 인터페이스도 구현하는 경우 Iterator처럼 작동할 수 있습니다.

클래스의 객체가 Iterator를 구현하는 한 왜 foreach 객체로 사용될 수 있나요? 사실 그 이유는 매우 간단합니다. PHP 인스턴스 객체에서 foreach 구문을 사용할 때 인스턴스가 Iterator 인터페이스를 구현하는지 확인하면 foreach 문은 내장 메서드를 통해 또는 다음의 메서드를 사용하여 시뮬레이션됩니다. 구현 클래스는 이전과 동일합니까? 언급된 toString 메소드의 구현이 유사합니까? 실제로 toString 메소드는 인터페이스의 위장된 구현입니다. 인터페이스는 이렇습니다. 인터페이스 자체는 아무것도 하지 않습니다. 시스템은 내부적으로 인터페이스의 동작을 조용히 구현하므로 이 인터페이스를 구현하는 한 인터페이스에서 제공하는 메서드를 사용할 수 있습니다. 이것이 바로 인터페이스의 "플러그 앤 플레이" 아이디어입니다

우리 모두는 인터페이스가 다중 통합의 위장된 구현이라는 것을 알고 있으며, 상속에 대해 이야기할 때 믹스인을 구현하는 데 사용되는 특성을 언급했습니다. 실제로 특성을 생각할 수 있습니다. 향상된 인터페이스로.

다음 코드를 보세요:

<?php

trait Hello
{
    public function sayHello()
    {
        echo &#39;Hello &#39;;
    }
}

trait World
{
    public function sayWorld()
    {
        echo &#39;Word&#39;;
    }
}

class MyHelloWorld
{
    use Hello, World;
    public function sayExclamationMark()
    {
        echo &#39;!&#39;;
    }
}

$o = new MyHelloWorld();

$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();

위 코드의 결과는 다음과 같습니다.

Hello Word!

MyHelloWorld는 두 가지 특성을 동시에 구현하므로 두 특성의 코드 세그먼트를 각각 호출할 수 있습니다. 코드에서 볼 수 있듯이 Traits는 인터페이스와 매우 유사합니다. 차이점은 Traits가 코드가 포함된 인터페이스를 가져올 수 있다는 것입니다. 어떤 의미에서 특성과 인터페이스는 "다중 통합"의 위장된 구현입니다.

인터페이스에 대한 여러 개념을 요약합니다.

  • 인터페이스는 사양과 계약으로 존재합니다. 사양으로서 인터페이스는 유용성을 보장해야 하며, 계약 인터페이스로서 제어성을 보장해야 합니다.

  • 인터페이스는 단지 명령문일 뿐이며, 인터페이스 키워드가 사용되면 구현되어야 합니다. 이는 프로그래머(외부 인터페이스) 또는 시스템(내부 인터페이스)에 의해 구현될 수 있습니다. 인터페이스 자체는 아무것도 하지 않지만 무엇을 할 수 있는지 알려줄 수 있습니다.

  • PHP의 인터페이스에는 두 가지 단점이 있습니다. 하나는 계약 제한이 없다는 것이고, 다른 하나는 내부 인터페이스가 충분하지 않다는 것입니다.

인터페이스는 실제로 매우 간단하지만 인터페이스의 다양한 애플리케이션은 매우 유연합니다. 디자인 패턴의 대부분도 인터페이스를 중심으로 이루어집니다.

위 내용은 PHP 인터페이스 사용에 대한 일부 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.