67

PHP では、配列リテラルを非常に簡単に指定できます。

array(
    array("name" => "John", "hobby" => "hiking"),
    array("name" => "Jane", "hobby" => "dancing"),
    ...
)

しかし、オブジェクトの配列が必要な場合はどうすればよいでしょうか? PHPでオブジェクトリテラルを指定するにはどうすればよいですか? つまり、javascript では次のようになります。

[
    {name: "John", hobby: "hiking"},
    {name: "Jane", hobby: "dancing"}
]
4

10 に答える 10

93

BoltClockが述べたように、PHPにはオブジェクトリテラルはありませんが、配列をオブジェクトに型キャストするだけでこれを行うことができます。

$testArray = array(
    (object)array("name" => "John", "hobby" => "hiking"),
    (object)array("name" => "Jane", "hobby" => "dancing")
);

echo "Person 1 Name: ".$testArray[0]->name;
echo "Person 2 Hobby: ".$testArray[1]->hobby;
于 2012-03-10T08:16:58.230 に答える
69

PHP 5.4 以降では、短い配列構文も使用できます。

$json = [
    (object) ['name' => 'John', 'hobby' => 'hiking'],
    (object) ['name' => 'Jane', 'hobby' => 'dancing'],
];
于 2013-02-27T19:53:00.003 に答える
4

(オブジェクト) としてのキャストは、単一の階層レベルでは問題なく機能しますが、深くはなりません。つまり、すべてのレベルでオブジェクトが必要な場合は、次のようにする必要があります。

$foods = (object)[
  "fruits" => (object)["apple" => 1, "banana" => 2, "cherry" => 3],
  "vegetables" => (object)["asparagus" => 4, "broccoli" => 5, "carrot" => 6]
];

ただし、オブジェクトとして複数のキャストを行う代わりに、次のように json_encode と json_decode ですべてをラップできます。

$foods = json_decode(json_encode([
  "fruits" => ["apple" => 1, "banana" => 2, "cherry" => 3],
  "vegetables" => ["asparagus" => 4, "broccoli" => 5, "carrot" => 6]
]));

これにより、それが最も深いレベルのオブジェクトであることを確認できます。

klewis に答えるには、次のようにアクセスします。

echo $foods->vegetables->broccoli;

この例では、数値 5 が出力されます。

于 2016-06-08T03:40:59.980 に答える
4

もう 1 つの方法は、__set_state()マジック メソッドを使用することです。

$object = stdClass::__set_state (array (
    'height'   => -10924,
    'color'    => 'purple',
    'happy'    => false,
    'video-yt' => 'AgcnU74Ld8Q'
));

__set_state() メソッドについて、それがどこから来て、どのように使用されることになっているのかについてもう少し説明します。

于 2013-02-21T09:49:04.597 に答える
2

PHP での JavaScript スタイルのオブジェクト リテラルの私の方法は次のとおりです。

まず、次のような連想配列を作成します。

$test = array(
  'name' => "test",
  'exists' => true
);

次に、次のようなオブジェクトを簡単に作成します。

$test = (object)$test;

これでテストできます:

echo gettype($test); // "object"
echo $test->name; // "test"
于 2015-07-18T16:46:55.587 に答える
0

「JavaScript のような」オブジェクト リテラル パターンでモジュールを定義したい場合は、次のようにすることができます。

$object = (object) [
    'config' => (object) [
        'username' => 'Rob Bennet',
        'email' => 'rob@madebyhoundstooth.com'
    ],

    'hello' => function() use(&$object) {
        return "Hello " . $object->config->username . ". ";
    },

    'emailDisplay' => function() use(&$object) {
        return "Your email address is " . $object->config->email;
    },

    'init' => function($options) use(&$object) {
        $object->config = $options;
        $doUsername = $object->hello;
        $doEmail = $object->emailDisplay;
        return $doUsername() . $doEmail();
    }
];

$sayMyInfo = $object->init;

echo $sayMyInfo((object) [
    'username' => 'Logan',
        'email' => 'wolverine@xmen.com'
]);

このタイプのモジュラー シナリオでは、通常、ファサード パターンを選択します。呼び出しを次のように書くのが好きです。

Module::action()->item;

また

Post::get()->title;

これらのパターンのいずれも、テストを容易にする (場合によっては可能にする) ことはありません。しかし、これは単なる概念実証です。技術的には、「いいえ」PHP にはオブジェクト リテラルはありませんが、JavaScript 構文 (私は PHP よりも慣れています) に慣れている場合は、それを偽造してこれを行うことができます。ご覧のとおり、JavaScript よりも PHP の方がはるかに厄介です。

于 2013-06-01T00:50:58.713 に答える
0

PHP では、クラスを使用する前にインスタンスを作成する必要があります。もちろん、後でインスタンスを配列に入れることもできます。

于 2012-03-10T08:06:58.667 に答える