PHP에서 인터페이스를 정의하고 해당 인터페이스의 인스턴스를 만드는 팩토리 클래스를 정의하면 클라이언트 코드가 기본 클래스가 아닌 인터페이스 만 사용하도록 할 수있는 방법이 있습니까? 내 이해에서 클라이언트는 실제로 기본 클래스의 모든 공용 함수/필드를 사용할 수 있습니다.PHP의 인터페이스 목적은 무엇입니까?
<?php
interface IMyInterface
{
public function doSomething();
}
?>
<?php
class ConcreteImplOfMyInterface implements IMyInterface
{
const NotPartOfInterface = 'youcantseeme';
public function doSomething()
{
}
}
?>
<?php
class MyInterfaceFactory
{
public static function createMyInterface()
{
return new ConcreteImplOfMyInterface();
}
}
?>
<?php
function client()
{
$myInterface = MyInterfaceFactory::createMyInterface();
return $myInterface::NotPartOfInterface;
}
?>
좋은 물건을 위해 +1 – alex
나는 OOP 접근 수정자를 알고 있고 PHP는 힌트를 가지고 있다는 것을 알고있다. 함수 리턴 타입에 타입 힌팅이 없다는 사실은 인터페이스가 저에게 무의미한 것처럼 보일 수 있습니다. 같은 논리적 구성 요소의 클래스가 서로 공용 메서드를 호출 할 수있게하려면 해당 구성 요소와 통신하는 유일한 방법 인 공용 인터페이스를 공개하기 위해 해당 구성 요소 전체를 원했습니다. PHP에서는 불가능 해 보입니다. – jameswelle
흥미로운 점은 현재 클래스의 인스턴스에 대한 보호 된 개인 메소드/변수에 도달 할 수 있다는 것입니다. 예를 들어 User 클래스가 private 토큰 $ token을 가지고 있다면 User 클래스 안에 다음과 같은 메소드를 가질 수 있습니다 : public function changeToken (User $ user) {$ user-> token = '1234'; } – Joe