【问题标题】:PHP how to assign class property variables conditionallyPHP如何有条件地分配类属性变量
【发布时间】:2011-01-12 07:18:36
【问题描述】:

我是 php 类、数组等方面的新手,所以如果我没有使用正确的术语,请见谅。我正在寻找的是如何轻松地为类中的属性分配值,而不必依赖“if”语句。

例如:

假设我有一个类 test 的实例,并且“test”有一个属性“employee”(希望这是正确的称呼方式)并且employee 是一个复杂类型。

所以,我有类似的东西:

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

我在这里遇到的问题是,如果“年龄”、“性别”、“国籍”等并不总是存在,我只想为他们分配值当他们分配了一些东西时 ,并且我不想为非空值的每个组合使用 If ......(这是一个简短的例子,但我有很多这些属性或它们被称为的任何东西,太多的“if”组合太混乱了)...

我稍后将这些值作为肥皂请求发送,我不想要任何空的 xml 标记...

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

提前致谢, 巴勃罗

【问题讨论】:

  • 欢迎来到 Stack Overflow,@Pablo!

标签: php arrays soap class object


【解决方案1】:

我对你的问题有点困惑。 $sex、$nationality 等变量是否总是未定义,或者它们有时只是设置为空?如果这些变量并不总是存在,则必须首先检查它们的存在,并且没有办法解决 - 除非您重构早期的代码。

我假设变量确实存在,而您只是不想保存 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 参数或各种其他解决方案。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果要求每个字段都是他们想要的,我同意这种方法。我的印象是他们只是想跳过空值,在这种情况下,我发布了我的等效方法。很高兴看到这些 OOP 解决方案。
    • 嗨,Erisco,Pablo,你是对的,我只想分配用户从浏览器菜单中“选择”的值。这些分配的值稍后会作为肥皂请求发送,因此我需要确保未设置的值以后不会转换为空的 xml 标记。浏览器菜单中有许多值组合,所以这就是我试图避免的实际“如果”的原因。感谢大家的帮助,巴勃罗。
    【解决方案3】:

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

    $keys = array('Age', 'Sex', 'Nationality');
    
    foreach ($keys as $key) {
      if ( isset($inputs[$key]) )
        $test->employee[$key] = $inputs[$key];
    }
    

    【讨论】:

      【解决方案4】:

      这个怎么样:

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

      【讨论】:

        【解决方案5】:
        $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];
         }
        }
        

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

        【讨论】:

          【解决方案6】:

          您是否考虑过短的三元解决方案?

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

          这本质上是在执行if-else 逻辑,但没有那么冗长。我们的条件是isset($sex)。如果这是真的,我们返回$sex,否则我们返回"n/a"。无论返回什么都成为'Sex' 的值。

          如果这还不够,我建议您在实例化期间要求有效值。如果用户没有提供正确的期望值,则拒绝实例化该类。

          【讨论】:

            猜你喜欢
            • 2013-05-09
            • 1970-01-01
            • 2016-09-27
            • 2011-05-18
            • 2021-09-20
            • 1970-01-01
            • 2021-12-02
            • 2022-01-05
            • 2011-10-03
            相关资源
            最近更新 更多