PHP에서 빈 개체를 정의하는 방법
새로운 어레이를 사용하면 다음과 같이 됩니다.
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
객체에 대해 유사한 구문이 있습니까?
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
$x = new stdClass();
설명서의 코멘트가 가장 잘 요약되어 있습니다.
stdClass는 기본 PHP 개체입니다.stdClass에 속성, 메서드 또는 상위 항목이 없습니다.매직 메서드는 지원되지 않으며 인터페이스를 구현하지 않습니다.
스칼라 또는 배열을 개체로 캐스팅하면 stdClass 인스턴스가 생성됩니다.일반 개체 인스턴스가 필요할 때마다 stdClass를 사용할 수 있습니다.
"빈" 개체를 만드는 표준 방법은 다음과 같습니다.
$oVal = new stdClass();
하지만 개인적으로는 다음을 사용하는 것을 선호합니다.
$oVal = (object)[];
stdClass는 초보 프로그래머에게 오해를 불러일으킬 수 있기 때문에(즉, "클래스가 아니라 오브젝트를 원합니다!") 더 짧고 개인적으로 더 명확하다고 생각합니다.
(object)[]
new stdClass()
.
PHP 매뉴얼(여기)을 참조하십시오.
stdClass: 객체에 대한 형식 캐스팅으로 생성됩니다.
또, 이하와 같이 됩니다.
개체가 개체로 변환된 경우 수정되지 않습니다.다른 유형의 값이 객체로 변환되면 stdClass 기본 제공 클래스의 새 인스턴스가 생성됩니다.
(PHP 7.3.0부터)var_export()
.(object)
이제 존재하지 않는 메서드 stdClass를 사용하지 않고 stdClass 개체를 배열 캐스트로 객체((객체) 배열()로 내보냅니다.__setState() 입니다.실제적인 효과는 이제 stdClass를 내보낼 수 있으며, 그 결과 생성된 코드는 이전 버전의 PHP에서도 작동합니다.
단, empty($oVal)는 @PaulP가 말한 것처럼 false를 반환합니다.
속성이 없는 개체는 더 이상 비어 있는 개체로 간주되지 않습니다.
예시에 대해서, 다음과 같이 기입해 주세요.
$oVal = new stdClass();
$oVal->key1->var1 = "something"; // this creates a warning with PHP < 8
// and a fatal error with PHP >=8
$oVal->key1->var2 = "something else";
PHP < 8은하여 PHP < 8 > .key1
자체
경고: 빈 값에서 기본 개체를 만드는 중입니다.
PHP > = 8은 다음 오류를 생성합니다.
치명적인 오류:검출되지 않은 오류:정의되지 않은 상수 "key1"
제 생각에 당신의 최선의 선택은 다음과 같습니다.
$oVal = (object)[
'key1' => (object)[
'var1' => "something",
'var2' => "something else",
],
];
PHP에서는 빈 오브젝트 같은 것은 존재하지 않는다는 것을 지적하고 싶습니다.
$obj = new stdClass();
var_dump(empty($obj)); // bool(false)
물론 $obj는 비어있습니다.
반면 빈 배열은 두 경우 모두 비어 있음을 의미합니다.
$arr = array();
var_dump(empty($arr));
changelog 함수의 인용문이 비어 있습니다.
속성이 없는 개체는 더 이상 비어 있는 개체로 간주되지 않습니다.
단답
$myObj = new stdClass();
// OR
$myObj = (object) [
"foo" => "Foo value",
"bar" => "Bar value"
];
장답
JavaScript에서 익명의 오브젝트를 쉽게 작성할 수 있다는 점이 마음에 듭니다.
//JavaScript
var myObj = {
foo: "Foo value",
bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value
그래서 저는 항상 javascript처럼 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
또한 이 싱탁스를 사용하면 몇 가지 재미있는 놀라움을 발견할 수 있지만 대부분의 경우 잘 작동합니다.
php.net은 이것이 최선이라고 말했다.
$new_empty_object = new stdClass();
, 만약 잊어버린다면.stdClass
function object(){
return new stdClass();
}
다음 작업을 수행할 수 있습니다.
$str='';
$array=array();
$object=object();
하시면 됩니다.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 )
범용 개체를 사용하고 키 값 쌍을 이 개체에 매핑합니다.
$oVal = new stdClass();
$oVal->key = $value
또는 어레이를 객체에 캐스팅합니다.
$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;
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};
정의되지 않은 속성에 대한 경고를 받지 않고 동적 속성을 가진 객체를 만들고 싶은 경우(javascript 등).
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
이 방법으로도 시도해 보세요.
<?php
$obj = json_decode("{}");
var_dump($obj);
?>
출력:
object(stdClass)#1 (0) { }
다른 사람이 지적한 바와 같이 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(성병 클래스)라는 어색한 대문자와 이름을 가진 stdClass보다 외우기 쉽습니다.o 클래스를 커스터마이즈하면 컨스트럭터 구문 대신 o() 함수를 사용할 수 있습니다.값을 반환하는 일반 함수이며, 생성자보다 제한이 적습니다.예를 들어 함수명은 호출 가능한 파라미터를 받아들이는 함수에 문자열로 전달할 수 있습니다.체인을 지원하는 기능도 있습니다.따라서 다음과 같은 작업을 수행할 수 있습니다. $result= o'internal_value)-> some_operation_or_internal_on_this_value();
이는 기본 "언어"가 다른 언어 계층을 구축하기 위한 훌륭한 시작이며, 최상위 계층은 완전한 내부 DSL로 작성됩니다.이것은 lisp 스타일의 개발과 유사하며, PHP는 대부분의 사람들이 인식하는 것보다 훨씬 더 잘 지원합니다.질문에는 다소 접선적인 내용인 것은 알지만, 질문은 PHP의 힘을 충분히 활용하기 위한 기초가 무엇이라고 생각하느냐에 관한 것입니다.
편집/업데이트: 더 이상 권장하지 않습니다.따라서 정적 분석 도구와 IDE 및 사용자 지정 AST 기반 도구가 코드를 이해, 검증, 검색 또는 작성하기 어렵습니다.일반적으로 마술은 툴이 마법을 이해하도록 할 수 있고 표준 커뮤니티 툴도 충분히 이해할 수 있는 표준적인 방법으로 마술을 수행하거나 툴이 고도의 기능을 갖추고 있어 자신의 툴만 사용할 수 있는 경우를 제외하고는 좋지 않습니다.또, 새로운 버전의 PHP에서는, 임의의 오브젝트에 속성을 추가하는 기능을 폐지하고 있는 것 같습니다.특정 버전에서만 동작한다고 생각합니다만, 어쨌든 그 기능을 사용하는 것은 추천하지 않습니다.
이 작업을 수행하지 않으려면 다음을 수행하십시오.
$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',
);
반복의 예를 다음에 나타냅니다.
<?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; ?>
stdClass는 기본 PHP 개체입니다.stdClass에 속성, 메서드 또는 상위 항목이 없습니다.매직 메서드는 지원되지 않으며 인터페이스를 구현하지 않습니다.
스칼라 또는 배열을 개체로 캐스팅하면 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에서 테스트 완료)
다음과 같이 나쁘지만 유용한 기술이 있습니다.
$var = json_decode(json_encode([]), FALSE);
JSON을 구문 분석하여 빈 개체를 가져올 수도 있습니다.
$blankObject= json_decode('{}');
언급URL : https://stackoverflow.com/questions/1434368/how-to-define-an-empty-object-in-php
'programing' 카테고리의 다른 글
왼쪽 조인 표시는 업데이트 가능합니까? (0) | 2022.09.30 |
---|---|
C의 문자열에서 지정된 인덱스의 문자를 제거하려면 어떻게 해야 합니까? (0) | 2022.09.30 |
NumPy 어레이를 단위 벡터로 정규화하는 방법 (0) | 2022.09.30 |
JavaScript를 사용하여 Caps Lock이 켜져 있는지 어떻게 알 수 있습니까? (0) | 2022.09.30 |
Maria DB가 권장하는 RAM, 디스크, 코어 용량 (0) | 2022.09.30 |