2016-08-01 1 views
1

Im Laravel 5.2를 사용하고 있으며 인수가 Foo, Bar 또는 Baz 중 하나의 인스턴스 여야하는 메소드를 만들고 싶습니다. 인수가 이러한 클래스의 객체가 아닌 경우 오류가 발생합니다.동적 인수

App\Models\Foo; 
App\Models\Bar; 
App\Models\Baz; 


public function someMethod(// what to type hint here??) 
{ 
    // if 1st argument passed to someMethod() is not an object of either class Foo, Bar, Baz then throw an error 
} 

어떻게하는가?

답변

3

입력 힌트 모두 클래스 이름 및 인터페이스를 사용할 수 있지만, 3 개 클래스가 같은 클래스를 확장하거나 동일한 인터페이스를 구현하는 경우에만, 그렇지 않으면 당신은 그렇게 할 수 없습니다 :

class C {} 
class D extends C {} 

function f(C $c) { 
    echo get_class($c)."\n"; 
} 

f(new C); 
f(new D); 

이를 인터페이스에 대해도 작동합니다 : (가/확장하는 경우 Dekel의 대답에 따라 서로를 구현 제외) 당신이 원하는 방식으로 여러 유형의 힌트를 제공 할 수있는 방법이 없습니다

interface I { public function f(); } 
class C implements I { public function f() {} } 

function f(I $i) { 
    echo get_class($i)."\n"; 
} 

f(new C); 
+0

여러 인터페이스를 구현할 수 있다는 것을 고려할 때 Dekel이 입증 한 인터페이스를 구현하는 것이 가장 좋습니다. – Nitin

+0

@Nitin은 단일 메서드의 입력 요구 사항을 기반으로 클래스를 구성하는 것이 모범 사례와 거리가 멀습니다. 물론이 방법이 적합한 경우가 많이 있습니다. – rjdown

+0

우수한 인터페이스 사용, 나는 그것을 좋아한다. –

5

.

당신은 예를 들어, 수동으로 유형을 적용해야합니다

/** 
* Does some stuff 
* 
* @param Foo|Bar|Baz $object 
* @throws Exception 
*/ 
+0

나에게서 +1을 얻었습니다. – Dekel

+0

비슷하게 유용한 정보 – rjdown

1

"당신은하는 PHPDoc 힌트로서 필요한 유형의 목록을 제공하여 최종 사용자에게 어느 정도 도움이 될 수 있습니다

public function someMethod($object) { 
    if (!in_array(get_class($object), array('Foo', 'Bar', 'Baz'))) { 
     throw new Exception('ARGGH'); 
    } 
} 

다중 "유형 힌트는 지원되지 않습니다.

간단한 솔루션은 instanceof (또는 @rjdown 용액)으로

public function someMethod($arg) 
{ 
    if (!$arg instanceof Foo && !$arg instanceof Bar && !$arg instanceof Bar) { 
     throw new \Exception("Text here") 
    } 
} 

를 확인하거나 모든 사용자 클래스 implement 일부 interface을 할 것입니다. 예 :

class Foo implements SomeInterface; 
class Bar implements SomeInterface; 
class Baz implements SomeInterface; 

// then you can typehint: 
public function someMethod(SomeInterface $arg)