Por favor, defina o que stdClass
é.
Por favor, defina o que stdClass
é.
Respostas:
stdClass
é a classe vazia genérica do PHP, como Object
em Java ou object
Python ( 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::__soapCall
retorna 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.
{}
construção do JavaScript .
function(StdClass $a, array $params)
vs verificar se $a
é objeto e instanceof
.
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
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();
stdClass
.
Também digno de nota, um stdClass
objeto também pode ser criado a partir do uso json_decode()
.
True
. Booleanos são minúsculos true
ou false
.
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"] = "smith@nomail.com";
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 = "smith@nomail.com";
Se você é um desenvolvedor do Joomla, consulte este exemplo nos documentos do Joomla para entender melhor.
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!
As respostas aqui incluem expressões que stdClass
sã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 instanceof
operador 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.
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
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).
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.
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
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.
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 >
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.
stdclass é uma maneira pela qual o php 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 php colocará os resultados em stdclass .
simplesmente phpdiz o seguinte: olha, nós temos um bom KIDS [Objetos] aqui, mas sem os pais. Então, nós os enviaremos para uma creche infantilstdclass :)
Você também pode usar object
para converter matrizes em um objeto de sua escolha:
Class Example
{
public $name;
public $age;
}
Agora, para criar um objeto do tipo Example
e 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.
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 ???
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, $b
deixando-as vazias. Como $b
agora 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 b
que 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 $b
e 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_encode
e json_decode
por 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