¿Crear un objeto predeterminado a partir de un valor vacío en PHP?
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 $res
objeto?
Su nuevo entorno puede tener E_STRICT
advertencias habilitadaserror_reporting
para versiones de PHP <= 5.3.x, o simplemente haberlas error_reporting
configurado al menos E_WARNING
con versiones de PHP >= 5.4. Ese error se activa cuando $res
aún NULL
no está inicializado:
$res = NULL;
$res->success = false; // Warning: Creating default object from empty value
PHP informará un mensaje de error diferente si $res
ya 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_STRICT
los estándares anteriores a PHP 5.4, o el E_WARNING
nivel de error normal en PHP >= 5.4, suponiendo que está intentando crear un objeto genérico y asignarle la propiedad success
, debe declararlo $res
como un objeto stdClass
en el espacio de nombres global:
$res = new \stdClass();
$res->success = false;
Este mensaje ha sido E_STRICT
para PHP <= 5.3. Desde PHP 5.4, desafortunadamente se cambió a E_WARNING
. Dado que E_WARNING
los 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.
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
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.