PHP如何有条件地分配类属性变量

PHP如何有条件地分配类属性变量,php,arrays,soap,class,object,Php,Arrays,Soap,Class,Object,我不熟悉php类、数组等,所以如果我没有使用正确的术语,请原谅。我要寻找的是如何轻松地从类中为属性赋值,而不必依赖于“if”语句 例如: 假设我有一个类测试的实例,“test”有一个属性“employee”(希望这是正确的调用方式),employee是一个复杂类型 所以,我有这样的想法: $test -> employee = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritals

我不熟悉php类、数组等,所以如果我没有使用正确的术语,请原谅。我要寻找的是如何轻松地从类中为属性赋值,而不必依赖于“if”语句

例如:

假设我有一个类测试的实例,“test”有一个属性“employee”(希望这是正确的调用方式),employee是一个复杂类型

所以,我有这样的想法:

$test -> employee = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc)
我这里的问题是,如果‘年龄’、‘性别’、‘国籍’等不总是存在,我只想给它们赋值,当它们赋值时,我不想对非空值的每个组合使用if。。。(这是一个简短的例子,但我有很多这样的属性或它们被称为什么,太多的“如果”组合太混乱了)

我稍后将这些值作为soap请求发送,我不希望有任何空的xml标记

如果我的术语不正确,我深表歉意,但我希望我已经说得够清楚了,有人可以帮助我

提前感谢,, 巴勃罗

这个怎么样:

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

在这种情况下,您可以做什么:

  • 使员工成为私有属性
  • 定义一个要求提供所有参数的“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());
    ?>

您是否考虑过短三元溶液

'Sex' => ( isset($sex) ? $sex : "n/a" )
这基本上是执行
if else
逻辑,但没有那么详细。我们的条件是
isset($sex)
。如果这是真的,我们返回
$sex
,否则我们返回
“n/a”
。返回的任何内容都成为
'sex'的值

如果这还不够,我建议您在实例化过程中需要有效的值。如果用户没有提供正确的和预期的值,请拒绝类的实例化

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

编辑:这确保最终数组中只存在具有非null或非false值的键。

一种方法是将可能的键存储在数组中-然后您可以对其进行迭代,每个数组只需要一组控制代码:

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

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

我对你的问题有点困惑。诸如$sex、$NATIONAL等变量是否总是没有定义,或者只是有时设置为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;
      }
    }
  }

...

另一种方法是引入employee作为自己的对象,并在其对象中使用机制跳过空值。您可以覆盖_集,再次使用数据封装,获取_构造参数,或其他各种解决方案。

欢迎使用堆栈溢出,@Pablo!如果每个字段都是他们想要的,我同意这种方法。我是给人的印象是他们只是想跳过空值,在这种情况下,我发布了我的等效方法。很高兴看到这些OOP解决方案。嗨,Erisco,Pablo,你说得对,我只想分配已经“选中”的值“由用户从浏览器菜单中选择。这些指定的值稍后将作为soap请求发送,因此我需要确保未设置的值稍后不会转换为空xml标记。浏览器菜单中有许多值组合,因此这就是我试图避免实际的“如果”的原因。感谢大家的帮助,Pablo。”。