Рекомендации: Как проверить константу в массиве с помощью PHP? - PullRequest
0 голосов
/ 05 декабря 2009

Я не совсем уверен, как это сделать. У меня есть объект, и я хочу установить для него свойство type, но перед тем, как сделать это, я хочу проверить, чтобы убедиться, что это допустимый тип.

Я подумал, что сейчас самое время использовать константы, поскольку имена типов не изменятся (и я не хочу, чтобы они были).

// 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)

Обновление: Я решил, что мне на самом деле не нужно использовать константы, но я принял ответ, который, я думаю, мог бы выполнить работу.

Ответы [ 6 ]

3 голосов
/ 05 декабря 2009

Если у вас есть массив со всеми типами $_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. Таким образом, единственная копия данных будет использоваться для всех экземпляров.

2 голосов
/ 05 декабря 2009

Чтобы получить доступные константы в классе, вам нужно будет использовать Отражение .

Например:

$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 голосов
/ 05 декабря 2009

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!
}
0 голосов
/ 05 декабря 2009

Вы могли бы сделать что-то вроде этого. Фактический код - это немного кода, который я извлек из рабочего приложения, но вы поняли идею.

<?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 голосов
/ 05 декабря 2009

, если вы хотите распечатать массив. Вы бы увидели строковые значения. Таким образом, вы можете просто проверить, находится ли $ value в $ _values.

0 голосов
/ 05 декабря 2009

Вы не можете установить массив как значение для переменной класса!

См. http://php.net/manual/en/language.oop5.constants.php

Значение должно быть постоянным выражение, не а переменная, свойство, результат математическая операция или функция звоните.

Вы можете достичь функциональности, используя метод установки и получения для своей переменной, но не для константы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...