PHP 인터페이스가 실제로 클래스의 동작을 변경하는 방법
P粉289775043
2023-09-02 23:49:28
<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>
인터페이스가 "클래스의 동작을 변경한다"고 말하는 것이 아니라, 인터페이스가 클래스 기능을 확장 쉽게 만든다는 뜻입니다.
객체 지향 프로그래밍 개념인 인터페이스를 이해하려면 먼저 인터페이스가 해결하려는 문제가 무엇인지 이해해야 합니다.
“인터페이스”는 어떤 문제를 해결하려고 하나요?
인터페이스는 계약입니다. PHP에서 duck-typing을 구현하는 방법은 다음과 같습니다. 기능을 다른 사람에게 공개하려는 라이브러리 작성자의 관점에서 생각해야 합니다. 예를 들어
으아악도서관 이용자들이
으아악$person
需要有getName()
方法,您可以创建一个类Person
> 有一个getName()
방법을 인지할 수 있도록 합니다. 그런 다음 유형 선언을 사용하여 코드가 해결될 때 잠재적인 오류를 감지하세요.음식으로 사물에게 먹이를 주는 또 다른 라이브러리가 있다고 가정해 보겠습니다.
으아악이것을 고려해보세요...
이제 사용자가 식사와 인사를 동시에 할 수 있는 함수를 작성하고 싶다고 가정해 보겠습니다.
Pet
类。用户不想仅仅为了Pet
이 함수들을 다시 작성해 보세요.Pet
以便同时使用Greeter
和Feeder
라이브러리 작성 방법은 무엇인가요?아마도 그럴까요?
으아악안타깝게도 PHP는 다중 상속을 지원하지 않습니다. 하나의 클래스에는 하나의 클래스만 있을 수 있습니다. 위의 코드는 유효하지 않습니다. 따라서 현재 상황에서 사용자는 라이브러리 중 하나만 사용할 수 있습니다.
또한 "이름"은 사물에 따라 매우 다른 개념이 될 수 있습니다(예:扩展
방법을 사용할 수도 있습니다.
그래서 도서관 작가로서 귀하는 자신의 도서관이 사용자를 위해 최대한 유연해지기를 원합니다. 당신은 무엇을 할 수 있나요?getName() 返回
$first_name
和$last_name
代码>)。您的库类中可能没有合理的默认实现getName()
도서관
Greeter
으아악도서관
특정 클래스(또는 상위 클래스 상속)가 필요하지 않으며 클래스는 여러 인터페이스를 구현할 수 있습니다. 따라서 다음Feeder
으아악클래스는 PHP에서 완전히 유효합니다.
이제 이Pet
으아악클래스의 개체를
라이브러리와 함께 사용할 수 있습니다.Pet
类的对象可以与Greeter
库和Feeder
라이브러리 및ArrayAccess
ArrayAccess
인터페이스는 타사 인터페이스 라이브러리 작성자가 선언하지 않고 핵심 PHP 작성자가 작성합니다. 핵심 PHP 작성자는 이에 대한 더 깊은 지원을 제공합니다. 🎜앞서 언급한 인터페이스와 마찬가지로 PHP는 이를 구현하는 클래스에 기능을 제공합니다. 그러나 위의
Greeter
或Feeder
예제를 제공하는 대신 핵심 PHP는 ArrayAccess를 구현하는 클래스에 대해 구문적 설탕을 제공합니다. 즉, AccessAccess 인터페이스를 구현하는 클래스를 처리할 때 더 간단한 코드를 사용할 수 있습니다.공식 예에서는
으아악구현한 경우 다음으로 바꾸세요.
으아악배열과 같은 구문에
으아악$obj
를 사용하면 코드를 더 짧게 만들 수 있습니다.