Copy & Paste Engineer

【PHP】Phalcon DI の get と getShared の違い

【Phalcon】DI の get と getShared の違いを整理する

Phalcon の DI コンテナを使っていると、$di->get()$di->getShared() のどちらを使うべきか迷う場面があります。

結論だけ先に書くと次のとおりです。

この違いを理解しておくと、不要なオブジェクト生成や状態の混乱を防げます。

get と getShared の違い

まずは最小コードです。

$di = new \Phalcon\Di\FactoryDefault();

$di->set('requestId', function () {
    return new stdClass();
});

$a = $di->get('requestId');
$b = $di->get('requestId');

var_dump($a === $b); // false(毎回新しいインスタンス)

同じサービスを getShared() で取得すると、結果は変わります。

$a = $di->getShared('requestId');
$b = $di->getShared('requestId');

var_dump($a === $b); // true(同じインスタンス)

使い分けの目安

get() を使う場面

例:

getShared() を使う場面

例:

setShared との関係

setShared() で登録したサービスは共有サービスとして扱われます。

$di->setShared('config', function () {
    return [
        'appName' => 'sample',
    ];
});

$x = $di->get('config');
$y = $di->get('config');

var_dump($x === $y); // true

つまり「共有サービスとして登録するか」「取得時に共有取得するか」の 2 つで挙動が決まります。

実務でのおすすめ方針

迷ったら、次のように決めると運用しやすいです。

まとめ

DI の解決ルールをそろえておくと、バグ調査や保守がかなり楽になります。

参考文献