code

PHP 개체 리터럴

codestyles 2021. 1. 5. 08:07
반응형

PHP 개체 리터럴


PHP에서는 배열 리터럴을 매우 쉽게 지정할 수 있습니다.

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

하지만 객체 배열을 원하면 어떻게해야합니까? PHP에서 객체 리터럴을 어떻게 지정할 수 있습니까? 즉, 자바 스크립트에서는 다음과 같습니다.

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

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;

PHP 5.4부터는 짧은 배열 구문을 사용할 수도 있습니다.

$json = [
    (object) ['name' => 'John', 'hobby' => 'hiking'],
    (object) ['name' => 'Jane', 'hobby' => 'dancing'],
];

다른 사람들이 언급했듯이 PHP에는 객체 리터럴이 없지만 배열을 객체로 캐스팅하여 "가짜"수 있습니다.

PHP 5.4에서는 배열이 대괄호로 선언 될 수 있기 때문에 훨씬 더 간결 합니다. 예를 들면 :

$obj = (object)[
    "foo" => "bar",
    "bar" => "foo",
];

이것은 "foo"및 "bar"속성을 가진 객체를 제공합니다. 그러나 이것이 연관 배열을 사용하는 것보다 많은 이점을 제공한다고 생각하지 않습니다. 단지 구문 차이 일뿐입니다.

사용하는 모든 언어의 고유성과 "맛"을 포용하는 것을 고려하십시오. JavaScript에서 객체 리터럴은 어디에나 있습니다. PHP에서 연관 배열은 JavaScript 객체 리터럴과 기능적으로 동일하고 생성하기 쉬우 며 다른 PHP 프로그래머가 잘 이해할 수 있습니다. JavaScript의 객체 리터럴 구문처럼 느껴지도록하는 것보다이 "맛"을 포용하는 것이 더 낫다고 생각합니다.


또 다른 방법은 __set_state()마법 방법 을 사용하는 것입니다 .

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

__set_state () 메서드에 대한 자세한 내용은 어디에서 왔으며 어떻게 사용해야합니다.


(객체)로 캐스팅은 단일 계층 수준에서 잘 작동하지만 깊이 들어가지는 않습니다. 즉, 모든 수준에서 개체를 원하면 다음과 같은 작업을 수행해야합니다.

$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]
]));

그것은 그것이 가장 깊은 수준의 물체임을 확인합니다.


PHP에서 JavaScript 스타일의 객체 리터럴을 사용하는 방법은 다음과 같습니다.

먼저 다음과 같은 연관 배열을 만듭니다.

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

그런 다음 쉽게 다음과 같은 객체로 만듭니다.

$test = (object)$test;

이제 테스트 할 수 있습니다.

echo gettype($test); // "object"
echo $test->name; // "test"

PHP에서는 클래스를 사용하기 전에 인스턴스를 만들어야합니다. 물론 나중에 인스턴스를 배열에 넣을 수 있습니다.


"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;

Neither of these patterns make it easy (or even possible sometimes) for testing. But this is just proof of concept. Technically, "no" there is no Object Literal in PHP, but if you're used to JavaScript syntax (which I am more so than PHP), you can fake it and do this. As you can see, it's a lot messier in PHP than in JavaScript.


If the json_decode(json_encode( $array )) isn't good for you, then you can use some similar functions like these. Which one is faster, I don't know.

function deep_cast_object( $o ){
  return deep_cast_object_ref( $o );
}

function deep_cast_object_ref( & $o ){

  if( is_array( $o ))
    $o = (object)$o;

  if( is_object( $o ))
    foreach( $o as & $v )
      deep_cast_object_ref( $v );

  return $o;
}

$obj = deep_cast_object(array(
  'Fractal' => array(
    'of'    => array(
      'bad' => 'design',
    ),
  ),
));

var_dump( $obj );

ReferenceURL : https://stackoverflow.com/questions/9644870/php-object-literal

반응형