Эффективный метод для проверки объекта на наличие переменных-членов? - PullRequest
1 голос
/ 05 февраля 2010

У меня есть класс процессора данных, который может выполнять свою основную функцию только после того, как всем его переменным-членам присвоено значение:

class {
    public $firstName;
    public $lastName;
    public $ssn;
    public $accessKey;

    public function __construct($data = null) {
        if (is_array($data)) {
            // Assign the value of any fields in $data to
            // the corresponding member var
        }
    }

    public processData() {
        // *** CHECK IF ALL PROPERTIES HAVE VALUES ***
        foreach ($this as $p=>$val) {
            if ($val === null) {
                return false;
            }
        }

        doStuff();
    }
}

Есть ли более эффективный или элегантный способ проверить, что все свойства имеют значение? Мне кажется, что Фагли так поступает.

Ответы [ 2 ]

1 голос
/ 05 февраля 2010

Вы можете поместить членов класса в массив, чтобы вы могли перебирать их, не включая все остальные члены класса, например:

<?php

class Test
{

    public $options = array
    (
        'firstname' => NULL,
        'lastname' => NULL,
        'ssn' => NULL,
        'accesskey' => NULL,
    );

    public function __set($key, $val)
    {
        if (empty($val) === FALSE AND array_key_exists($key, $this->options))
        {
            $this->options[$key] = $val;
        }
        else
        {
           // Throw an exception
           throw new Exception('Empty value');
        }

        return;
    }

    public processData()
    {
        doStuff();
    }            
}

В вашем коде есть ошибка, вы забыли синтаксис "function" для "processData".

Я также создал метод __set, который выдает ошибку, когда вы устанавливаете пустое значение. Например

<?php

$test = new Test;

try
{
    // Throws an error
    $test->firstname = NULL;
} 
catch(Exception $e)
{ 
   var_dump($e);
}

try
{
    // Works fine
    $test->firstname = 'Brian';
} 
catch(Exception $e)
{ 
   var_dump($e);
}
1 голос
/ 05 февраля 2010

Ну, я бы инкапсулировал проверки в защищенном методе, таком как _isValid(), а затем jsut do

public function process()
{
  if($this->_isValid())
  {
     $this->doStuff();
     return true;
  }

  // otherewise throw an exception or otherwise alter control flow return values
}

Еще одна вещь, которая сделает проверку на самом деле более элегантной, - это добавить переменную для _requiredValues и одну для _values и сделать так, чтобы они оба были массивами - вместо использования отдельных переменных-членов ... таким образом, вы можете проверить их оптовая продажа с использованием функции сравнения массивов, если вы предпочитаете.

Если вам нужен легкий доступ к отдельным значениям, вы можете просто добавить геттер, например `public

function getValue($value) 
{ 
    return isset($this->_values[$value]) 
       ? $this->_values[$value] 
       : null; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...