1

私はphp oopを学んだり、本を読んだり、自分で試したりしています。

私の __construct には、デフォルト値を持つ多くのパラメーターがあります (実際、すべてのパラメーターがそうです)。ただし、新しいオブジェクトを作成するコードを記述しようとすると、構文エラーの問題が発生します。

たとえば、私の構成ステートメントには 6 つのパラメーターがあります。最初の 3 つに値を渡し、次の 2 つをスキップして最後の 1 つに値を設定したいと考えました。間に何も入れずにコンマを入れるだけですが、構文エラーが発生します。

デフォルト値を受け入れるには、何も入れない代わりに何を入れるべきですか?

ありがとう

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

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
    }
}

argに渡される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');

考えるべきことです。

于 2011-11-16T20:57:59.987 に答える
0

空の引用符を渡してみてください。空白をチェックして値を設定するには、コンストラクターでロジックを使用する必要がある場合があります。三項演算子 ()?: は適切な選択です。

于 2011-11-16T18:44:31.087 に答える