2014-03-28 2 views
1

가변 길이를 만들고 싶습니다. 마지막 항목은 선택적으로 클래스 상수의 비트 마스크입니다. 그러나 마지막 항목이 비트 마스크인지 여부를 확인하는 방법을 생각해 낼 수는 없으므로 선택 사항이어야합니다.가변 길이 인수 함수에 대한 비트 플래그 검사

class D { 
    const A = 1; 
    const B = 2; 
    const C = 4; 
    const D = 8; 

    public function test(){ 
     $args = func_get_args(); 
     $possibly_flags = $args[count($args)-1]; 
     if(???){ // do some test here to find out 
      // do stuff with the flags check 
     } 
    } 
} 

$d->test($val1, $val2, [...,], D::A|D::B); 

이 문제를 해결할 수있는 방법이 있습니까?

답변

1

다른 클래스를 사용하여 플래그 및 다른 설정을 종료 한 다음 해당 클래스의 인스턴스인지 테스트합니다. 이 클래스는이 목적으로 만 사용되기 때문에 꽤 정숙하게 작동합니다. 지금 사용한 예제는 다음과 같습니다.

class D { 
    const A = 1; 
    const B = 2; 
    const C = 4; 
    const D = 8; 

    public function test(){ 
     $args = func_get_args(); 
     $possibly_flags = $args[count($args)-1]; 
     if($possibly_flags instanceof Settings){ 
      // do stuff with the flags 
     } 
    } 
} 

class Settings(){ 
    public $flags; 
    public function __construct($flags){ 
     $this->flags = $flags; 
    } 
} 

$d->test($val1, $val2, [...,], new Settings(D::A|D::B)); 
0

나는 더 투명 클래스 디자인 제안 : 주어진대로 매개 변수를 주장하는 경우 (new D())->setBitmask(D::A)->test($x, $y);

처럼 부를 수

class D { 
    const A = 1; 
    const B = 2; 

    public function setBitmask($bitmask) { 
     $this->bitmask = $bitmask; 
     return $this; 
    } 

    public function test() { 
     $args = func_get_args(); 
     if ($this->bitmask /* whatever */) { 
      /* whatever else */ 
     } 
    } 

    protected $bitmask = self::A | self::B; 
} 

- 선택적 마지막 인수로 가변 길이 기능 - 다음 당신은 둘을 구별하기 위해 전리품을 사용해야 할 것입니다. 예, 널 (null)은 감시의 경우 :

당신의 방법에 다음 (new D())->test($val1, $val2, null, D::A)

:이 꽤 불쾌한 취성지고

public function test() { 
    $args = func_get_args(); 
    if (null === $args[count($args)-2]) { 
     $bitmask = $args[count($args)-1]; 
     /* here you would check that bitmask is possible */ 
    } else { 
     $bitmask = D::A; /* default if you want it */ 
    } 

    if ($bitmask /* whatever */) { 
     /* whatever else */ 
    } 
} 

, 그래서 확실히 내가 위 또는 잭의 방법 @ 설명하는 접근 방법을 고려 두 개의 인수 중 하나.

0

당신은 데이터의 서로 다른 두 가지를 전달하고, 그래서 당신은 함수 선언에 두 개의 서로 다른 인수를 필요 :이 인수의 모호성을 피할 수

public function test(array $args, $flags = 0) 
{ 
} 

... 
$d->test([$var1, $var2, $var3], D::A); 

합니다.

+0

여러 가지 종류의 데이터를 전달하려고합니다. 디버깅에 사용되므로 인수를 배열에 포함 시키면 묶음이 추가됩니다. 불필요한 출력 또는 배열이 여러 인수를 전달했는지 또는 인수로 간주되었는지 여부를 확인하기위한 몇 가지 추가 검사 –

관련 문제