0

私は次の配列を持っています:

$allZones = array (
    'header'    =>  array('div1', 'div2'),
    'content'   =>  array('div3', 'div4')        
);

私はそれを使用して、次の方法でインスタンスを作成しています。

foreach($allZones as $newZoneId => $newZoneSubs) {
    $newZone = new zone($newZoneId, $newZoneSubs);
}

「ゾーン」クラスのコンストラクタは次のようになります。

public function __construct($newZoneId, array $newZoneSubs) {
    $this->zoneId = $newZoneId;

    if(is_array($newZoneSubs)) {
        foreach($newZoneSubs as $newZoneSub) {
                $this->zoneSubs[] = new zone($newZoneSub, '');
        }
    }
    else {
        echo "1: " . $newZoneSubs;
    }
}

何らかの理由で $newZoneSubs が空です。

誰でも理由を教えてもらえますか?

4

2 に答える 2

0

new zone($newZoneSub, '')-ここで文字列を渡しますが、2番目のパラメーターは配列である必要があります。そうでない場合、パラメーターのヒントが原因でキャッチ可能な致命的なエラーが発生します__construct($newZoneId, array $newZoneSubs)

で試してみてください

foreach($newZoneSubs as $newZoneSub) {
    $this->zoneSubs[] = new zone($newZoneSub, array());
}

例えば

<?php
$allZones = array (
    'header'    =>  array('div1', 'div2'),
    'content'   =>  array('div3', 'div4')        
);
foreach($allZones as $newZoneId => $newZoneSubs) {
    $newZone = new zone($newZoneId, $newZoneSubs);
    echo $newZone, "\n";
}

class zone {
    protected $zoneId, $zoneSubs;

    public function __construct($newZoneId, array $newZoneSubs) {
    $this->zoneId = $newZoneId;
    $this->zoneSubs = array();
    foreach($newZoneSubs as $newZoneSub) {
            $this->zoneSubs[] = new zone($newZoneSub, array());
        }
    }

    public function __toString() {
        return $this->foo(0);
    }

    protected function foo($n) {
        $rv =  str_repeat(' ', $n)
        .'zoneid='
        .$this->zoneId
        ."\n";
        foreach( $this->zoneSubs as $sub ) {
            $rv .= $sub->foo($n+1);
        }
        return $rv;
    }
}

プリント

zoneid=header
 zoneid=div1
 zoneid=div2

zoneid=content
 zoneid=div3
 zoneid=div4
于 2013-03-07T09:51:56.620 に答える
0

問題はコンストラクター内にあります。オプションの場合$newZoneSubs、次のように定義できます。

public function __construct($newZoneId, array $newZoneSubs = array()) 
{
    $this->zoneId = $newZoneId;

    foreach($newZoneSubs as $newZoneSub) {
        $this->zoneSubs[] = new zone($newZoneSub);
        //                                      ^^
        //                                   not passing the second param
    }
}
于 2013-03-07T10:03:15.173 に答える