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부터는 short array 구문을 사용할 수도 있습니다.
$json = [
(object) ['name' => 'John', 'hobby' => 'hiking'],
(object) ['name' => 'Jane', 'hobby' => 'dancing'],
];
다른 사람들이 지적한 것처럼 PHP에는 개체 리터럴이 없지만 개체에 배열을 지정하여 "가짜"로 만들 수 있습니다.
PHP 5.4에서는 배열을 대괄호로 선언할 수 있기 때문에 훨씬 더 간결합니다.예를 들어,
$obj = (object)[
"foo" => "bar",
"bar" => "foo",
];
이렇게 하면 "foo" 및 "bar" 속성을 가진 객체가 제공됩니다.하지만, 저는 이것이 연관 배열을 사용하는 것보다 큰 이점을 제공한다고 생각하지 않습니다.그냥 구문상의 차이일 뿐입니다.
여러분이 사용하는 모든 언어의 독특함과 "맛"을 받아들이는 것을 고려해보세요.자바스크립트에서 객체 리터럴은 여기저기에 있습니다.PHP에서 연관 배열은 자바스크립트 객체 리터럴과 기능적으로 동일하고 작성하기 쉬우며 다른 PHP 프로그래머들이 잘 이해하고 있습니다.자바스크립트의 객체 문자 구문처럼 느끼도록 하는 것보다 이 "맛"을 받아들이는 것이 더 낫다고 생각합니다.
또 다른 방법은 마법 방법을 사용하는 것입니다.
$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]
]));
그것은 그것이 가장 깊은 곳에 있는 물체임을 확실하게 해줍니다.
klewis에 응답하려면 다음과 같이 액세스할 수 있습니다.
echo $foods->vegetables->broccoli;
이 예제에서는 숫자 5를 출력합니다.
PHP에서 자바스크립트 스타일의 객체 리터럴은 다음과 같습니다.
먼저 다음과 같은 연관 배열을 만듭니다.
$test = array(
'name' => "test",
'exists' => true
);
그러면 쉽게 이런 물건으로 만들 수 있습니다.
$test = (object)$test;
이제 테스트할 수 있습니다.
echo gettype($test); // "object"
echo $test->name; // "test"
PHP에서는 클래스를 사용하기 전에 인스턴스를 생성해야 합니다.물론 나중에 인스턴스를 배열에 넣을 수 있습니다.
자바스크립트와 같이 객체 리터럴 패턴에 모듈을 정의하고 싶다면 다음과 같은 작업을 수행할 수 있습니다.
$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에는 Object Literal이 없지만, 자바스크립트 구문에 익숙하다면(나는 PHP보다 더 그렇습니다) 가짜로 만들어 이렇게 할 수 있습니다.보시다시피 자바스크립트보다 PHP가 훨씬 더 엉망입니다.
만약에json_decode(json_encode( $array ))
몸에 안 좋아요, 그러면 이런 비슷한 기능을 사용할 수 있어요.어느 쪽이 더 빠를지는 모르겠지만요.
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 );
간단한 솔루션
$obj = json_decode('{"ape":"kwyjibo"}');
echo $obj->ape;
[output:]
kwyjibo
그런 다음 함수로 래핑하고 리터럴 개체를 반환할 수 있습니다.
$obj = literal_object(['key1','val1','key2','val2']);
언급URL : https://stackoverflow.com/questions/9644870/php-object-literal
'programing' 카테고리의 다른 글
restTemplate Spring-mvc와 함께 멀티파트 폼 데이터를 전송하는 방법 (0) | 2023.09.15 |
---|---|
하나의 SELECT 문에 두 개의 스칼라 변수를 설정하시겠습니까? (0) | 2023.09.15 |
기판을 사용하여 Oracle에서 문자열 자르기 (0) | 2023.09.15 |
getopt_long() -- 적절한 사용 방법은 무엇입니까? (0) | 2023.09.15 |
특정 RUN 명령에 대해 캐시 사용 안 함 (0) | 2023.09.15 |