programing

PHP의 빈 값에서 기본 개체를 생성하시겠습니까?

minecode 2022. 11. 30. 21:23
반응형

PHP의 빈 값에서 기본 개체를 생성하시겠습니까?

PHP 환경을 PHP 5.4 이상으로 업그레이드한 후에만 이 오류가 나타납니다.에러는, 다음의 코드의 행을 나타내고 있습니다.

오류:

빈 값에서 기본 개체 만들기

코드:

$res->success = false;

의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★$res 오브젝트?

에는, 「」가 있는 경우가 .E_STRICT에서 PHP 버전 <= 5.3.x에 대해 활성화된 경고 또는 단순히error_reporting으로 E_WARNINGPHP > = 5.4 입니다.는 에러, 에러가 했을 때 합니다.$resNULL「 」 「 」 、 「 」

$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_STRICTPHP <= 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

  1. 먼저 오브젝트 $res = new \stdClass()를 작성해야 합니다.

  2. 그런 다음 키와 값을 $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;

PHP 익명 클래스를 참조하십시오.

사용 방법:

$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

반응형