我正在学习php oop,浏览书籍等等,并且自己动手。
在我的__construct中,我有许多具有默认值的参数(实际上所有参数都有)。但是,当我尝试编写代码来创建新对象时,我遇到了语法错误问题。
例如,我的构造语句有6个参数。我将值传递给前三个,想要跳过下两个并为最后一个设置一个值。我只是在它们之间没有任何逗号,但它会引发语法错误。
我应该用什么来代替什么才能接受默认值?
由于
答案 0 :(得分:4)
传递NULL而不是
示例:
$obj = new Whatever($parm1,$parm2,$parm3,NULL,NULL,NULL);
或在您的构造函数中设置为null
__construct($parm1 = NULL,$parm2 = NULL,$parm3 = NULL,$parm4 = NULL,$parm5 = NULL,$parm6 = NULL)
并像这样称呼它
$obj = new Whatever();
您的评论更新:
您的代码:
function __construct(
$userid,
$magicCookie,
$accessLvl = 'public',
$det = 'basic',
$sortOrder = 'starttime',
$recurring = 'true',
$d_from = "01/01/2011",
$d_to = "31/01/2011",
$max = "10") {
// Code goes here...
}
所以这样打电话
// After the seconds parameter you have default values
$obj = new Whatever(
$userid,
$magicCookie
);
您如何看待这个?
function __construct(
$userid,
$magicCookie,
$accessLvl = NULL,
$det = NULL,
$sortOrder = NULL,
$recurring = FALSE,
$d_from = NULL,
$d_to = NULL,
$max = NULL) {
// Code goes here... Yes set Defaults if NULL
}
这样称呼:
$obj = new Whatever(
$userid,
$magicCookie,
$accessLvl = 'public',
$det = 'basic',
$sortOrder = 'starttime',
$recurring = TRUE,
$d_from = "01/01/2011",
$d_to = "31/01/2011",
$max = 10);
答案 1 :(得分:0)
尝试传递空引号。您可能必须在构造函数中使用逻辑来检查空白并设置值。三元运算符()?:是个不错的选择。
答案 2 :(得分:0)
Phil发布的解决方案可能就是你所追求的,因为即使可能没有值,你也不会尊重构造函数的每个参数。
因为你正在学习OOP,我想为你提供另一种解决方案。多年来,我发现将params传递给构造函数最终会导致arg列表变得难以处理。考虑这个例子(仅限于演示目的):
class Car
{
public function __construct($color = NULL, $transmission = NULL, $bodyStyle = NULL, $interior = NULL, $engineType = NULL, $wheelSize = NULL, $radioType = NULL) {
// Do stuff
}
}
将一长串args传递给arg,我实例化的每个对象都必须检查以确保我以正确的顺序传递值,如果我在一段时间内没有看到代码,这将变得乏味。
// Example 1
$myCar = new Car('blue', 'automatic', 'sedan', 'leather', 'v6', '18', 'xmBluetooth');
// Example 2
$myCar = new Car('green', 'manual', NULL, NULL, 'v8', NULL);
// Example 3
$myCar = new Car(NULL, NULL, 'sedan', NULL, NULL, NULL, NULL, 'cdPlayer');
我建议做的是使用setter来设置这些值,然后每次实例化对象时,只需要设置必要的值,而不必处理长参数列表中的条目顺序。
class Car {
protected $color;
protected $bodyStyle;
protected $transmission;
protected $interior;
protected $engineType;
protected $wheelSize;
protected $radioType;
public function setColor($color)
{
$this->color = $color;
}
public function setTransmission($transmission)
{
$this->transmission = $transmission;
}
// etc.
}
// Calling code
$myCar = new Car();
$myCar->setColor('green');
$myCar->setWheelSize('18');
$myCar->setInterior('leather');
$myCar->setEngineType('v6');
$yourCar = new Car();
$yourCar->setColor('black');
只需要考虑一下。