A maneira padrão de criar um objeto "vazio" é:
$oVal = new stdClass();
Mas, com o PHP> = 5.4, eu pessoalmente prefiro usar:
$oVal = (object)[];
É mais curto e, pessoalmente, considero mais claro, porque stdClass pode ser enganoso para programadores iniciantes (ou seja, "Ei, eu quero um objeto, não uma classe!" ...).
O mesmo com o PHP <5.4 é:
$oVal = (object) array();
(object)[]
é equivalente a new stdClass()
.
Veja o manual do PHP ( aqui ):
stdClass : criado digitando o objeto.
e ( aqui ):
Se um objeto é convertido em um objeto, ele não é modificado. Se um valor de qualquer outro tipo for convertido em um objeto, uma nova instância da classe interna stdClass será criada .
No entanto, lembre-se de que vazio ($ oVal) retorna falso , como @PaulP disse:
Objetos sem propriedades não são mais considerados vazios.
Em relação ao seu exemplo, se você escrever:
$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates a Warning here
$oVal->key1->var2 = "something else";
O PHP cria o seguinte aviso, criando implicitamente a propriedade key1
(um objeto em si)
Aviso: Criando Objeto Padrão a partir do Valor Vazio
Isso pode ser um problema se sua configuração (consulte o nível de relatório de erros ) mostrar esse aviso ao navegador. Este é outro tópico inteiro, mas uma abordagem rápida e suja pode estar usando o operador de controle de erros (@) para ignorar o aviso:
$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";
$var = (object) (boolean) (string) (int) (array) new StdClass;
Você sabe, apenas para estar seguro.