[php] PHP에서 빈 값으로 기본 객체를 만드시겠습니까?

PHP 환경을 PHP 5.4 이상으로 업그레이드 한 후에 만이 오류가 나타납니다. 오류는 다음 코드 줄을 가리 킵니다.

오류:

빈 값에서 기본 객체 생성

암호:

$res->success = false;

먼저 $res객체 를 선언해야 합니까?



답변

새로운 환경 에서 PHP 버전 <= 5.3.x 대해 E_STRICT경고가 활성화error_reporting 되었거나 단순히 PHP 버전> = 5.4로 error_reporting설정 되었을 수 있습니다 E_WARNING. 그 때 오류가 트리거 $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_STRICTPHP 5.4 이전의 표준 또는 E_WARNINGPHP> = 5.4 의 일반 오류 수준 을 준수 하려면 전역 네임 스페이스에서 객체 success로 선언해야 합니다.$resstdClass

$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.
}

나중에 사용할 수 있도록 ARRAY of Objects 를 전송 합니다 ~!


답변

이 시도:

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;