PHP에서 stdClass 란 무엇입니까?


답변:


785

stdClassObjectJava 또는 objectPython 과 같은 종류의 PHP의 일반 빈 클래스입니다 ( 편집 : 실제로 범용 기본 클래스로 사용되지는 않습니다 . 이 점 지적한 @Ciaran ).

익명 객체, 동적 속성 등에 유용합니다.

StdClass를 고려하는 쉬운 방법은 연관 배열의 대안입니다. json_decode()StdClass 인스턴스 또는 연관 배열을 얻는 방법을 보여주는 아래 예제를 참조하십시오 . 이 예제에서는 표시되지 않았지만 SoapClient::__soapCallStdClass 인스턴스를 반환합니다.

<?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의 동적 속성을 참조하십시오 .


7
아마도 그는 mysql_fetch_object를 사용했을 것입니다. 내가 실수하지 않으면 stdlcass의 인스턴스를 만듭니다.
Galen

69
Java의 Object와 같은 방식으로 기본 클래스가 아닙니다. 아래 답변을 참조하십시오.
Ciaran McNulty

1
파이썬에서 객체가 "모든"객체의 파생 클래스가 아님을 알고 싶습니다. 적어도 파이썬 3.0에서는 객체에서 파생 될 때까지는 안됩니다.
monokrome

11
사람들은 stdClass가 JavaScript의 {}구성 과 비슷하다고 말해야한다고 생각합니다 .
어스 엔진

선생님, 기사가 잘못되어 답변이 부분적으로 잘못되었습니다. 단,이 클래스를 확장하는 것은 당신이 즉, 유형 힌트에 옵션 제공한다는 것 (이것은 잘못된 너무) function(StdClass $a, array $params)경우 검사를 대 $a개체이고는 instanceof.
Dejan Marjanovic

1114

stdClass다른 유형을 객체에 캐스팅 할 때 사용되는 일반적인 '빈'클래스입니다. 다른 두 가지 대답에도 불구하고 PHP의 객체에 대한 기본 클래스 stdClass아닙니다 . 이것은 상당히 쉽게 입증 될 수 있습니다 :

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

PHP에 기본 객체의 개념이 있다고 생각하지 않습니다.


4
표준은 무엇을 의미합니까?
Adam Waite

47
STD = 표준 -
토마스 프라도

1
유틸리티 클래스입니다! Btw 이것은 실제 의견입니다!
구스타프

16
실제로 코드 스 니펫 다음의 첫 번째 문장이 질문에 대답합니다.
MauganRa

2
@Miro Markaravanes : stdClass뿐만 아니라 PHP의 모든 클래스에 동적 속성을 할당 할 수 있습니다.
StanE

95

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();

3
행과 함께 작동하는 유용한 함수를 가진 빈 클래스, 더 나은 코딩 표준
borrel

1
배열을 사용하는 것과 같습니다. 실제로 STDclass는 배열에서 객체로의 변환과 같이 저글링 할 때 생성됩니다.
varuog 2016 년

1
코드에서 오타를 수정하십시오 : ($ this-> currentpage-> name == 1)은 ($ this-> currentpage-> status == 1)
Enriqe

7
"익명 PHP 클래스를 만들 수 있습니다"- 익명 클래스가 아닙니다 . instanceof, get_class, ...를 사용할 수 있습니다.
John Smith

2
이 답변은 특히 이니까 혼란 PHP 실제로 익명 클래스가 매우 다르다, stdClass.
IMSoP

59

또한 주목할만한 점은 stdClass객체를 사용 하여 객체를 만들 수 있다는 json_decode()것입니다.


5
진실. 필자는 필요할 때 json_encode 및 json_decode를 사용하여 배열을 객체로 배열로 변환합니다.
pinkal vansia

6
$ x = json_decode (json_encode ($ object), True)는 객체를 배열로 디코딩하지만 이진 안전하지 않습니다. 기본적으로 일반 텍스트가 아닌 경우 JSON에서 중단 될 수 있습니다.
simontemplar

@simontemplar PHP에서는 작성하지 않아야합니다 True. 부울은 소문자 true또는 false입니다.
BadHorsie

2
@simontemplar 매뉴얼은 그렇지 않지만 PSR-2 는 그렇지 않으므로 어떤 종류의 표준을 따르는 경우에는 소문자 여야합니다. 물론 그렇게 작성하려면 유효 하지만 표준을 따라야합니다. 부울에 대한 수동 문서는 매우 오래되어 표준이 형성되기 전에 작성되었을 것입니다. 솔직히 말해서, PHP는 원래 표준없이 완전한 혼란으로 작성되었습니다 (사용 된 다양한 변수 / 함수 / 객체 명명 규칙 참조). 솔직히 개발자가 형식을 사용한 PHP 코드는 본 적이 없습니다.
BadHorsie

2
나는 True / False / Null을 제외하고 PSR-2를 따르고 클래스를 위해 자신의 줄에 여는 중괄호를 넣습니다. 그 외에는 상관 없어요 그래도 다른 사람의 코드를 편집하는 경우, 사용중인 표준 (있는 경우)을 따르고 실패하면 PSR-2를 "올바른"방식으로 수행합니다. 세 가지 키워드를 대문자로 표시하는 것이 가장 걱정할 수없는 수많은 다른 문제와 함께 신이 끔찍한 코드가 많이 있습니다.
simontemplar

26

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 문서에서이 예제를 참조하십시오 .


24

마찬가지로,

$myNewObj->setNewVar = 'newVal'; 

stdClass 객체를 생성합니다-자동 캐스트

나는 오늘 철자가 틀렸다는 것을 알았습니다.

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

멋있는!


9
그러나 이것은 E_NOTICE를 올릴 것입니다
Petah

3
@Petah PHP 5.3 이상에서만 가능합니까? 그러나 물론 그것은 나쁜 습관입니다.
ChristoKiwi

15

stdClass는 익명 클래스 또는 익명 객체가 아닙니다.

여기에 답변 stdClass은 익명 클래스 또는 익명 객체 인 표현식을 포함 합니다. 사실이 아닙니다.

stdClass단지 미리 정의 된 정규 클래스입니다. instanceofoperator 또는 function을 사용하여이를 확인할 수 있습니다 get_class. 특별한 것은 없습니다. PHP는 다른 값을 객체로 캐스팅 할 때이 클래스를 사용합니다.

stdClass프로그래머가 사용하는 많은 경우 유용한 기능과이 사용 사례 가 실제 객체가 아닌 데이터 구조를 나타 내기 때문에 배열이 더 나은 옵션입니다.


8

또한 캐스팅을 사용하면 실제로 @Bandula의 답변과 같이 객체를 만들 필요가 없습니다. 대신 배열을 객체로 캐스팅하면 stdClass가 반환됩니다. 예를 들면 다음과 같습니다.

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again


그것을 사랑하십시오. 훨씬 더 깨끗합니다!
WebSpanner

7

실제로 빈 stdClass를 만들려고 시도하고 속도를 빈 클래스와 비교했습니다.

class emp{}

그런 다음 1000 개의 stdClasses 및 emps 작성을 계속했습니다 ... 빈 클래스는 약 1100 마이크로 초 동안 수행되었지만 stdClasses는 1700 마이크로 초를 넘었습니다. 따라서 객체를 너무 잘못 사용하려는 경우 데이터를 저장하기 위해 자신의 더미 클래스를 만드는 것이 좋습니다 (배열은 쓰기와 읽기 모두 훨씬 빠릅니다).


22
분명히 이름 길이의 차이로 인해 차이가 발생합니다. "averylongclassnamefornoapparentreason"클래스를 호출하면 작성하는 데 시간이 더 오래 걸립니다. 그래서 그림을 이동하십시오.
Sage

27
흠 ... 조기 최적화. 600 마이크로 초를 절약하는 데 시간을 소비하지 않고 속도에 관심이 있다면 복잡한 SQL 쿼리 나 다른 네트워크 병목 현상을 발견하고 싶습니다. 실제로, 자바 스크립트가 머리보다 대신 바닥 글에 있는지 먼저 확인하십시오. 하나가 다른 것보다 600 마이크로 초 빠르면 걱정하십시오.
Ardee Aram

6
1000은 신뢰할 수있는 벤치 마크에 비해 너무 작습니다. 10 억을 시도하십시오.
rightfold

1
PHP 세계에서는 거의 항상 배열을 사용하는 것이 좋습니다.
Vahid Amiri

^ 확실히 그렇지 않다. 대규모 프로젝트에서 팀 작업을 할 때 배열 지옥은 악몽입니다.
데이비 데이브

6

사용중인 stdClass 오브젝트

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

에코합니다

존 도우


5

책에 대한 일부 데이터를 보유 할 새 객체를 빠르게 작성하려는 경우. 당신은 이런 식으로 할 것입니다 :

$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/ 사이트를 확인 하십시오.


4

두 개의 빈 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 >

동일한 인스턴스가 아니므로 서로 동일 할 수 없습니다. 클래스의 엄격한 비교는 인스턴스 식별과 함께 작동합니다. 모든 클래스의 각 인스턴스에는 고유 한 ID가 있습니다.
Bednic

3

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는 아무 것도 수행하지 않으므로 이점이 없습니다.


3

방법은 일부 데이터를 클래스에 넣어야 할 때 스크립트 해석을 중지하지 마십시오. 그러나 불행히도이 클래스는 정의되지 않았습니다.

예 :

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

여기에 데이터는 사전 정의 된 'Tasks'에 배치됩니다. 그러나 다음과 같이 코드를 수행하면

 return $statement->fetchAll(PDO::FETCH_CLASS );

그런 다음 결과를 넣을 것입니다 .

간단히 말한다 : 봐, 우리는 좋은 KIDS [Objects]를 가지고 있지만 부모는 없습니다. 그래서 우리는 유아 보육 홈으로 보낼 것입니다. :)


2

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

두 번째 방법은 많은 속성을 가진 객체를 초기화 할 때 주로 유용합니다.


1

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

배열 스타일 대신 객체 스타일을 사용하는 것에 대해 누군가가 생각하게 만드는 것은 무엇입니까 ???


0

우리가 가지고있는 이유 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_encodejson_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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.