답변:
stdClass
Object
Java 또는 object
Python 과 같은 종류의 PHP의 일반 빈 클래스입니다 ( 편집 : 실제로 범용 기본 클래스로 사용되지는 않습니다 . 이 점 을 지적한 @Ciaran ).
익명 객체, 동적 속성 등에 유용합니다.
StdClass를 고려하는 쉬운 방법은 연관 배열의 대안입니다. json_decode()
StdClass 인스턴스 또는 연관 배열을 얻는 방법을 보여주는 아래 예제를 참조하십시오 . 이 예제에서는 표시되지 않았지만 SoapClient::__soapCall
StdClass 인스턴스를 반환합니다.
<?php
//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);
echo $stdInstance->foo . PHP_EOL; //"bar"
echo $stdInstance->number . PHP_EOL; //42
//Example with associative array
$array = json_decode($json, true);
echo $array['foo'] . PHP_EOL; //"bar"
echo $array['number'] . PHP_EOL; //42
더 많은 예제 는 PHP와 StdClass의 동적 속성을 참조하십시오 .
{}
구성 과 비슷하다고 말해야한다고 생각합니다 .
function(StdClass $a, array $params)
경우 검사를 대 $a
개체이고는 instanceof
.
stdClass
다른 유형을 객체에 캐스팅 할 때 사용되는 일반적인 '빈'클래스입니다. 다른 두 가지 대답에도 불구하고 PHP의 객체에 대한 기본 클래스 stdClass
는 아닙니다 . 이것은 상당히 쉽게 입증 될 수 있습니다 :
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'
PHP에 기본 객체의 개념이 있다고 생각하지 않습니다.
stdClass는 또 다른 훌륭한 PHP 기능입니다. 익명의 PHP 클래스를 만들 수 있습니다. 예를 살펴 보겠습니다.
$page=new stdClass();
$page->name='Home';
$page->status=1;
이제 페이지 객체로 초기화하고 그 기반을 실행할 다른 클래스가 있다고 생각하십시오.
<?php
class PageShow {
public $currentpage;
public function __construct($pageobj)
{
$this->currentpage = $pageobj;
}
public function show()
{
echo $this->currentpage->name;
$state = ($this->currentpage->status == 1) ? 'Active' : 'Inactive';
echo 'This is ' . $state . ' page';
}
}
이제 Page Object를 사용하여 새 PageShow 객체를 만들어야합니다.
여기에 새로운 클래스 템플릿을 작성할 필요가 없습니다. stdClass를 사용하여 클래스를 즉시 생성 할 수 있습니다.
$pageview=new PageShow($page);
$pageview->show();
stdClass
.
또한 주목할만한 점은 stdClass
객체를 사용 하여 객체를 만들 수 있다는 json_decode()
것입니다.
True
. 부울은 소문자 true
또는 false
입니다.
stdClass 를 사용하면 자체 속성으로 새 객체를 만들 수 있습니다. 사용자의 세부 사항을 연관 배열로 나타내는 다음 예제를 고려하십시오.
$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";
객체의 속성과 동일한 세부 정보를 나타내야 할 경우 아래와 같이 stdClass 를 사용할 수 있습니다 .
$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";
Joomla 개발자 인 경우 추가 이해를 위해 Joomla 문서에서이 예제를 참조하십시오 .
마찬가지로,
$myNewObj->setNewVar = 'newVal';
stdClass 객체를 생성합니다-자동 캐스트
나는 오늘 철자가 틀렸다는 것을 알았습니다.
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
멋있는!
여기에 답변 stdClass
은 익명 클래스 또는 익명 객체 인 표현식을 포함 합니다. 사실이 아닙니다.
stdClass
단지 미리 정의 된 정규 클래스입니다. instanceof
operator 또는 function을 사용하여이를 확인할 수 있습니다 get_class
. 특별한 것은 없습니다. PHP는 다른 값을 객체로 캐스팅 할 때이 클래스를 사용합니다.
stdClass
프로그래머가 사용하는 많은 경우 유용한 기능과이 사용 사례 가 실제 객체가 아닌 데이터 구조를 나타 내기 때문에 배열이 더 나은 옵션입니다.
또한 캐스팅을 사용하면 실제로 @Bandula의 답변과 같이 객체를 만들 필요가 없습니다. 대신 배열을 객체로 캐스팅하면 stdClass가 반환됩니다. 예를 들면 다음과 같습니다.
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
Output: again
실제로 빈 stdClass를 만들려고 시도하고 속도를 빈 클래스와 비교했습니다.
class emp{}
그런 다음 1000 개의 stdClasses 및 emps 작성을 계속했습니다 ... 빈 클래스는 약 1100 마이크로 초 동안 수행되었지만 stdClasses는 1700 마이크로 초를 넘었습니다. 따라서 객체를 너무 잘못 사용하려는 경우 데이터를 저장하기 위해 자신의 더미 클래스를 만드는 것이 좋습니다 (배열은 쓰기와 읽기 모두 훨씬 빠릅니다).
stdClass를 사용하면 익명 클래스를 만들 수 있으며 객체 캐스팅을 사용하여 OOP 스타일의 연관 배열 키에 액세스 할 수도 있습니다. 일반 객체 속성에 액세스하는 것처럼.
class Example {
private $options;
public function __construct(Array $setup)
{
// casting Array to stdClass object
$this->options = (object) $setup;
// access stdClass object in oop style - here transform data in OOP style using some custom method or something...
echo $this->options->{'name'}; // ->{'key'}
echo $this->options->surname; // ->key
}
}
$ob1 = new Example(["name" => "John", "surname" => "Doe"]);
에코합니다
존 도우
책에 대한 일부 데이터를 보유 할 새 객체를 빠르게 작성하려는 경우. 당신은 이런 식으로 할 것입니다 :
$book = new stdClass;
$book->title = "Harry Potter and the Prisoner of Azkaban";
$book->author = "J. K. Rowling";
$book->publisher = "Arthur A. Levine Books";
$book->amazon_link = "http://www.amazon.com/dp/0439136369/";
자세한 내용은 http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ 사이트를 확인 하십시오.
두 개의 빈 stdClass가 완전히 같지 않다는 것을 명심하십시오. 이것은 조롱 기대를 쓸 때 매우 중요합니다.
php > $a = new stdClass();
php > $b = new stdClass();
php > var_dump($a === $b);
bool(false)
php > var_dump($a == $b);
bool(true)
php > var_dump($a);
object(stdClass)#1 (0) {
}
php > var_dump($b);
object(stdClass)#2 (0) {
}
php >
php.net 매뉴얼에는 stdClass가 무엇인지 사용자가 제공 한 몇 가지 확실한 설명과 예제가 있습니다. 특히 http://php.net/manual/en/language.oop5.basic.php#92123 , https : // stackoverflow.com/a/1434375/2352773 .
stdClass는 기본 PHP 객체입니다. stdClass에는 속성, 메서드 또는 부모가 없습니다. 매직 메소드를 지원하지 않으며 인터페이스를 구현하지 않습니다.
스칼라 또는 배열을 Object로 캐스팅하면 stdClass의 인스턴스가 생성됩니다. 일반 객체 인스턴스가 필요할 때마다 stdClass를 사용할 수 있습니다.
stdClass는 기본 클래스가 아닙니다! PHP 클래스는 어떤 클래스에서도 자동으로 상속되지 않습니다. 명시 적으로 다른 클래스를 확장하지 않는 한 모든 클래스는 독립형입니다. PHP는 이런 점에서 많은 객체 지향 언어와 다릅니다.
stdClass를 확장하는 클래스를 정의 할 수 있지만 stdClass는 아무 것도 수행하지 않으므로 이점이 없습니다.
표준 클래스 방법은 PHP 일부 데이터를 클래스에 넣어야 할 때 스크립트 해석을 중지하지 마십시오. 그러나 불행히도이 클래스는 정의되지 않았습니다.
예 :
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
여기에 데이터는 사전 정의 된 'Tasks'에 배치됩니다. 그러나 다음과 같이 코드를 수행하면
return $statement->fetchAll(PDO::FETCH_CLASS );
그런 다음 PHP 결과를 넣을 것입니다 표준 클래스 .
간단히 PHP말한다 : 봐, 우리는 좋은 KIDS [Objects]를 가지고 있지만 부모는 없습니다. 그래서 우리는 유아 보육 홈으로 보낼 것입니다.표준 클래스 :)
object
배열을 원하는 객체로 캐스트 하는 데 사용할 수도 있습니다 .
Class Example
{
public $name;
public $age;
}
이제 유형의 객체를 만들고 Example
초기화하려면 다음 중 하나를 수행하십시오.
$example = new Example();
$example->name = "some name";
$example->age = 22;
또는
$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];
두 번째 방법은 많은 속성을 가진 객체를 초기화 할 때 주로 유용합니다.
stClass는 php 자체에 의해 생성 된 빈 클래스이며 PHP는 단지 "빈"클래스가 아니기 때문에 php에서만 사용해야합니다 .php는 stdClass를 사용해야하는 경우 stdClass를 사용하여 배열을 객체 스타일로 변환합니다. : 1- 배열을 사용하십시오 (클래스보다 훨씬 빠름) .2 빈 클래스를 만들고 사용하십시오.
//example 1
$data=array('k1'=>'v1' , 'k2'=>'v2',....);
//example 2
//creating an empty class is faster than instances an stdClass
class data={}
$data=new data();
$data->k1='v1';
$data->k2='v2';
배열 스타일 대신 객체 스타일을 사용하는 것에 대해 누군가가 생각하게 만드는 것은 무엇입니까 ???
우리가 가지고있는 이유 stdClass는 PHP에서 자바 스크립트에서 당신이 가지고있는 것처럼 (연관 배열에서 정상적인 배열을 구별 할 수있는 방법이 없기 때문이다 {}
목적과는[]
구별하기 위해 배열이).
따라서 이것은 빈 객체에 문제를 일으 킵니다. 예를 들어 보자.
PHP :
$a = [1, 2, 3]; // this is an array
$b = ['one' => 1, 'two' => 2]; // this is an associate array (aka hash)
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)
변수 $ c를 JSON으로 인코딩한다고 가정 해 봅시다.
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}
이제 모든 키를 $b
비워서 삭제했다고 가정 해 봅시다 . 때문에 $b
지금 비어있는, 그것의 모양 (당신은 키가 기억하는 모든? 삭제) []
당신이 그것을 보면 어떤 배열 또는 객체 중 하나가 될 수 있습니다.
따라서 json_encode를 다시 수행하면 출력이 달라집니다
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}
이것은 우리가 그것이 b
연관 배열이어야한다는 것을 알고 있지만 PHP (또는 json_encode와 같은 함수)는 그렇지 않기 때문에 문제입니다.
stdClass가 구출됩니다. 다시 같은 예를 들어
$a = [1, 2, 3]; // this is an array
$b = (object) ['one' => 1, 'two' => 2]; // this makes it an stdClass
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)
이제 모든 키를 삭제 $b
하고 비워 두더라도 stdClass이므로 중요하지 않으며 json_encode하면 다음과 같이 나타납니다.
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}
이것은 또한 이유입니다 json_encode
및 json_decode
기본 반환 stdClass에 의해.
$c = json_decode('{"a": [1,2,3], "b": {}}', true); //true to deocde as array
// $c is now ['a' => [1,2,3], 'b' => []] in PHP
// if you json_encode($c) again your data is now corrupted