com uma nova matriz eu faço isso:
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
Existe uma sintaxe semelhante para um objeto
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
$var = (object) (boolean) (string) (int) (array) new StdClass;
Você sabe, apenas para estar seguro.Arrays - How to define an empty object in PHP
. Não tem nada a ver com matrizesRespostas:
Um comentário no manual resume melhor:
fonte
stdClass
na minha cabeça como "classe standard"new \stdClass();
Espaço para nome PHP DocstdClass()
da palavraAIDS
?A maneira padrão de criar um objeto "vazio" é:
Mas, com o PHP> = 5.4, eu pessoalmente prefiro usar:
É 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 é:
(object)[]
é equivalente anew stdClass()
.Veja o manual do PHP ( aqui ):
e ( aqui ):
No entanto, lembre-se de que vazio ($ oVal) retorna falso , como @PaulP disse:
Em relação ao seu exemplo, se você escrever:
O PHP cria o seguinte aviso, criando implicitamente a propriedade
key1
(um objeto em si)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:
fonte
stdClass
faz.stdClass
faz. Eu useistdClass
o código que responde à pergunta. Sinto muito, mas não estou criando um novo problema, essa era minha opinião pessoal (como escrevi).(object) []
Quero ressaltar que no PHP não existe um objeto vazio no sentido:
mas é claro que $ obj estará vazio.
Por outro lado, array vazio significa vazio em ambos os casos
Citação da função changelog vazia
fonte
php.net disse que é melhor:
fonte
Eu amo como é fácil criar objetos de tipo anônimo em JavaScript:
Então, eu sempre tento escrever esse tipo de objetos em PHP como o javascript :
Mas como esse é basicamente um array, você não pode fazer coisas como atribuir funções anônimas a uma propriedade, como js faz:
Bem, você pode fazer isso, mas o IMO não é prático / limpo:
Além disso, usando esta sintaxe, você pode encontrar algumas surpresas engraçadas , mas funciona bem na maioria dos casos.
fonte
Além da resposta do zombat, se você continuar esquecendo
stdClass
Agora você pode fazer:
fonte
Você pode usar
new stdClass()
(o que é recomendado):Ou você pode converter uma matriz vazia em um objeto que produz uma nova instância vazia da classe interna stdClass:
Ou você pode converter o
null
valor em um objeto que produz uma nova instância vazia da classe interna stdClass:fonte
para acessar dados em um stdClass da mesma maneira que você faz com uma matriz associativa, basta usar a sintaxe {$ var}.
fonte
Como outros já apontaram, você pode usar stdClass. No entanto, eu acho que é mais limpo sem o (), assim:
No entanto, com base na pergunta, parece que o que você realmente deseja é poder adicionar propriedades a um objeto em tempo real. Você não precisa usar stdClass para isso, embora possa. Realmente você pode usar qualquer classe. Basta criar uma instância de objeto de qualquer classe e começar a definir propriedades. Eu gosto de criar minha própria classe, cujo nome é simplesmente o com algumas funcionalidades estendidas básicas que eu gosto de usar nesses casos e é bom para estender a partir de outras classes. Basicamente, é minha própria classe de objeto base. Também gosto de ter uma função chamada simplesmente o (). Igual a:
Se você não gosta de ter seu próprio tipo de objeto base, pode simplesmente ter o () retornado um novo stdClass. Uma vantagem é que o é mais fácil de lembrar do que stdClass e é mais curto, independentemente de você o usar como nome de classe, nome de função ou ambos. Mesmo se você não tiver nenhum código dentro da sua classe, ainda é mais fácil memorizar do que o stdClass com letras maiúsculas e desajeitadamente (que pode invocar a idéia de uma 'classe de doença sexualmente transmissível'). Se você customizar a classe o, poderá encontrar um uso para a função o () em vez da sintaxe do construtor. É uma função normal que retorna um valor menos limitado que um construtor. Por exemplo, um nome de função pode ser passado como uma sequência para uma função que aceita um parâmetro que pode ser chamado. Uma função também suporta encadeamento. Então você pode fazer algo como:
Este é um ótimo começo para uma "linguagem" básica para criar outras camadas de linguagem, com a camada superior sendo escrita em DSLs internas completas. Isso é semelhante ao estilo lisp de desenvolvimento, e o PHP suporta muito melhor do que a maioria das pessoas imagina. Sei que isso é um pouco tangente para a pergunta, mas a pergunta toca no que eu acho que é a base para utilizar totalmente o poder do PHP.
fonte
Se você deseja criar um objeto (como em javascript) com propriedades dinâmicas, sem receber um aviso de propriedade indefinida.
fonte
Você pode tentar dessa maneira também.
Resultado:
fonte
Use um objeto genérico e mapeie pares de valores-chave para ele.
Ou converter uma matriz em um objeto
fonte
Se você não quiser fazer isso:
Você pode usar um dos seguintes:
PHP> = 5.4
PHP <5.4
fonte
Aqui está um exemplo com a iteração:
fonte
Você tem essa técnica ruim, mas útil:
fonte
stdClass é o objeto PHP padrão. stdClass não possui propriedades, métodos ou pai. Ele não suporta métodos mágicos e não implementa interfaces.
Ao converter um escalar ou matriz como Objeto, você obtém uma instância de stdClass. Você pode usar stdClass sempre que precisar de uma instância de objeto genérica.
stdClass NÃO é uma classe base! As classes PHP não herdam automaticamente de nenhuma classe. Todas as classes são independentes, a menos que estendam explicitamente outra classe. O PHP difere de muitas linguagens orientadas a objetos a esse respeito.
Você não pode definir uma classe chamada 'stdClass' no seu código. Esse nome já é usado pelo sistema. Você pode definir uma classe chamada 'Objeto'.
Você pode definir uma classe que estenda stdClass, mas não obterá nenhum benefício, pois stdClass não faz nada.
(testado no PHP 5.2.8)
fonte