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_STRICT
PHP 5.4 이전의 표준 또는 E_WARNING
PHP> = 5.4 의 일반 오류 수준 을 준수 하려면 전역 네임 스페이스에서 객체 success
로 선언해야 합니다.$res
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.
}
나중에 사용할 수 있도록 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;