-1

私はまだZF2を理解することを学んでいますが、最善の方法は物事を行うことです. 私はこの奇妙な問題に遭遇し、これが予想される動作であるかどうか疑問に思っていました.

私のアプリケーションでは、次のコードがあります

//In module.php getServiceConfig()
return array(
    'invokables' => array(
        'hardwareEntity'        => 'Hardware\Model\Hardware',
    ),
}

私のコントローラーでは、x要素の配列になるテキストの塊からデータを取得します例として3を取りましょう

$hardwares = array(
    'hw1' => array(
        'name'  => 'router1'
        'ip'    => '192.168.0.200',
        'type'  => 'router',
    ),

    'hw2' => array(
        'name'  => 'pc1'
        'ip'    => '192.168.0.210',
        'type'  => 'pc',
    ),

    'hw3' => array(
        'name'  => 'pc2'
        'ip'    => '192.168.0.211',
        'type'  => 'pc',
    ),
);

ハードウェア モジュールにハードウェア クラスがあります

namespace Hardware\Model\;
class Hardware
{
    protected $name = null;
    protected $ip   = null;
    protected $type = null;

    public function exchangeArray(array $data) {

        $this->name = (isset($data['name']))    ? $data['name'] : $this->name;
        $this->ip   = (isset($data['ip']))      ? $data['ip']   : $this->ip;
        $this->type = (isset($data['type']))    ? $data['type'] : $this->type;
    }
}

次のforeachループを実行すると、魔法が起こります。異なる結果が得られます

foreach($hardwares as $hw) {
    $h = $this->getServiceManager()->get('hardwareEntity');
    $h->exchangeData($hw);
    $aObjects[] = $h
}

$aObjects 配列には、Hardware\Model\Hardware のタイプのオブジェクトを含む 3 つの要素が含まれるようになりましたが、最後の $hardwares 要素のデータが含まれています (別名、ループ中にすべてのクラスをデータで上書きします)。

結果:

array(3) {
    [0]=> 
    object(Hardware\Model\Hardware)#219 {
        ["name":protected]=>
        string(7) "pc2"
        ["ip":protected]=>
        string(13) "192.168.0.211"
        ["type":protected]=>
        string(6) "pc"
    }
    [1]=> 
    object(Hardware\Model\Hardware)#219 {
        ["name":protected]=>
        string(7) "pc2"
        ["ip":protected]=>
        string(13) "192.168.0.211"
        ["type":protected]=>
        string(6) "pc"
    }
    [2]=> 
    object(Hardware\Model\Hardware)#219 {
        ["name":protected]=>
        string(7) "pc2"
        ["ip":protected]=>
        string(13) "192.168.0.211"
        ["type":protected]=>
        string(6) "pc"
    }

しかし、私がするとき

foreach($hardwares as $hw) {
    $h = new \Hardware\Model\Hardware();
    $h->exchangeData($hw);
    $aObjects[] = $h
}

それぞれ異なるデータを含む新しくインスタンス化されたクラスで $aObjects 配列を埋めます。

結果:

array(3) {
    [0]=> 
    object(Hardware\Model\Hardware)#219 {
        ["name":protected]=>
        string(7) "router1"
        ["ip":protected]=>
        string(13) "192.168.0.200"
        ["type":protected]=>
        string(6) "router"
    }
    [1]=> 
    object(Hardware\Model\Hardware)#220 {
        ["name":protected]=>
        string(7) "pc1"
        ["ip":protected]=>
        string(13) "192.168.0.210"
        ["type":protected]=>
        string(6) "pc"
    }
    [2]=> 
    object(Hardware\Model\Hardware)#221 {
        ["name":protected]=>
        string(7) "pc2"
        ["ip":protected]=>
        string(13) "192.168.0.211"
        ["type":protected]=>
        string(6) "pc"
    }
4

1 に答える 1

1

サービス マネージャーのクイック スタートから

shared: サービス名とブール値のペアの配列で、サービスを共有するかどうかを示します。デフォルトでは、ServiceManager はすべてのサービスが共有されていると想定しますが、ここでブール値 false を指定して、新しいインスタンスを返す必要があることを示すことができます。

だから、おそらくこのようなことをする必要があります...

//In module.php getServiceConfig()
return array(
    'invokables' => array(
        'hardwareEntity'        => 'Hardware\Model\Hardware',
    ),
    'shared' => array(
         'hardwareEntity' => false,
    ),
}
于 2013-02-04T16:46:58.907 に答える