답변:
새로운 환경 에서 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;
if (!isset($res)) $res = new stdClass();
. 그렇지 않으면이 코드는 "오래된 PHP"암시 적 객체 생성을 대체하는 것이 아닙니다.
이 메시지는 E_STRICT
PHP <= 5.3에 대한 것입니다. PHP 5.4부터 불행하게도로 변경되었습니다 E_WARNING
. E_WARNING
메시지는 유용 하기 때문에 완전히 비활성화하지 않으려 고합니다.
이 경고를 없애려면 다음 코드를 사용해야합니다.
if (!isset($res))
$res = new stdClass();
$res->success = false;
이것은 완전히 동등한 대체품 입니다. PHP가 자동으로 수행하는 것과 똑같은 일을 보장합니다-불행히도 경고와 함께 암시 적 객체 생성. 개체가 존재하지 않는지 확실하지 않으면 개체가 이미 존재하는지 항상 확인해야합니다. Michael이 제공하는 코드는 일반적으로 좋지 않습니다. 일부 상황에서는 개체가 상황에 따라 코드의 동일한 위치에 이미 정의되어있을 수 있기 때문입니다.
Undefined variable: res
.
간단히,
$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
$this->route->uri = new stdClass();
나를 위해 작동하지 않지만 여전히 경고가 있습니다. 참고 : $this->route
기존입니다.
"@"문자를 줄의 시작 부분에 넣으면 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);
E_STRICT
는 치명적 오류에 대한 메시지 억제를 포함하여 오류를 제외한 모든 오류보고를 비활성화 합니다. 그것은이 특별한 경고를 해결하기위한 합리적인 제안이 아니며, 더 중요한 것은 당신이 거의 원하지 않는 것입니다. 왜 5 명이 이것을 찬성했는지 모르겠습니다.
ini_set('error_reporting', -1);
디버깅 하는 동안 사용 하지만 위와 같이 사용하지 마십시오.
비슷한 문제가 있었는데 문제가 해결 된 것 같습니다. $ res 객체를 클래스로 초기화하면됩니다. 여기서 클래스 이름이 test라고 가정하십시오.
class test
{
//You can keep the class empty or declare your success variable here
}
$res = new test();
$res->success = false;
이 문제점은 시작되지 않은 오브젝트 인스턴스에 지정하기 때문에 발생합니다. 예를 들어 :
너의 경우:
$user->email = 'exy@gmail.com';
해결책:
$user = new User;
$user->email = 'exy@gmail.com';
이 오류를 얻는 간단한 방법은 아래 (a)를 입력하는 것입니다.
(ㅏ) $this->my->variable
(비) $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 익명 클래스를 참조하십시오 .
API에서 반환 된 객체에 변수를 추가하려고 할 때 비슷한 문제가 발생했습니다. foreach 루프를 사용하여 데이터를 반복하고있었습니다.
foreach ( $results as $data ) {
$data->direction = 0;
}
Laravel에서 "빈 값으로 기본 객체 생성"예외가 발생했습니다.
나는 아주 작은 변화로 그것을 고쳤다.
foreach ( $results as &$data ) {
$data->direction = 0;
}
단순히 $ data를 참조로 만들어서.
나는 누군가에게 도움이되기를 바랍니다.
아니요 .. 개체에 성공 값을 추가하면 생성됩니다. 기본 클래스는 지정하지 않으면 상속됩니다.
$res
합니까?