¿Crear un objeto predeterminado a partir de un valor vacío en PHP?

Resuelto Paul asked hace 54 años • 18 respuestas

Veo este error sólo después de actualizar mi entorno PHP a PHP 5.4 y posteriores. El error apunta a esta línea de código:

Error:

Creando un objeto predeterminado a partir de un valor vacío

Código:

$res->success = false;

¿Primero necesito declarar mi $resobjeto?

Paul avatar Jan 01 '70 08:01 Paul
Aceptado

Su nuevo entorno puede tener E_STRICTadvertencias habilitadaserror_reporting para versiones de PHP <= 5.3.x, o simplemente haberlas error_reportingconfigurado al menos E_WARNINGcon versiones de PHP >= 5.4. Ese error se activa cuando $resaún NULLno está inicializado:

$res = NULL;
$res->success = false; // Warning: Creating default object from empty value

PHP informará un mensaje de error diferente si $resya está inicializado con algún valor pero no es un objeto:

$res = 33;
$res->success = false; // Warning: Attempt to assign property of non-object

Para cumplir con E_STRICTlos estándares anteriores a PHP 5.4, o el E_WARNINGnivel de error normal en PHP >= 5.4, suponiendo que está intentando crear un objeto genérico y asignarle la propiedad success, debe declararlo $rescomo un objeto stdClassen el espacio de nombres global:

$res = new \stdClass();
$res->success = false;
Michael Berkowski avatar Jan 17 '2012 19:01 Michael Berkowski

Este mensaje ha sido E_STRICTpara PHP <= 5.3. Desde PHP 5.4, desafortunadamente se cambió a E_WARNING. Dado que E_WARNINGlos mensajes son útiles, no conviene desactivarlos por completo.

Para deshacerse de esta advertencia, debe utilizar este código:

if (!isset($res)) 
    $res = new stdClass();

$res->success = false;

Este es un reemplazo totalmente equivalente . Garantiza exactamente lo mismo que PHP está haciendo silenciosamente (desafortunadamente ahora con advertencia): creación implícita de objetos. Siempre debes comprobar si el objeto ya existe, a menos que estés absolutamente seguro de que no es así. El código proporcionado por Michael no es bueno en general, porque en algunos contextos el objeto a veces puede estar definido en el mismo lugar del código, dependiendo de las circunstancias.

Tomas avatar Jan 08 '2014 20:01 Tomas

Simplemente,

    $res = (object)array("success"=>false); // $res->success = bool(false);

O podrías crear instancias de clases con:

    $res = (object)array(); // object(stdClass) -> recommended

    $res = (object)[];      // object(stdClass) -> works too

    $res = new \stdClass(); // object(stdClass) -> old method

y llenar los valores con:

    $res->success = !!0;     // bool(false)

    $res->success = false;   // bool(false)

    $res->success = (bool)0; // bool(false)

Más información: https://www.php.net/manual/en/language.types.object.php#language.types.object.casting

pirs avatar Jan 17 '2016 18:01 pirs

Si coloca el carácter "@" al comienzo de la línea, PHP no muestra ninguna advertencia/aviso para esta línea. Por ejemplo:

$unknownVar[$someStringVariable]->totalcall = 10; // shows a warning message that contains: Creating default object from empty value

Para evitar esta advertencia para esta línea, debe colocar el carácter "@" al comienzo de la línea de esta manera:

@$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

Estoy usando este truco cuando desarrollo. No me gusta desactivar todos los mensajes de advertencia porque si no maneja las advertencias correctamente, se convertirán en un gran error en el futuro.

kodmanyagha avatar Jul 04 '2017 12:07 kodmanyagha