我有这个代码。它有效,但有可能做得更好吗?用更少的代码?
public function __construct($type ,$brand, $model, $year, $mileage, $height, $width, $depth, $ps, $color, $price, $value, $seats)
{
if (is_int($type)) {
$this->_type = $type;
} else {
throw new Exception('Wrong Value in Type. Expected integer');
}
}
...
我创建了一个像这样的对象
try {
$firstCar = new Car(1, 'Audi', 'A3', 2011, 94512, 2, 2, 2, 105, 'Black', 1000, 1920, 5);
} catch ( Exception $error) {
die($error->getMessage());
}
我重复" IF-ELSE" 2个类中每个变量的语句。它的代码太多了。
这里有一些建议吗?
答案 0 :(得分:1)
假设每个字段必须是int
:
...
private function checkArgument($arg) {
if (is_int($type)) {
$this->_type = $type;
} else {
throw new Exception('Wrong Value in Type. Expected integer');
}
}
...
public function __construct($type ,$brand, $model, $year, $mileage, ...) {
checkArgument($type);
checkArgument($brand);
...
}
您也可以使用func_get_args()
来获取数组中的所有参数,然后循环它们。
答案 1 :(得分:0)
我的问题解决方法不同。
$this->setType($type);
protected function setType($worth)
{
if (is_int($worth)) {
$this->_type = $worth;
} else {
throw new Exception('Wrong Value in Type. Expected valid integer');
}
}
这是我传给Class的每个参数。
对那些对此感兴趣的人。不是最好的解决方案,但它会缩短子类。
答案 2 :(得分:0)
要将值检查为整数,可以以回调方式使用filter_var 或者你可以传递数组作为参数,并在下面使用filter_var_array函数, 下面是我的示例代码:
$firstCar = new Car(1, 'Audi', 'A3', 2011, 94512, 2, 2, 2, 105, 'Black', 1000, 1920, 5);
public function __construct($type ,$brand, $model, $year, $mileage, $height, $width, $depth, $ps, $color, $price, $value, $seats) {
$arrInput = func_get_args();
// this is enough to check only all arguments are integer or not by comparing the counts by input and filter array
$arrFilter = array_filter(filter_var_array($arrInput,FILTER_VALIDATE_INT));
if (count($arrFilter) < count($arrInput)) { // means there should be atleast one non-integer value
// to get the exact values which are exaclty not interger
$arrResult = array_diff($arrInput, $arrFilter);
throw new('your error'); // or return $arrResult; // this return Audi, A3 and Black
}
}
您可以通过从构造函数中抛出错误来使用try / catch捕获错误,或者根据您的需要从构造函数返回$ arrResult来获取非整数的结果值。
答案 3 :(得分:0)
它不是很多代码,只是凌乱。
可能问题是在一个地方,团体和#34;类型&#34;在value对象中的属性中,每个值对象都将处理它们的&#34;验证&#34;
示例:
或类似的东西,你应该知道它们之间的关系
会导致:
function __construct(CarType $model, Size $size, Price $price, $seats)
{
// no need to validade CarType did that
$this->model = $model;
....
}
为了帮助创建此对象,您可以使用工厂或构建器