PHP如何有条件地分配类属性变量
我不熟悉php类、数组等,所以如果我没有使用正确的术语,请原谅。我要寻找的是如何轻松地从类中为属性赋值,而不必依赖于“if”语句 例如: 假设我有一个类测试的实例,“test”有一个属性“employee”(希望这是正确的调用方式),employee是一个复杂类型 所以,我有这样的想法: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
$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。”。