O que é stdClass no PHP?

1049

Por favor, defina o que stdClassé.

Keira Nighly
fonte

Respostas:

785

stdClassé a classe vazia genérica do PHP, como Objectem Java ou objectPython ( Edit: mas na verdade não é usada como classe base universal; obrigado @Ciaran por apontar isso ).

É útil para objetos anônimos, propriedades dinâmicas etc.

Uma maneira fácil de considerar o StdClass é como uma alternativa ao array associativo. Veja este exemplo abaixo que mostra como json_decode()permite obter uma instância StdClass ou uma matriz associativa. Além disso, mas não mostrado neste exemplo, SoapClient::__soapCallretorna uma instância StdClass.

<?php
//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);
echo $stdInstance->foo . PHP_EOL; //"bar"
echo $stdInstance->number . PHP_EOL; //42
//Example with associative array
$array = json_decode($json, true);
echo $array['foo'] . PHP_EOL; //"bar"
echo $array['number'] . PHP_EOL; //42

Veja Propriedades dinâmicas no PHP e StdClass para obter mais exemplos.

Alex Martelli
fonte
7
talvez ele tenha usado mysql_fetch_object. que cria uma instância de stdlcass se não estiver enganado.
Galen
69
Não é exatamente uma classe base da maneira que o objeto Java é, veja minha resposta abaixo.
Ciaran McNulty
1
Eu espero que você saiba que objeto não é a classe derivada de "todos" os objetos em Python ... Pelo menos, não até que você é forçado derivar de objeto no Python 3.0
monokrome
11
Acho que as pessoas deveriam dizer que stdClass é algo como a {}construção do JavaScript .
Earth Engine
Senhor, sua resposta está parcialmente incorreta porque o artigo está incorreto. A única coisa (e isso também está errado) que estender essa classe oferece a opção de digitar hint it, ou seja, function(StdClass $a, array $params)vs verificar se $aé objeto e instanceof.
Dejan Marjanovic
1114

stdClassé apenas uma classe 'vazia' genérica usada ao converter outros tipos para objetos. Apesar do que as outras duas respostas dizem, nãostdClass é a classe base para objetos em PHP. Isso pode ser demonstrado facilmente:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

Não acredito que exista um conceito de objeto base em PHP

Ciaran McNulty
fonte
4
std de quê?
Adam Waite
47
std = standard -
Tomas Prado
1
É uma classe de utilidade! Btw este é o comentário real!
Gustav
16
Na verdade, a primeira frase após o trecho de código responde à pergunta.
MauganRa
2
@Miro Markaravanes: Atributos dinâmicos podem ser atribuídos a qualquer classe no PHP, não apenas ao stdClass.
StanE 12/03
95

stdClass é outro ótimo recurso PHP. Você pode criar uma classe PHP anônima. Vamos verificar um exemplo.

$page=new stdClass();
$page->name='Home';
$page->status=1;

Agora pense que você tem outra classe que será inicializada com um objeto de página e executada com base nele.

<?php
class PageShow {

    public $currentpage;

    public function __construct($pageobj)
    {
        $this->currentpage = $pageobj;
    }

    public function show()
    {
        echo $this->currentpage->name;
        $state = ($this->currentpage->status == 1) ? 'Active' : 'Inactive';
        echo 'This is ' . $state . ' page';
    }
}

Agora você precisa criar um novo objeto PageShow com um objeto de página.

Aqui não há necessidade de escrever um novo modelo de classe para isso, você pode simplesmente usar stdClass para criar uma classe em tempo real.

    $pageview=new PageShow($page);
    $pageview->show();
Mrinmoy Ghoshal
fonte
3
uma classe vazia com funções uteis que trabalham com linhas, codificação também a sua melhor padrão
borrel
1
Seria o mesmo que usar array. De fato, STDclass é gerado no momento do tipo malabarismo, como a conversão de matriz em objeto.
varuog
1
Corrija um erro de digitação no seu código: ($ this-> currentpage-> nome == 1) deve ser ($ this-> currentpage-> Status == 1)
enriqe
7
"Você pode criar uma classe PHP anônima" - Não é uma classe anônima . Você pode usar instanceof, get_class, ...
John Smith
2
Esta resposta é particularmente confusa agora que o PHP realmente tem classes anônimas , que são muito diferentes stdClass.
IMSoP 26/03/19
59

Também digno de nota, um stdClassobjeto também pode ser criado a partir do uso json_decode().

mdpatrick
fonte
5
Verdade. Eu freqüentemente uso json_encode e json_decode para converter matriz em objeto em matriz, quando necessário.
pinkal vansia
6
$ x = json_decode (json_encode ($ object), True) decodificará o objeto em uma matriz, mas não é binário seguro. Essencialmente, se não for um texto simples, pode ocorrer uma quebra no JSON.
O Santo
@simontemplar No PHP você não deve escrever True. Booleanos são minúsculos trueou false.
21416 BadHorsie
2
@simontemplar O manual não, mas o PSR-2 , por isso, se você estiver seguindo algum tipo de padrão, ele deve estar em minúsculas. Claro, se você quiser escrever dessa forma, é válido, mas deve seguir os padrões. A documentação manual para booleanos será extremamente antiga, provavelmente escrita antes da formação de padrões. Sejamos honestos, o PHP foi originalmente escrito como uma bagunça completa sem nenhum padrão (veja a ampla variedade de convenções de nomenclatura de variáveis ​​/ funções / objetos usadas). Sinceramente, nunca vi nenhum código PHP em que o desenvolvedor usou seu formato.
BadHorsie
2
Eu sigo o PSR-2, exceto True / False / Null e colocando chaves de abertura em suas próprias linhas para classes. Fora isso, eu simplesmente não me importo. Porém, se alguma vez editar o código de outra pessoa, sigo o padrão que eles estão usando (se houver, geralmente nenhum) e, na falta dele, faça o PSR-2 da maneira "certa". Existe um monte de códigos horríveis por aí com muitos outros problemas de que a capitalização de três palavras-chave é a menor das minhas preocupações.
simontemplar
26

Usando stdClass, você pode criar um novo objeto com suas próprias propriedades. Considere o exemplo a seguir que representa os detalhes de um usuário como uma matriz associativa.

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "[email protected]";

Se você precisar representar os mesmos detalhes que as propriedades de um objeto, poderá usar stdClass como abaixo.

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "[email protected]";

Se você é um desenvolvedor do Joomla, consulte este exemplo nos documentos do Joomla para entender melhor.

Bandula Dharmadasa
fonte
24

Da mesma forma,

$myNewObj->setNewVar = 'newVal'; 

gera um objeto stdClass - convertido automaticamente

Descobri isso hoje com erros ortográficos:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

Legal!

Codinome-Steeve-Knight
fonte
9
Mas isso deve gerar um E_NOTICE
Petah
3
@Petah Apenas no PHP 5.3 ou superior, certo? Mas sim, é uma prática ruim, com certeza.
precisa saber é o seguinte
15

stdClass não é uma classe ou objeto anônimo

As respostas aqui incluem expressões que stdClasssão uma classe anônima ou mesmo objeto anônimo. Não é verdade.

stdClassé apenas uma classe predefinida regular. Você pode verificar isso usando o instanceofoperador ou a função get_class. Nada de especial vai aqui. O PHP usa essa classe ao converter outros valores para o objeto.

Em muitos casos, onde stdClassé usado pelos programadores, a matriz é a melhor opção, devido às funções úteis e ao fato de que este caso de uso representa a estrutura de dados e não um objeto real.

John Smith
fonte
8

Também é importante notar que, ao usar o Casting, você não precisa criar um objeto, como na resposta dada pelo @Bandula. Em vez disso, você pode simplesmente converter sua matriz em um objeto e o stdClass é retornado. Por exemplo:

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again

Antony
fonte
Adoro. Muito mais limpo!
WebSpanner
7

Na verdade, tentei criar stdClass vazio e comparei a velocidade com a classe vazia.

class emp{}

Em seguida, prosseguiu a criação de 1000 stdClasses e emps ... as classes vazias foram realizadas em cerca de 1100 microssegundos, enquanto o stdClasses levou mais de 1700 microssegundos. Acho que é melhor criar sua própria classe fictícia para armazenar dados, se você quiser tanto usar objetos para isso (as matrizes são muito mais rápidas para escrever e ler).

Sábio
fonte
22
aparentemente a diferença é causada pela diferença no tamanho do nome. se você chamar a classe "averylongclassnamefornoapparentreason", levará muito mais tempo para criar. então vai entender.
Sábio
27
Hummm ... otimização prematura. Prefiro encontrar consultas SQL complexas ou outros gargalos de rede se estiver realmente preocupado com a velocidade, em vez de gastar tempo economizando 600 microssegundos. Na verdade, prefiro verificar primeiro se o javascript está no rodapé do que na cabeça do que me importo se um é 600 microssegundos mais rápido que o outro.
Ardee Aram
6
1000 é muito pequeno para uma referência confiável. Tente um bilhão.
rightfold
1
No mundo PHP, quase sempre é melhor usar matrizes.
Vahid Amiri 06/06
^ Definitivamente não é assim. Array inferno é um pesadelo ao trabalhar em equipe em um grande projeto.
precisa
6

Objetos stdClass em uso

O stdClass permite criar classes anônimas e, com a conversão de objetos, você também pode acessar as chaves de uma matriz associativa no estilo OOP. Assim como você acessaria a propriedade regular do objeto.

Exemplo

class Example {

  private $options;

  public function __construct(Array $setup)
  {
    // casting Array to stdClass object
    $this->options = (object) $setup;

    // access stdClass object in oop style - here transform data in OOP style using some custom method or something...
    echo $this->options->{'name'}; // ->{'key'}
    echo $this->options->surname;  // ->key
  }

}

$ob1 = new Example(["name" => "John", "surname" => "Doe"]);

ecoará

John Doe

DevWL
fonte
5

Se você deseja criar rapidamente um novo objeto para armazenar alguns dados sobre um livro. Você faria algo assim:

$book = new stdClass;
$book->title = "Harry Potter and the Prisoner of Azkaban";
$book->author = "J. K. Rowling";
$book->publisher = "Arthur A. Levine Books";
$book->amazon_link = "http://www.amazon.com/dp/0439136369/";

Consulte o site - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ para obter mais detalhes.

Niladri Banerjee - Uttarpara
fonte
4

Lembre-se de que 2 stdClasses vazias não são estritamente iguais. Isso é muito importante ao escrever expectativas de zombaria.

php > $a = new stdClass();
php > $b = new stdClass();
php > var_dump($a === $b);
bool(false)
php > var_dump($a == $b);
bool(true)
php > var_dump($a);
object(stdClass)#1 (0) {
}
php > var_dump($b);
object(stdClass)#2 (0) {
}
php >
jakub wrona
fonte
Porque NÃO é a mesma instância, portanto, não pode ser igual um ao outro. A comparação estrita de classes funciona com a identificação da instância. Cada instância de qualquer classe possui um ID exclusivo.
Bednic
3

O manual do php.net tem algumas explicações e exemplos sólidos, contribuídos pelos usuários sobre o que é stdClass. Eu gosto especialmente deste http://php.net/manual/en/language.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773 .

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ê pode definir uma classe que estenda stdClass, mas não obterá nenhum benefício, pois stdClass não faz nada.

Danijel
fonte
3

é uma maneira pela qual o evite parar de interpretar o script quando houver alguns dados que devem ser colocados em uma classe, mas infelizmente essa classe não foi definida

Exemplo:

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

Aqui, os dados serão colocados nas 'Tarefas' predefinidas. Mas, se fizermos o código como este:

 return $statement->fetchAll(PDO::FETCH_CLASS );

então o colocará os resultados em .

simplesmente diz o seguinte: olha, nós temos um bom KIDS [Objetos] aqui, mas sem os pais. Então, nós os enviaremos para uma creche infantil :)

Nasir Nasrallah
fonte
2

Você também pode usar objectpara converter matrizes em um objeto de sua escolha:

Class Example
{
   public $name;
   public $age;
}

Agora, para criar um objeto do tipo Examplee inicializá-lo, você pode:

$example = new Example();
$example->name = "some name";
$example->age = 22;

OU

$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];

O segundo método é mais útil para inicializar objetos com muitas propriedades.

Vahid Amiri
fonte
1

stClass é uma classe vazia criada pelo próprio php e deve ser usada apenas pelo php, porque não é apenas uma classe "vazia", ​​o php usa stdClass para converter matrizes em estilo de objeto, se você precisar usar o stdClass, recomendo duas opções melhores : 1- use matrizes (muito mais rápido que as classes) 2- crie sua própria classe vazia e use-a

//example 1
$data=array('k1'=>'v1' , 'k2'=>'v2',....);

//example 2
//creating an empty class is faster than instances an stdClass
class data={}
$data=new data();
$data->k1='v1';
$data->k2='v2';

o que faz alguém pensar em usar o estilo de objeto em vez de estilo de matriz ???

Sherif Eldeeb
fonte
0

A razão pela qual temos stdClass é porque, no PHP, não há como distinguir uma matriz normal de uma matriz associada (como em Javascript, você tem {}um objeto e []uma matriz para distingui-los).

Portanto, isso cria um problema para objetos vazios. Veja isso por exemplo.

PHP:

$a = [1, 2, 3]; // this is an array
$b = ['one' => 1, 'two' => 2]; // this is an associate array (aka hash)
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

Vamos supor que você queira codificar JSON a variável $ c

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}

Agora, digamos que você excluiu todas as chaves, $bdeixando-as vazias. Como $bagora está vazio (você excluiu todas as chaves, lembra?), Parece []que pode ser um array ou objeto se você olhar para ele.

Portanto, se você fizer um json_encode novamente, a saída será diferente

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}

Isso é um problema, porque sabemos bque deveria ser uma matriz associada, mas o PHP (ou qualquer função como json_encode) não.

Então o stdClass vem para resgatar. Tomando o mesmo exemplo novamente

$a = [1, 2, 3]; // this is an array
$b = (object) ['one' => 1, 'two' => 2]; // this makes it an stdClass
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

Portanto, agora, mesmo se você excluir todas as chaves $be torná-las vazias, uma vez que é uma stdClass, isso não importará e quando você o codificar em json, obterá o seguinte:

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}

Essa também é a razão pela qual, json_encodee json_decodepor padrão, retorna stdClass.

 $c = json_decode('{"a": [1,2,3], "b": {}}', true); //true to deocde as array
 // $c is now ['a' => [1,2,3], 'b' => []] in PHP
 // if you json_encode($c) again your data is now corrupted
supersan
fonte