찾다

 >  Q&A  >  본문

PHP 인터페이스가 실제로 클래스의 동작을 변경하는 방법

<p>PHP 문서에 따르면 </p> <인용문> <p>객체 인터페이스를 사용하면 해당 메소드가 구현되는 방법을 정의하지 않고도 클래스가 구현해야 하는 메소드를 지정하는 코드를 작성할 수 있습니다. </p> </인용문> <p>따라서 인터페이스는 <code>-></code> 표기법</p>을 사용하여 액세스해야 하는 미리 정의된 메서드가 있는 클래스와 같습니다. <p>그러나 ArrayAccess 인터페이스는 객체에 대한 액세스를 배열로 제공합니다. 객체는 <code>$object->property</code> 및 <code>$object["property"]</code></p> <p>ArrayAccess를 사용하여 개체 구문을 변경하는 방법을 이해할 수 없습니다. <code>ArrayAccess</code> 메소드<em>단 하나</em>의 효과를 복제하려고 코드를 작성했는데 오류</p>가 발생했습니다. <pre class="brush:php;toolbar:false;">// PHP ArrayAccess 인터페이스 사용 네임스페이스 A { myclass 클래스는 ArrayAccess를 구현합니다. 공개 함수 offsetExists($offset) { true 반환 } 공개 함수 offsetGet($offset) { // 변경된 동작 $this->{$offset} 반환 ?? } 공개 함수 offsetSet($offset, $value) {} 공개 함수 offsetUnset($offset) {} } $myclass = 새로운 myclass(); $myclass->access = '인터페이스'; echo $myclass['access'] // "인터페이스" }; //나만의 ArrayAccess 인터페이스를 구현하려고 합니다. 네임스페이스 B { 인터페이스 MyArrayAccess { 공개 함수 offsetGet($offset); } myclass 클래스는 MyArrayAccess를 구현합니다. 공개 함수 offsetGet($offset) { // 동작 변경 $this->{$offset} 반환 ?? } } $myclass = 새로운 myclass(); $myclass->access = '인터페이스'; echo $myclass['access']; // 치명적인 오류: 잡히지 않음 오류: Bmyclass 유형의 객체를 배열로 사용할 수 없습니다. } </pre> <p>정확하게 설명할 수 있도록 도와주세요. 감사합니다</p>
P粉289775043P粉289775043458일 전610

모든 응답(1)나는 대답할 것이다

  • P粉702946921

    P粉7029469212023-09-03 20:17:24

    인터페이스가 "클래스의 동작을 변경한다"고 말하는 것이 아니라, 인터페이스가 클래스 기능을 확장 쉽게 만든다는 뜻입니다.

    객체 지향 프로그래밍 개념인 인터페이스를 이해하려면 먼저 인터페이스가 해결하려는 문제가 무엇인지 이해해야 합니다.

    “인터페이스”는 어떤 문제를 해결하려고 하나요?

    인터페이스는 계약입니다. PHP에서 duck-typing을 구현하는 방법은 다음과 같습니다. 기능을 다른 사람에게 공개하려는 라이브러리 작성자의 관점에서 생각해야 합니다. 예를 들어

    으아악

    도서관 이용자들이 $person 需要有 getName() 方法,您可以创建一个类 Person > 有一个 getName()방법을 인지할 수 있도록 합니다. 그런 다음 유형 선언을 사용하여 코드가 해결될 때 잠재적인 오류를 감지하세요.

    으아악

    음식으로 사물에게 먹이를 주는 또 다른 라이브러리가 있다고 가정해 보겠습니다.

    으아악

    이것을 고려해보세요...

    이제 사용자가 식사와 인사를 동시에 할 수 있는 함수를 작성하고 싶다고 가정해 보겠습니다. Pet 类。用户不想仅仅为了 Pet 이 함수들을 다시 작성해 보세요.

    Pet 以便同时使用 GreeterFeeder 라이브러리 작성 방법은 무엇인가요?

    아마도 그럴까요?

    으아악

    안타깝게도 PHP는 다중 상속을 지원하지 않습니다. 하나의 클래스에는 하나의 클래스만 있을 수 있습니다. 위의 코드는 유효하지 않습니다. 따라서 현재 상황에서 사용자는 라이브러리 중 하나만 사용할 수 있습니다. 扩展

    또한 "이름"은 사물에 따라 매우 다른 개념이 될 수 있습니다(예:

    방법을 사용할 수도 있습니다. getName() 返回 $first_name$last_name )。您的库类中可能没有合理的默认实现 getName()

    그래서 도서관 작가로서 귀하는 자신의 도서관이 사용자를 위해 최대한 유연해지기를 원합니다. 당신은 무엇을 할 수 있나요?

    PHP의 "인터페이스"를 사용하여 이 문제를 해결하는 방법은 무엇입니까?

    인터페이스는 메소드 서명의 선언입니다. 이는 구체적인 클래스/상속 요구 사항 없이 라이브러리 요구 사항을 선언하는 빠른 방법입니다.

    인터페이스를 사용하면 두 라이브러리를 다음과 같이 다시 작성할 수 있습니다.

    도서관Greeter 으아악

    도서관Feeder 으아악

    특정 클래스(또는 상위 클래스 상속)가 필요하지 않으며 클래스는 여러 인터페이스를 구현할 수 있습니다. 따라서 다음

    클래스는 PHP에서 완전히 유효합니다. Pet 으아악

    이제 이

    클래스의 개체를 Pet 类的对象可以与 Greeter 库和 Feeder 라이브러리 및

    라이브러리와 함께 사용할 수 있습니다.

    ArrayAccess

    인터페이스는 어떻습니까?

    ArrayAccess

    인터페이스는 타사 인터페이스 라이브러리 작성자가 선언하지 않고 핵심 PHP 작성자가 작성합니다. 핵심 PHP 작성자는 이에 대한 더 깊은 지원을 제공합니다. 🎜

    앞서 언급한 인터페이스와 마찬가지로 PHP는 이를 구현하는 클래스에 기능을 제공합니다. 그러나 위의 GreeterFeeder 예제를 제공하는 대신 핵심 PHP는 ArrayAccess를 구현하는 클래스에 대해 구문적 설탕을 제공합니다. 즉, AccessAccess 인터페이스를 구현하는 클래스를 처리할 때 더 간단한 코드를 사용할 수 있습니다.

    공식 예에서는

    으아악

    구현한 경우 다음으로 바꾸세요.

    으아악

    배열과 같은 구문에 $obj를 사용하면 코드를 더 짧게 만들 수 있습니다.

    으아악

    회신하다
    0
  • 취소회신하다