PHP의 빈 값에서 기본 개체를 생성하시겠습니까?
PHP 환경을 PHP 5.4 이상으로 업그레이드한 후에만 이 오류가 나타납니다.에러는, 다음의 코드의 행을 나타내고 있습니다.
오류:
빈 값에서 기본 개체 만들기
코드:
$res->success = false;
의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★$res
오브젝트?
에는, 「」가 있는 경우가 .E_STRICT
에서 PHP 버전 <= 5.3.x에 대해 활성화된 경고 또는 단순히error_reporting
으로 E_WARNING
PHP > = 5.4 입니다.는 에러, 에러가 했을 때 합니다.$res
NULL
「 」 「 」 、 「 」
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
가 PHP를 사용했을 경우, 합니다.$res
.
$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object
★★★★★★에 준거하기 E_STRICT
이전 PHP 5.4 이전 표준E_WARNING
> PHP > = 5.4를 하려고 할 )success
$res
of of of stdClass
★★★★★★★★★★★★★★★★★★★★★★★:
$res = new \stdClass();
$res->success = false;
는 「」입니다.E_STRICT
PHP <= 5.3>입니다.PHP 5.4 이후, 운 나쁘게 변경되었습니다.E_WARNING
.부터E_WARNING
메시지는 유용하기 때문에 완전히 비활성화할 수 없습니다.
이 경고를 제거하려면 다음 코드를 사용해야 합니다.
if (!isset($res))
$res = new stdClass();
$res->success = false;
이것은 완전히 동등한 대체품입니다.PHP가 묵시적으로 수행하는 것과 정확히 동일한 작업을 보장합니다(불행하게도 현재 경고가 있습니다). 암묵적인 객체 생성입니다.오브젝트가 이미 존재하는지 여부를 항상 확인해야 합니다.다만, 오브젝트가 존재하지 않는다고 확신할 수 있는 경우는 제외합니다.Michael이 제공한 코드는 일반적으로 좋지 않습니다. 상황에 따라서는 오브젝트가 코드의 동일한 위치에 이미 정의되어 있을 수 있기 때문입니다.
간단하게 말하면
$res = (object)array("success"=>false); // $res->success = bool(false);
또는 다음을 사용하여 클래스를 인스턴스화할 수 있습니다.
$res = (object)array(); // object(stdClass) -> recommended
$res = (object)[]; // object(stdClass) -> works too
$res = new \stdClass(); // object(stdClass) -> old method
값을 채웁니다.
$res->success = !!0; // bool(false)
$res->success = false; // bool(false)
$res->success = (bool)0; // bool(false)
기타 정보 : https://www.php.net/manual/en/language.types.object.php#language.types.object.casting
행의 선두에 「@」자를 입력하면, PHP 에서는 이 행에 대한 경고/통지가 표시되지 않습니다.예를 들어 다음과 같습니다.
$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value
이 행에 대해 이 경고를 방지하려면 행의 시작 부분에 다음과 같이 "@" 문자를 입력해야 합니다.
@$unknownVar[$someStringVariable]->totalcall += 10; // no problem. created a stdClass object that name is $unknownVar[$someStringVariable] and created a properti that name is totalcall, and it's default value is 0.
$unknownVar[$someStringVariable]->totalcall += 10; // you don't need to @ character anymore.
echo $unknownVar[$someStringVariable]->totalcall; // 20
저는 개발할 때 이 기술을 사용하고 있습니다.경고를 제대로 처리하지 않으면 나중에 큰 오류가 되기 때문에 모든 경고 메시지를 비활성화하는 것은 좋아하지 않습니다.
어레이가 있는 경우 이 방법을 시도해 보고 개체를 추가합니다.
$product_details = array();
foreach ($products_in_store as $key => $objects) {
$product_details[$key] = new stdClass(); //the magic
$product_details[$key]->product_id = $objects->id;
//see new object member created on the fly without warning.
}
오브젝트 어레이는 나중에 사용할 수 있도록 송신됩니다.
PHP 7에서는 다음과 같은 방법으로 익명 개체를 만들 수 있습니다.
$res = new class {
public $success = false;
};
https://www.php.net/manual/en/language.oop5.anonymous.php http://sandbox.onlinephpfunctions.com/code/ab774707a8219c0f35bdba49cc84228b580b52ee
먼저 오브젝트 $res = new \stdClass()를 작성해야 합니다.
그런 다음 키와 값을 $res-> success = false로 객체를 할당합니다.
이것을 시험해 보세요.
ini_set('error_reporting', E_STRICT);
저도 비슷한 문제가 있었는데 이걸로 해결된 것 같아요.$res 객체를 클래스로 초기화하기만 하면 됩니다.여기서 클래스 이름이 test라고 가정합니다.
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
변수가 null일 때 Null 병합 연산자를 사용하여 개체를 만들 수 있습니다.
$res = $res ?? new \stdClass();
$res->success = false;
이 오류를 얻는 간단한 방법은 (a)를 입력하는 것입니다. 즉, (b)를 입력하는 것입니다.
(a) $this->my->variable
(b) $this->my_variable
사소하지만 간과하기 쉽고 찾지 않으면 발견하기 어렵다.
변수가 선언되어 있고 유형이 올바른지 확인해야 할 수 있습니다.
if (!isset($res) || !is_object($res)) {
$res = new \stdClass();
// With php7 you also can create an object in several ways.
// Object that implements some interface.
$res = new class implements MyInterface {};
// Object that extends some object.
$res = new class extends MyClass {};
}
$res->success = true;
사용 방법:
$user = (object) null;
API에서 반환된 객체에 변수를 추가하려다 비슷한 문제가 발생하였습니다.포어치 루프로 데이터를 반복하고 있었어요
foreach ( $results as $data ) {
$data->direction = 0;
}
이로 인해 Larabel에서 "빈 값에서 기본 개체 만들기" 예외가 발생했습니다.
아주 작은 잔돈으로 고쳤어요.
foreach ( $results as &$data ) {
$data->direction = 0;
}
단순히 $data를 참조로 만드는 것만으로.
그게 누군가에게 도움이 됐으면 좋겠는데 그게 날 짜증나게 했어!
아니, 너는 하지 않는다.오브젝트에 성공 값을 추가할 때 생성됩니다.기본 클래스는 지정하지 않으면 상속됩니다.
이 문제는 가 시작되지 않은 개체의 인스턴스에 할당되어 있기 때문에 발생합니다.예:
고객님의 경우:
$user->email = 'exy@gmail.com';
솔루션:
$user = new User;
$user->email = 'exy@gmail.com';
이것은 내가 PHP 7에서 직면했던 경고입니다. 이에 대한 간단한 수정은 변수를 사용하기 전에 초기화하는 것입니다.
$myObj=new \stdClass();
초기화하면 오브젝트에 사용할 수 있습니다.
$myObj->mesg ="Welcome back - ".$c_user;
장애가 발생한 PHP 파일의 맨 위에 다음 항목을 표시했더니 오류가 더 이상 표시되지 않습니다.
error_reporting(E_ERROR | E_PARSE);
언급URL : https://stackoverflow.com/questions/8900701/creating-default-object-from-empty-value-in-php
'programing' 카테고리의 다른 글
SQL은 다른 권한을 가진 모든 사용자의 각 권한을 가진 사용자 수를 확인합니다(BITWISE). (0) | 2022.11.30 |
---|---|
"사이에 아무것도"가 없는 관련 행 찾기 (0) | 2022.11.30 |
테이블에서 JSON 값 추출 (0) | 2022.11.30 |
여러 어레이 요소를 설정 해제하는 더 좋은 방법 (0) | 2022.11.30 |
spring @Scheduled 주석이 달린 메서드는 다른 스레드에서 실행됩니까? (0) | 2022.10.31 |