2010-02-02 85 views
4

我是新来的PHP类,数组等,所以请原谅我,如果我不使用正确的术语。我在寻找的是如何轻松地将值赋给类的属性,而不必依赖“if”语句。PHP如何有条件地分配类属性变量

例如:

假设我有一类测试的一个实例,“测试”有一个属性“雇员”(希望这是调用它的正确方法)和员工是一个复杂的类型。

所以,我有这样的:

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

我就是这里的问题是,如果“年龄”,‘性别’,‘民族’等并不总是存在的,我只想要分配值给他们当他们有东西分配,我不想使用If的每个组合非空值...(这是一个简短的例子,但我有很多这些属性或任何他们被称为和太多的“如果”组合太杂乱)...

我后来发送这些值作为肥皂请求,我不想要任何em pty xml标签...

如果我的术语不正确,我很抱歉,但我希望我已经足够清楚,有人在那里帮助我!

由于提前, 巴勃罗

+1

欢迎来到Stack Overflow,@Pablo! – Sampson 2010-02-02 19:09:00

回答

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

我同意这种方法,如果要求每个领域是他们想要的。我的印象是,他们只是想跳过空值,在这种情况下,我发布了我的等价方法。很高兴看到这些OOP解决方案。 – erisco 2010-02-02 19:23:17

+0

嗨Erisco,Pablo在这里,你是对的,我只想给用户指定从浏览器菜单中“选择”的值。这些分配的值稍后将作为肥皂请求发送,因此我需要确保未设置的值不会转换为空的xml标记。浏览器菜单中有很多值组合,这就是我试图避免的实际“if”的原因。感谢大家的帮助,巴勃罗。 – Pablo 2010-02-02 19:59:18

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情况。

OOP方法可能是使用数据封装 - 这是一种常见的选择。应该对测试类进行以下更改。

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参数或其他各种解决方案。