PHP é uma linguagem de paradigma mista, permitindo usar e retornar tipos de dados que não são objetos, como matrizes. Faço uma pergunta para tentar esclarecer algumas diretrizes para a seleção de matrizes versus objetos ao decidir sobre qual construção de programação usar em uma situação específica.
Esta é realmente uma pergunta sobre maneiras de codificar dados usando construções de linguagem PHP e quando é mais provável que uma maneira seja escolhida sobre outra para fins de passagem de dados (por exemplo, Arquitetura Orientada a Serviços ou serviços da Web).
Exemplo
Suponha que você tenha um tipo de item que consiste em {cost, name, part_number, item_count}. Seu programa solicita a exibição de vários tipos de itens, para onde você decide usar uma matriz como um contêiner externo para armazenar cada um dos tipos de itens. [Você também pode usar PHP ArrayObject
para o paradigma OO, mas minha pergunta não é sobre esse array (externo)]. Minha pergunta é sobre como codificar os dados do tipo de item e sobre qual paradigma usar. PHP permite que você use PHP Native Arrays
ou PHP Objects
.
Eu posso codificar esses dados, de duas maneiras aqui, assim:
//PHP's associative arrays:
$ret = array(
0 => array(
'cost' => 10.00,
'name' => 'item1',
'part_number' => 'zyz-100',
'item_count' => 15
),
1 => array(
'cost' => 34.00,
'name' => 'item2',
'part_number' => 'abc-230',
'item_count' => 42
),
);
vs
//here ItemType is encapsulated into an object
$ret = array(
0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);
class ItemType
{
private $price;
private $name;
private $partNumber;
private $itemCount;
function __construct($price, $name, $partNumber, $itemCount) {..}
}
O que eu estou pensando
A codificação de matriz é leve e mais preparada para JSON, mas pode ser mais fácil atrapalhar. Escreva incorretamente uma das chaves associativas da matriz e você poderá ter um erro mais difícil de detectar. Mas também é mais fácil mudar por capricho. Digamos que não queira item_count
mais armazenar , posso usar qualquer software de processamento de texto para remover facilmente todas as item_count
instâncias da matriz e atualizar outras funções que a usem adequadamente. Pode ser um processo mais tedioso, mas é simples.
A codificação orientada a objetos chama os recursos de linguagem IDE e PHP e facilita a detecção de erros com antecedência, mas é mais difícil programar e codificar em primeiro lugar. Digo mais, porque você precisa pensar um pouco sobre seus objetos, pensar adiante, e a codificação OO requer uma carga cognitiva um pouco maior do que digitar estruturas de array. Dito isto, uma vez codificadas, algumas alterações talvez sejam mais fáceis de implementar, de certo modo, que remover item_count
, por exemplo, exigirá a alteração de menos linhas de código. Mas as mudanças em si ainda podem exigir uma carga cognitiva mais alta em comparação com o método de matriz, uma vez que estão envolvidas instalações de OO de nível superior.
Questão
Em alguns casos, é claro, como casos em que precisarei executar manipulações nos dados. Mas, em alguns casos, onde eu preciso armazenar apenas algumas linhas de dados "Tipo de item", não tenho diretrizes ou considerações claras para apoiar ao tentar decidir se deve usar matrizes ou construir objetos. Parece que posso simplesmente jogar uma moeda e escolher uma. É esse o caso aqui?
array
, 2: User-defined Class
, 3: stdClass
. O desempenho em termos de velocidade é praticamente o mesmo ao comparar array
e a User-defined class
(como o seu ItemType
), mas os class
es definidos tendem a usar menos memória do que o array
s. stdClass
por outro lado, é a mais lenta das três opções e também usa mais memória.
(object)['foo'=>'bar']
. O valor resultante tem classeStdClass
, será codificado em JSON por completojson_encode()
e as propriedades podem ser renomeadas tão facilmente quanto os índices da matriz (o que nem sempre é tão fácil, quando é acessado indiretamente por meio de uma variável). No entanto, existem operações diferentes em tais valores; por exemplo, você não possui uniões de objetos como uniões de matriz e não pode usar diretamente asarray_*()
funções.