2016-11-04 30 views
1

我有一個類,其中一個方法接受應該是特定選項範圍之一的參數。我已經將這些選項定義爲類中的常量。如何防止用不是這些常量之一的值調用方法?如何檢查方法調用是否使用有效的類常量

有些代碼可能會更清楚我想要實現:

<?php 
class Foo 
{ 
    const OPTION_A = 'a valid constant'; 
    const OPTION_B = 'another valid constant'; 

    public function go($option) 
    { 
     echo 'You chose: ' . $option; 
    } 
} 

$myFoo = new Foo(); 
$myFoo->go(Foo::OPTION_A); // ok 
$myFoo->go(Foo::OPTION_B); // ok 
$myFoo->go('An invalid value'); // bad - string, not one of the class constants 
$myFoo->go(Bar::OPTION_A); // bad - constant is not local to this class 
+1

您可以使用反射和ReflectionClass :: getConstants方法做到這一點。看看文檔http://php.net/manual/en/reflectionclass.getconstants.php – Andreas

回答

1

使用ReflectionClass的getConstants()方法:

public function go($option) 
{ 
    $r = new \ReflectionClass($class); 
    if (in_array($option, $r->getConstants()) { 
     echo 'You chose: ' . $option; 
    } else { 
     echo 'urgh'; 
    } 

} 
+0

我接受這個,因爲它大多解決了這個問題。但是,如果在上面的例子中,'Bar :: OPTION_A'是字符串''一個有效的常量',你的代碼就會通過。我怎樣才能檢查實際的方法調用,並確保常量來自類「Foo」而不是「Bar」類? – voidstate

+1

簡短的答案是你不能輸入常量。一種解決方案是使用枚舉,實際上它是類常量的類型化封裝,例如:https://github.com/artkonekt/enum –

相關問題