1

我正在学习 php oop,浏览书籍等并自己尝试。

在我的 __construct 中,我有许多具有默认值的参数(实际上它们都具有)。但是,当我尝试编写代码来创建一个新对象时,我遇到了语法错误问题。

例如,我的构造语句有 6 个参数。我将值传递给前三个,想跳过接下来的两个并为最后一个设置一个值。我只是在它们之间放置逗号,但它会引发语法错误。

我应该用什么代替什么来接受默认值?

谢谢

4

3 回答 3

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);     
于 2011-11-16T18:44:37.750 回答
0

尝试传递空引号。您可能必须在构造函数中使用逻辑来检查空白并设置值。三元运算符 ()?: 是一个不错的选择。

于 2011-11-16T18:44:31.087 回答
0

Phil 发布的解决方案可能就是您所追求的,因为即使可能没有值,您也不尊重构造函数的每个参数。

鉴于您正在学习 OOP,我想为您提供一个替代解决方案。多年来,我发现将参数传递给构造函数最终会导致 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');

只是想一想。

于 2011-11-16T20:57:59.987 回答