2011-11-16 20 views
1

我正在学习php oop,阅读书籍等,并有我自己的去。php oop构造可选参数语法错误

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

例如我的构造语句有6个参数。我将值传递给前三个,希望跳过下两个值并为最后一个值设置一个值。我只是简单地在它们之间插入逗号,但它引发了一个语法错误。

我应该用什么来代替没有接受默认值的东西?

谢谢

+5

我们需要查看您实际拥有的代码,以便确定究竟发生了什么问题。 – BoltClock

+1

从你写的你应该通过NULL逗号分隔值。 $ obj = new无论($ parm1,$ parm2,$ parm3,NULL,NULL,NULL); –

+0

你需要把东西放在那里。 NULL,例如0.它不允许跳过参数值:new MyClass($ param1,$ param2,$ param3,NULL,NULL,$ param6);是一个正确的形式。 – ioseb

回答

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(); 

UPDATE来自y我们的评论:

您的代码:

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);  
+0

嗨下面的代码 [代码] 功能__construct($用户ID, \t \t \t $ magicCookie, \t \t \t $ accessLvl = '公', \t \t \t $ DET = '基本', \t \t \t $中将sortOrder = '开始时间', \t \t \t $经常性= '真', \t \t \t $ d_from = “01/01/2011”, \t \t \t $ d_to = “31/01/2011”, \t \t \t $最大= “10”){ [/代码] 但是,当我尝试创建我用Null作为@loseb建议的对象,并得到它启动,但因为我使用空它似乎覆盖默认值为空 所以,如果是这样的话大概我需要测试传递的参数为空,然后设置对象内的默认变量? ANY帮助表示感谢 – Ray

+0

@ user1050303根据您的意见更新了我的答案 –

+0

感谢您的更新,我想我现在明白了 - 谢谢。 因此,下面的每条评论,你是否使用带参数的构造,或者你使用setter - 或者组合。 什么是最佳做法? 谢谢大家! – Ray

0

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

+0

不!空值将覆盖默认值。 – str

+0

是的,但你还可以跳过随机参数。您只需使用一些if语句来设置默认值为空白。 – Len

+1

如前所述使用'NULL'。 – str

0

发表菲尔的解决方案可能是你所追求的,因为你不尊重,即使有可能不是一个值的构造的每个参数。

因为您正在学习面向对象,我想为您提供一种替代解决方案。多年来,我发现向构造函数传递params最终会导致arg列表变得笨拙。考虑这个例子(仅示范目的):

class Car 
{ 
    public function __construct($color = NULL, $transmission = NULL, $bodyStyle = NULL, $interior = NULL, $engineType = NULL, $wheelSize = NULL, $radioType = NULL) { 
     // Do stuff 
    } 
} 

用传递给精氨酸args来一个长长的清单,每一个对象我实例我要检查,以确保我传递值以正确的顺序,成为乏味,如果我有一段时间没有看到代码。

// 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'); 

我会建议使用制定者的每一个对象实例化时设置这些值,那么,只有必要的值需要进行设置,这样做,而不必在相当长的参数列表来处理条目顺序。

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'); 

只是想一想。

+0

谢谢您的提示。有趣的是,我在创建类的第一次尝试时就这样做了,但接着又找到了另一篇使用了__construct参数的文章。 我得现在想一想! 再次感谢 – Ray

+0

总是和你一起去吧;) –