PHP как назначить переменные свойства класса условно - PullRequest
4 голосов
/ 02 февраля 2010

Я новичок в php классах, массивах и т. Д., Поэтому прошу прощения, если я не использую правильную терминологию.То, что я ищу, это как легко присваивать значения свойствам из класса без необходимости зависеть от операторов "if".

Например:

Предположим, у меня есть экземпляр классаtest, а у test есть свойство «employee» (надеюсь, это правильный способ его вызова), а сотрудник имеет сложный тип.

Итак, у меня есть что-то вроде:

$test -> employee = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc)

Проблема, с которой я столкнулся, заключается в том, что если «Возраст», «Пол», «Национальность» и т. Д. Не всегда присутствуют, и я хочу присвоить им значения , только если им назначено что-то ,и я не хочу использовать If для каждой комбинации не пустых значений ... (это короткий пример, но у меня есть много этих атрибутов или как они там называются, и слишком много комбинаций "если" слишком грязно)...

Я отправляю эти значения позже как запрос мыла, и я не хочу пустых тегов xml ...

Приношу свои извинения, если моя терминология неверна, но янадеюсь, я был достаточно ясен, чтобы кто-то там помог мне!

Заранее спасибо, Пабло

Ответы [ 6 ]

3 голосов
/ 02 февраля 2010

Что вы можете сделать в этом случае:

  • Сделать сотрудника личным атрибутом
  • Определить метод "setter" setEmployee, который требует предоставления всех аргументов.

Вот пример кода; попробуйте это:

    <?php

    class test{

        private $employee;

        public function setEmployee($age,$sex,$nationality,$maritalstatus){
            $this->employee=array('Age'=>$age,
                            'Sex'=>$sex,
                            'Nationality'=>$nationality,
                            'MaritalStatus'=>$maritalstatus);
        }

        public function getEmployee(){
            return $this->employee;
        }
    }


    $t=new test();
    $t->setEmployee('32','M','American','Married');

    print_r($t->getEmployee());
    ?>
1 голос
/ 02 февраля 2010

Рассматривали ли вы кратковременное решение?

'Sex' => ( isset($sex) ? $sex : "n/a" )

Это, по сути, логика if-else, но не такая многословная. Наше состояние isset($sex). Если это правда, мы возвращаем $sex, иначе мы возвращаем "n/a". Все, что возвращается, становится значением 'Sex'.

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

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

Как насчет этого:

$array = array('Age' => '30' , 'Sex' => $sex, 'nationality' => $nationality, 'maritalstatus' => $status);
foreach ($array as $key => $value) { 
    if (is_null($value) || $value=="") { 
        unset($array[$key]); 
    } 
}
$test->employee = $array;
0 голосов
/ 02 февраля 2010

Я немного запутался в вашей проблеме. Переменные, такие как $ sex, $ nationality и т. Д., Не всегда определены или они просто иногда имеют значение null? Если эти переменные не всегда существуют, необходимо сначала проверить их существование, и нет никакого способа обойти это - если вы не реорганизуете предыдущий код.

Я предполагаю, что переменные существуют, и вы просто не хотите сохранять пустые случаи.

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

class test {

  protected $employee = array();

  public function getEmployee() {
    return $this->employee;
  }

  public function setEmployee($employee) {
    foreach ($employee as $key => $value) {
      if ($value !== null) {  // or any value it should not be
        $this->employee[$key] = $value;
      }
    }
  }

...

Другим подходом было бы представить сотрудника как его собственный объект и использовать механизмы в его объекте для пропуска нулевых значений. Вы можете переопределить __set, снова использовать инкапсуляцию данных, принять аргументы __construct или множество других решений.

0 голосов
/ 02 февраля 2010

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

$keys = array('Age', 'Sex', 'Nationality');

foreach ($keys as $key) {
  if ( isset($inputs[$key]) )
    $test->employee[$key] = $inputs[$key];
}
0 голосов
/ 02 февраля 2010
$temp_array = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc);

foreach($temp_array as $key => $val){
 if(!$temp_array[$key]){
  unset($temp_array[$key];
 }
}

если вам нужно принять FALSE в качестве значения, используйте вместо этого:

$temp_array = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc);

foreach($temp_array as $key => $val){
 if($temp_array[$key] !== NULL){
  unset($temp_array[$key];
 }
}

edit: это гарантирует, что в конечном массиве присутствуют только ключи с ненулевыми или ненулевыми значениями.

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