PHP OOP构造函数设计模式

时间:2014-08-19 13:08:46

标签: php oop design-patterns

我有这个代码。它有效,但有可能做得更好吗?用更少的代码?

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个类中每个变量的语句。它的代码太多了。

这里有一些建议吗?

4 个答案:

答案 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;

示例:

  • 高度,宽度,深度应尺寸
  • 类型,品牌,型号,年份应由 CarModel
  • 价格,价值应该是价格
  • ...

或类似的东西,你应该知道它们之间的关系

会导致:

function __construct(CarType $model, Size $size, Price $price, $seats)
{
    // no need to validade CarType did that
    $this->model = $model;
    ....
}

为了帮助创建此对象,您可以使用工厂或构建器