2009-12-04 39 views
0

我不太確定如何做到這一點。我有一個對象,我想設置一個'type'屬性,但在做之前,我想檢查一下以確保它是一個有效的類型。最佳做法:如何使用PHP檢查數組中的常量?

我在想這是使用常量的好時機,因爲類型名稱不會改變(我也不希望它們是)。

// this is just a sample of what I was thinking: 
class Foobar 
{ 
    const TYPE_1 = 'type 1'; 
    protected $_types = array(
     self::TYPE_1 
    ); 

    public function setType($value) 
    { 
     // check to make sure value is a valid type 
     // I'm thinking it should be able to accept 
     // Foobar::TYPE_1, 'TYPE_1', or 'type 1' 
     // for flexibility sake. But I don't know 
    } 
} 

$foobar = new Foobar(); 
$foobar->setType('TYPE_1'); //what should go here? (best practice) 

更新:我決定我並沒有真的需要擺在首位使用常量,但我已經接受一個答案,我認爲本來可以做的工作。

回答

3

如果你有各類$_types一個數組,那麼你可以直接檢查值呈現了它:

class Foobar 
{ 
    const TYPE_1 = 'type 1'; 
    ## declare all available types as static variable 
    ## don't forget to change it when new type will be added 
    protected static $_types = array(
     self::TYPE_1 
    ); 
    public function setType($value) { 
     if (in_array($value, self::$_types)) { 
       // type is valid, we can use it 
     } 
     else { 
       // type is wrong, reporting error 
       throw new Exception("wrong type [".$value."]"); 
     } 
    } 
} 

但它需要額外的工作以支持這個數組,以確保所有更多鈔票類型在陣列。也應該是static。因此,唯一的數據副本將用於所有實例。

-1

您不能將數組設置爲類變量的值!

參見http://php.net/manual/en/language.oop5.constants.php

該值必須是一個常數 表達,一個 變量,屬性,一個 數學運算,或函數 調用的結果。

您可以通過爲變量使用setter和getter方法而不是常量來實現該功能。

+0

這是可能的 – Ikke 2009-12-04 22:49:54

+0

你提到的網頁,有關類常量,而不是CLAS成員會談。 – Ikke 2009-12-04 23:01:23

0

如果您打印陣列。你會看到字符串值。所以你可以檢查$ value是否在$ _values中。

0

你可以做這樣的事情。實際的代碼是我從生產應用程序中提取的一小段代碼,但您明白了。

<?php 
class Example { 
    protected $SEARCH_TYPES = array('keyword', 'title', 'subject'); 

    function getSearchType($val) { 
     if (in_array($val, $this->SEARCH_TYPES)) { 
      return $val; 
     } 
     return FALSE; 
    } 
} 
?> 
+0

然後,顯然,您使用此方法來驗證您的輸入並相應地保存它。 – Allyn 2009-12-04 22:52:31

2

要獲得一類的可用常數,你將不得不使用Reflection

例如:

$ref = new ReflectionClass($this); 
$constants = $ref->getConstants(); 

// Constants now contains an associative array with the keys being 
// the constant name, and the value the constant value. 
0

in_array會幫助你,但要注意in_array必須掃描所有的數組找到價值。因此,它可能是這樣的:

class Foobar 
{ 
const TYPE_1 = 'type 1'; 
protected $_types = array(
    self::TYPE_1 => true 
); 

public function setType($value) 
{ 
    $value = strtolower($value); // case-insensitive 
    if(isset($this->_types[$value])  // check "type 1" 
     || isset($this->_types[str_replace($value, '_', ' ')]))  // check "type_1" 
    { 
     // OK! 
    } else { 
     throw new Exception("Invalid type: $value"); 
    } 

} 
} 

如果你還需要檢查的Foobar :: TYPE_1,使用constant($value) - 它允許檢查類常量。或者,如果你想要一個像確切的類名稱使用反射:

list($class, $const) = explode('::', $value); 
$refclass = new ReflectionClass($this); 
if(get_class($this) == $class && $refclass->getConstant($value)) { 
// OK! 
} 
相關問題