2010-02-02 4 views
4

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

Например:

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

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

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

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

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

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

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

+1

Добро пожаловать в Stack Overflow, @Pablo! – Sampson

ответ

1

Как об этом:

$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; 
3

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

  • Марк сотрудник частного атрибут
  • Определите " 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

Я согласен с этим методом, если требуется, чтобы каждое поле было то, что они хотят. У меня создалось впечатление, что они просто хотели пропустить значения, которые были нулевыми, и в этом случае я опубликовал свой эквивалентный подход. Приятно видеть эти решения ООП. – erisco

+0

Привет, Erisco, Pablo здесь, вы правы, я просто хочу назначить значения, которые были выбраны пользователем в меню браузера. Эти назначенные значения позже отправляются как запрос на мыло, поэтому мне нужно убедиться, что значения, которые не заданы, впоследствии не преобразуются в пустые теги xml. В меню браузера есть множество комбинаций значений, поэтому причина фактического «если» я пытаюсь избежать. Спасибо всем за вашу помощь, Пабло. – Pablo

1

Вы считаете короткое тройное решение?

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

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

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

0
$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]; 
} 
} 

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

0

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

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

foreach ($keys as $key) { 
    if (isset($inputs[$key])) 
    $test->employee[$key] = $inputs[$key]; 
} 
0

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

Я предполагаю, что переменные существуют, и вы просто не хотите сохранять случаи 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 или множество других решений.

Смежные вопросы