PHP에서 빈 객체를 정의하는 방법


384

새로운 배열로 나는 이것을한다 :

$aVal = array();

$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";

객체와 비슷한 구문이 있습니까?

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";

13
$var = (object) (boolean) (string) (int) (array) new StdClass; 알다시피, 안전합니다.
Xeoncross

1
Google은이 질문 제목을 다음과 같이 색인했습니다 Arrays - How to define an empty object in PHP. 배열과는 아무 상관이 없다
계산법 캐년

답변:


848
$x = new stdClass();

매뉴얼주석이 가장 잘 요약됩니다.

stdClass는 기본 PHP 객체입니다. stdClass에는 속성, 메서드 또는 부모가 없습니다. 매직 메소드를 지원하지 않으며 인터페이스를 구현하지 않습니다.

스칼라 또는 배열을 Object로 캐스팅하면 stdClass의 인스턴스가 생성됩니다. 일반 객체 인스턴스가 필요할 때마다 stdClass를 사용할 수 있습니다.


5
$ o = (개체) NULL; -객체가 객체로 변환되면 수정되지 않습니다. 다른 유형의 값이 오브젝트로 변환되면 stdClass 내장 클래스의 새 인스턴스가 작성됩니다. 값이 NULL이면 새 인스턴스가 비어 있습니다. 배열은 키로 명명 된 속성과 해당 값을 가진 객체로 변환됩니다. 다른 값의 경우 scalar라는 멤버 변수에 값이 포함됩니다.
DDS

11
난 그냥 stdClass내 머리 속에 "표준 클래스"라고 말합니다
sjagr

1
내 대답을 계속 잊어
버린다면

26
"찾을 수 없음"이 표시되는 경우 : new \stdClass(); PHP 네임 스페이스 문서
2540625

3
@IvanCastellanos 당신 stdClass()은 단어에서 기억하는 방법을 설명 할 수 AIDS있습니까?
Adam

117

"빈"객체를 생성하는 표준 방법은 다음과 같습니다.

$oVal = new stdClass();

그러나 PHP> = 5.4에서는 개인적으로 다음 을 사용하는 것을 선호합니다.

$oVal = (object)[];

더 짧고 개인적으로 stdClass 때문에 더 명확하게 생각합니다. 가 초보 프로그래머에게 오도 될 수 (예 : "클래스가 아닌 객체를 원합니다!"...).

PHP <5.4와 동일합니다 :

$oVal = (object) array();

(object)[] 에 해당 new stdClass() .

PHP 매뉴얼을 참조하십시오 ( here ).

stdClass : typecasting to object로 작성됩니다.

그리고 ( 여기 ) :

개체가 개체로 변환되면 수정되지 않습니다. 다른 유형의 값이 오브젝트로 변환 되면 stdClass 내장 클래스의 새 인스턴스가 작성 됩니다.


그러나 @PaulP가 말한 것처럼 empty ($ oVal)은 false를 반환합니다 .

속성이없는 개체는 더 이상 비어있는 것으로 간주되지 않습니다.

예를 들어, 다음과 같이 쓰는 경우 :

$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates  a Warning here
$oVal->key1->var2 = "something else";

PHP는 다음 경고를 생성하여 속성 key1(객체 자체)을 암시 적으로 생성합니다

경고 : 빈 값에서 기본 객체 생성

구성 ( 오류보고 레벨 참조 )에 브라우저에이 경고가 표시 되면 문제가 될 수 있습니다 . 이것은 또 다른 전체 주제이지만 오류 제어 연산자 (@) 를 사용하여 경고를 무시 하는 빠르고 더러운 접근 방법이 있습니다 .

$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";

3
문제를 해결하는 대신 새로운 문제를 만들고 있습니다. 해결해야 할 문제는 사람들이 무엇을해야하는지 알아야한다는 것 stdClass입니다.
Pacerier

2
나는 무엇을 썼다 stdClass. stdClass질문에 답하는 코드를 사용 했습니다. 미안하지만 새로운 문제를 일으키지 않습니다. 개인적인 의견이었습니다.
cgaldiolo

6
"개인 취향"! = "문제"
cgaldiolo

4
@Pacerier, 나는 당신의 완고함을 이해하지 못합니다. 문제는 'PHP에서 빈 객체를 정의하는 방법'이었습니다. 내 대답은 정확하고 "new stdClass ()"를 사용하도록 썼습니다. 사용자 'ed209'에게 제공 한 코드가 정확하고 "new stdClass ()"를 사용했습니다. 또한 나는 개인적인 견해를 덧붙였 고,“표준적인”방법이 아니라는 것을 분명히하기 위해 대담한“개인적으로”사용했습니다. 겸손한 견해로는 너무 많은 의견을 가질 가치가있는 문제는 적어도 틀린 대답이어야합니다. 대신 개인적인 견해를 문제로 생각한다면, 이는 아이디어를 건설적으로 공유하는 데 문제가 될 수 있습니다.
cgaldiolo

9
정말 속기 등(object) []
Rahil 지르

35

PHP에는 빈 객체와 같은 의미가 없다는 것을 지적하고 싶습니다.

$obj = new stdClass();
var_dump(empty($obj)); // bool(false)

물론 $ obj는 비어있을 것입니다.

반면에 빈 배열은 두 경우 모두 비어 있습니다.

$arr = array();
var_dump(empty($arr));

비어있는 changelog 함수에서 인용

속성이없는 개체는 더 이상 비어있는 것으로 간주되지 않습니다.


비어있는 변경 로그에서 해당 견적을 찾을 수 없습니다.
powpow12

@ powpow12 그것은 거기에 있었다 . 5.0.0에서 변경되었습니다.
Stanley Umeanozie


14

JavaScript로 익명 유형의 객체를 만드는 것이 얼마나 쉬운 지 좋아합니다.

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value

그래서 항상 자바 스크립트처럼 PHP에서 이런 종류의 객체를 작성하려고합니다 .

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

//PHP < 5.4
$myObj = (object) array(
    "foo" => "Foo value",
    "bar" => "Bar value"
);

echo $myObj->foo; //Output: Foo value

그러나 이것은 기본적으로 배열이므로 익명 함수를 js와 같은 속성에 할당하는 것과 같은 작업을 수행 할 수 없습니다.

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: function(greeting) {
        return greeting + " bar";
    }
};
console.log(myObj.bar("Hello")); //Output: Hello bar

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => function($greeting) {
        return $greeting . " bar";
    }
];
var_dump($myObj->bar("Hello")); //Throw 'undefined function' error
var_dump($myObj->bar); //Output: "object(Closure)"

글쎄, 할 수는 있지만 IMO는 실용적이지 않으며 깨끗하지 않습니다.

$barFunc = $myObj->bar;
echo $barFunc("Hello"); //Output: Hello bar

또한이 synthax를 사용하면 재미있는 놀라움을 찾을 수 있습니다 있지만 대부분의 경우 잘 작동합니다.


1
이것은 정답입니다
Mike Aron

11

당신이 잊어 버린 경우 zombat의 답변 외에도 stdClass

   function object(){

        return new stdClass();

    }

이제 할 수있는 일 :

$str='';
$array=array();
$object=object();

대부분의 IDE가 다른 객체와 혼동 될 수있는 함수로 "객체"라는 용어를 강조하지는 않지만이 기술을 좋아합니다. 그러나 이봐, 그것은 나를 위해 작동합니다!
Brixster

7

다음을 사용할 수 있습니다 new stdClass()(권장).

$obj_a = new stdClass();
$obj_a->name = "John";
print_r($obj_a);

// outputs:
// stdClass Object ( [name] => John ) 

또는 빈 배열을 stdClass 내장 클래스의 새 빈 인스턴스를 생성하는 객체로 변환 할 수 있습니다.

$obj_b = (object) [];
$obj_b->name = "John";
print_r($obj_b);

// outputs: 
// stdClass Object ( [name] => John )  

또는 null값을 stdClass 내장 클래스의 비어있는 새 인스턴스를 생성하는 객체 로 변환 할 수 있습니다 .

$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);

// outputs:
// stdClass Object ( [name] => John ) 

5

비슷한 방식으로 stdClass의 데이터에 액세스하려면 연관 배열을 사용하여 {$ var} 구문 만 사용하십시오.

$myObj = new stdClass;
$myObj->Prop1 = "Something";
$myObj->Prop2 = "Something else";

// then to acces it directly

echo $myObj->{'Prop1'};
echo $myObj->{'Prop2'};

// or what you may want

echo $myObj->{$myStringVar};

4

다른 사람들이 지적했듯이 stdClass를 사용할 수 있습니다. 그러나 ()가 없으면 더 깨끗하다고 ​​생각합니다.

$obj = new stdClass;

그러나 질문에 따르면 실제로 원하는 것은 속성을 객체에 즉시 추가 할 수있는 것 같습니다. 가능하지만 stdClass를 사용할 필요는 없습니다. 실제로 모든 클래스를 사용할 수 있습니다. 클래스의 객체 인스턴스를 만들고 속성 설정을 시작하십시오. 나는이 경우에 사용하기를 좋아하는 기본 확장 기능을 사용하여 이름이 o 인 클래스를 만들고 싶습니다. 다른 클래스에서 확장하기에 좋습니다. 기본적으로 그것은 내 자신의 기본 객체 클래스입니다. 또한 단순히 o ()라는 함수를 갖고 싶습니다. 이렇게 :

class o {
  // some custom shared magic, constructor, properties, or methods here
}

function o() {
  return new o;
}

고유 한 기본 개체 유형을 원하지 않으면 o ()가 새 stdClass를 반환하도록 할 수 있습니다. 한 가지 장점은 o가 stdClass보다 기억하기 쉽고 클래스 이름, 함수 이름 또는 둘 다로 사용하는지에 관계없이 더 짧다는 것입니다. o 클래스에 코드가 없더라도 어색하게 대문자로 명명 된 stdClass ( '성적으로 전염병 클래스'라는 아이디어를 불러 일으킬 수 있음)보다 암기하는 것이 더 쉽습니다. o 클래스를 사용자 정의하면 생성자 구문 대신 o () 함수를 사용할 수 있습니다. 생성자보다 덜 제한적인 값을 반환하는 일반 함수입니다. 예를 들어, 함수 이름은 호출 가능한 매개 변수를 허용하는 함수에 문자열로 전달 될 수 있습니다. 이 기능은 체인도 지원합니다. 따라서 다음과 같은 작업을 수행 할 수 있습니다.

이것은 기본 "언어"가 전체 내부 DSL로 작성된 최상위 계층으로 다른 언어 계층을 구축하기위한 훌륭한 시작입니다. 이것은 lisp 스타일의 개발과 비슷하며 PHP는 대부분의 사람들이 인식하는 것보다 더 잘 지원합니다. 나는 이것이 질문에 대한 약간의 접선이라는 것을 알고 있지만, PHP의 힘을 완전히 활용하기위한 기초라고 생각하는 질문에 질문이 있습니다.


2
@Pacerier 괄호없는 것을 의미합니까? ;) cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html
still_dreaming_1

1
그것은 오타입니다. 괄호가 없어야합니다.
Pacerier


4

정의되지 않은 속성의 경고를받지 않고 동적 속성으로 객체 (예 : 자바 스크립트)를 만들려는 경우.

class stdClass {

public function __construct(array $arguments = array()) {
    if (!empty($arguments)) {
        foreach ($arguments as $property => $argument) {
            if(is_numeric($property)):
                $this->{$argument} = null;
            else:
                $this->{$property} = $argument;
            endif;
        }
    }
}

public function __call($method, $arguments) {
    $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
    if (isset($this->{$method}) && is_callable($this->{$method})) {
        return call_user_func_array($this->{$method}, $arguments);
    } else {
        throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
    }
}

public function __get($name){
    if(property_exists($this, $name)):
        return $this->{$name};
    else:
        return $this->{$name} = null;
    endif;
}

public function __set($name, $value) {
    $this->{$name} = $value;
}

}

$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value

$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null

4

이 방법으로 시도 할 수도 있습니다.

<?php
     $obj = json_decode("{}"); 
     var_dump($obj);
?>

산출:

object(stdClass)#1 (0) { }

4

일반 객체를 사용하고 키 값 쌍을 매핑하십시오.

$oVal = new stdClass();
$oVal->key = $value

또는 배열을 객체로 캐스트

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;

3

이 작업을 원하지 않으면 :

$myObj = new stdClass();
$myObj->key_1 = 'Hello';
$myObj->key_2 = 'Dolly';

다음 중 하나를 사용할 수 있습니다.

PHP> = 5.4

$myObj = (object) [
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
];

PHP <5.4

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);

3

반복 예제는 다음과 같습니다.

<?php
$colors = (object)[];
$colors->red = "#F00";
$colors->slateblue = "#6A5ACD";
$colors->orange = "#FFA500";

foreach ($colors as $key => $value) : ?>
    <p style="background-color:<?= $value ?>">
        <?= $key ?> -> <?= $value ?>
    </p>
<?php endforeach; ?>

0

이 좋지만 유용한 기술이 있습니다.

$var = json_decode(json_encode([]), FALSE);

0

stdClass는 기본 PHP 객체입니다. stdClass에는 속성, 메서드 또는 부모가 없습니다. 매직 메소드를 지원하지 않으며 인터페이스를 구현하지 않습니다.

스칼라 또는 배열을 Object로 캐스팅하면 stdClass의 인스턴스가 생성됩니다. 일반 객체 인스턴스가 필요할 때마다 stdClass를 사용할 수 있습니다.

<?php
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null;        // same as above
$z = (object) 'a';         // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');
?>

stdClass는 기본 클래스가 아닙니다! PHP 클래스는 어떤 클래스에서도 자동으로 상속되지 않습니다. 명시 적으로 다른 클래스를 확장하지 않는 한 모든 클래스는 독립형입니다. PHP는 이런 점에서 많은 객체 지향 언어와 다릅니다.

<?php
// CTest does not derive from stdClass
class CTest {
    public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass);            // false
var_dump(is_subclass_of($t, 'stdClass'));    // false
echo get_class($t) . "\n";                   // 'CTest'
echo get_parent_class($t) . "\n";            // false (no parent)
?>

코드에서 'stdClass'라는 클래스를 정의 할 수 없습니다. 이 이름은 이미 시스템에서 사용하고 있습니다. 'Object'라는 클래스를 정의 할 수 있습니다.

stdClass를 확장하는 클래스를 정의 할 수 있지만 stdClass는 아무 것도 수행하지 않으므로 이점이 없습니다.

(PHP 5.2.8에서 테스트)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.