Como construir uma classe corretamente com métodos de acesso? – php orientação-a-objetos getters-setters

Pergunta:


Como eu faço para juntar várias variáveis em um único objeto? Como eu arrumo o seguinte código?

<?php
class Produto {
    //Atributos
    var $cpu;
    var $mb;
    var $psu;

    //Getters & Setters
    function setProduto($produto, $produto1){
        $this->cpu = $produto;
        $this->mb = $produto1;
    }


    function getProduto(){
        return $this->cpu;
        return $this->mb;
    } 
}?>

Código para acessar a classe

<?php
include('exibindo_classes.php')
$produto = new Produto();
$produto->setProduto('Core i7 7700', 'Z270');

echo $produto->getProduto();
?>

Autor da pergunta JPFreitas

Resposta Maniero:

Isto está muito errado. Minha sugestão é se concentrar naos fundamentos, em fazer muito bem o procedural, quando ver que tem necessidade e perceber que já domina o básico então pense em OOP que é menos útil do que se fala, ainda menos em PHP, e mais difícil do que parece. Fazer OOP certo é tão difícil fazer que normalmente sai melhor não usar. Claro que há problemas que se beneficiam muito de OOP e em geral pode ser bem útil quando a pessoa já tem bastante experiência em todo o resto.

Por exemplo, lhe falta ainda condições de dar nomes bons para as coisas, o que é algo básico e deve ser dominado antes de fazer OOP.

Quase sempre getters e setters não é uma ideia tão boa em PHP quanto é um Java. Até existem propriedades em PHP que seria um pouco melhor. Vou deixar do jeito que quer, mas já adianto que esta é forma que quase todo mundo faz, porém não é a forma mais correta. E quase todo mundo faz assim porque não aprende corretamente, fica só reproduzindo o que os outros que façam errado também.

É muito difícil fazer OOP certo sem ver o todo, sem conhecer cada detalhe, sem fazer tudo como uma coisa só, o que não tem neste código, mas para dar um passo:

<?php
class Produto {
    private $cpu;
    private $mb;
    private $psu;
    public function __construct($cpu, $mb) {
        $this->cpu = $cpu;
        $this->mb = $mb;
    }
    function getCpu() {
        return $this->cpu;
    } 
    function setCpu($cpu) {
        $this->cpu = cpu;
    } 
    function getMb() {
        return $this->mb;
    } 
    function setMb($mb) {
        $this->mb = mb;
    } 
}

$produto = new Produto('Core i7 7700', 'Z270');
echo $produto->getCpu();
?>

Veja funcionando no ideone. E no Coding Ground. Também coloquei no GitHub para referência futura.

Note que usei um construtor. É assim que se inicia um objeto. Você não tem apenas um getters e um setter para todo o objeto, tem uma para cada atributo. Se forem necessários. Eventualamente um __toString() poderia ser útil, entre outras coisas, mas quase sempre as pessoas usam errado (veja, e mais aqui).

Eu não vejo muito sentido em ficar criando getters e setters em PHP em muitos casos. Claro que vai depender muito do contexto, de como a classe foi projetada e do uso que você pretende fazer das instâncias dela. Às vezes o que você precisa é um simples objeto com propriedades públicas. Por exemplo:

<?php
class Produto {
    public $cpu;
    public $mb;
    public $psu;

    public function __construct($cpu, $mb, $psu) {
        $this->cpu = $cpu;
        $this->mb = $mb;
        $this->psu = $psu;
    }
}

$produto = new Produto('Core i7 7700', 'Z270', '500W');
echo $produto->cpu; // Core i7 7700
$produto->mb = 'Z271';
echo $produto->mb; // Z271

https://ideone.com/aD5cGk

Às vezes nem isso, basta um array associativo:

$produto = [
    'cpu' => 'Core i7 7700',
    'mb' => 'Z270',
    'psu' => '500W'
];

echo $produto['cpu'];
$produto['mb'] = '...';
// ...

não sei se é o q vc esta querendo, mas a função não pode ter varios retornos, então vc pode utilizar arrays. mais ou menos assim:

function getProduto(){
    return array('variavelcpu' => $this->cpu, 'variavelmb' => $this->mb);
} 

Depois vc pode acessar elas assim:

$produtoretorno = $produto->getProduto();
echo $produtoretorno['variavelcpu'];
echo $produtoretorno['variavelmb'];

Pelo que entendi q vc está precisando seria isso, se for alguma outra coisa, tenta dar mais detalhes.

quebrando a cabeça um pouco.. eu cheguei a seguinte conclusão.. e que deu certo por sinal.. só que eu n estou com arquivos separados(a classe em um arquivo separado da exibição)..

<?php
class Produto {
    //Atributos
    private $cpu;
    private $mb;
    private $psu;

    //Getters & Setters
    function setProduto($produto, $produto1, $produto2){
        $this->cpu = $produto;
        $this->mb = $produto1;
        $this->psu = $produto2;
    }


    function getProduto(){
        return $this->cpu;
        return $this->mb;
        return $this->psu;
    } 

    function mostrarProduto(){
        echo $this->cpu .$this->mb .$this->psu;
    }
}

//Exibindo a classe
$produto = new Produto();
$produto->setProduto('Core i7 7700 <br />', 'Z270E STRIX <br />', 'CX750M <br />');
$produto->mostrarProduto();
?>

estou correto em usar dessa forma?? estou fazendo um curso de desenvolvimento WEB.. estou no módulo de Orientação a Objetos em PHP..
Agradeço a toda ajuda que vcs estão me proporcionando.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *