Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Guilherme Oderdenge

Calculadora didática - PHP OO

Recommended Posts

Olá, usuários!

 

Eu tive muito trabalho para entender o que era OO em PHP, tive muito trabalho também para entender o conceito de $_POST, $_GET e como receber valores. Demorei também para entender o isset e algumas das sintaxes mais básicas do PHP.

 

Com o tempo, fui me acostumando, e - como leigo - "criei" a calculadora a seguir (que está bem simples, mas é para fins didáticos que eu tenho certeza que fará usuários que, assim como eu, tem [ou tiveram] dificuldades).

 

Não espero que vão gostar, mas estou fazendo a minha (primeira) parte aqui no iMasters.

 

1º- Utilizaremos um FORM (HTML)

       <!-- Método: $_POST | Action em branco porque executaremos na própria página -->
       <form method="post" action="">
           <!-- Input que receberá o primeiro valor a ser calculado -->
           <input type="text" name="v1" placeholder="Valor 1" />

           <!-- Select com o tipo de operação (Somar, Diminuir, Multiplicar ou Dividir -->
           <select name="operacao">
               <option value="soma">+</option>
               <option value="subtrai">-</option>
               <option value="multiplica">*</option>
               <option value="divide">/</option>
           </select>

           <!-- Input que receberá o segundo valor a ser calculado -->
           <input type="text" name="v2" placeholder="Valor 2" />

           <!-- Input que enviará os valores para a função de cálculo -->
           <input type="submit" name="doCalc" value="Calcular" />
       </form>

 

2º- O arquivo .PHP com a função de cálculo

       <?php
       # classe :: Calculadora
       class Calculadora {

           # Função "Calcular" para executar o cálculo dos valores (v1 e v2)
           public function Calcular() {

               # Se for setado algum valor ào submit (doCalc), executa a operação
               if (isset($_POST['doCalc'])) {

                   # Se a operação for soma (value = soma), então...
                   if ($_POST['operacao'] == "soma") {

                       # Armazena a soma de [v1 + v2] na variável $resultado
                       $resultado = $_POST['v1'] + $_POST['v2'];

                       # Exibe a variável $resultado com os valores já somados
                       return $resultado;

                       # Ou então, se a operação não for (value = soma), e sim (value = subtrai) então...
                   } elseif ($_POST['operacao'] == "subtrai") {
                       $resultado = $_POST['v1'] - $_POST['v2'];
                       return $resultado;
                   } elseif ($_POST['operacao'] == 'multiplica') {
                       $resultado = $_POST['v1'] * $_POST['v2'];
                       return $resultado;
                   } elseif ($_POST['operacao'] == 'divide') {
                       $resultado = $_POST['v1'] / $_POST['v2'];
                       return $resultado;
                   }
               }
           }

       }

       # Instancia a classe CALCULADORA()
       $calcular = new Calculadora();

       # Executa a função
       echo $calcular->Calcular();
       ?>

 

E é isso aí.

Sei que tem maneiras mais curtas e objetivas de fazer, MAS para fins didáticos creio que esta "calculadora" responda algumas dúvidas.

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal, eu so acho que você não deveria estar pegando esses dados dessa forma, isso podia ser mais útil não so pra você, como pra outra pessoa, se você passase tais valores via parametros, assim a pessoa poderia obter um resultado de uma conta que possa vir seus valores de vários lugares, um banco de dados, um xml, um resultado de script ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo, obrigado pelo elogio.

 

Andrey, já é de seu conhecimento que minhas experiências com PHP não são avançadas, e, por isso, essa minha "função" é disprovida de recursos. Obrigado.

 

Abraços! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Interessante compartilhar isso, mas porque fez a calculadora dentro de um objeto?

 

eo o objeto não recebe valores, voce apenas definiu uma função dentro dele.

 

acredito que você tenha se equivocado quanto a programação voltado a objetos POO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Guilherme Oderdenge , para melhorar isso.. divida os passos.

 

o teu método Calcular tem muita responsabilidade.

Tem muito codigo e ele faz muita coisa, entendeu ?

 

 

divida o problema em trechos menores e mais reaproveitaveis.

Imagina que sei lá, eu quero agora um método para calcular fatorial.

 

poderia até ser uma chamada recursiva ao método multiplica() entendeu ?

 

 

comece por isso: divida em mais métodos esse teu unico método grande.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz rapidinho uma +/- aqui !

<?php
              class Mathematic{
                       /**
                        * Armazena o resultado de uma operação
                        * @var Array
                        */
                       public $result;
                       /**
                        * Armazena a operação a ser executada
                        * @var String
                        */
                       public $operation = Array( 'Multiplica' => '*', 
                                                  'Divide' => '/',
                                                  'Soma' =>  '+',
                                                  'Subtrai' => '-' );
                       /**
                        * Armazena o operador da operação selecionada
                        * Pode ser reaproveitado, caso o usuario deseje
                        * dar continuação a soma dele, então irá armazenar aqui
                        * o último operador usado 
                        * @var String 
                        */
                       public $operator;
                       /**
                        * Cria uma nova operação matemática
                        * @param String $Operation 
                        * @return Mathematic
                        */
                       public function createOperation( $Operation ){
                              if( array_key_exists( $Operation, $this->operation ) ){
                                  $this->operator = $this->operation[ $Operation ];
                              }
                              return $this;
                       }
                       /**
                        * Cria uma nova operação, liberando
                        * o resultado das contas efetudas
                        * @param String|Integer|Array $Data 
                        * @param String|Integer $Value
                        * @return Mathematic
                        */
                       public function newOperation( $Data, $Value = NULL ){
                              if( is_array( $Data ) ){
                                  foreach( $Data as $index => $value ){
                                     if( preg_match('/^[\w]$/', $index ) ){
                                         throw new InvalidArgumentException( 'Envie apenas numeros' );
                                     }elseif( preg_match( '/^[\w]$/', $value ) ){
                                         throw new InvalidArgumentException( 'Envie apenas numeros' );
                                     }
                                     if( $this->operator == '*' ){
                                         $this->result[] = $index * $value;
                                     }elseif( $this->operator == '/' ){
                                         $this->result[] = $index / $value;
                                     }elseif( $this->operator == '+' ){
                                         $this->result[] = $index + $value;
                                     }elseif( $this->operator == '-' ){
                                         $this->result[] = $index - $value;
                                     }
                                  }
                              }else{
                                 if( preg_match('/^[\w]$/', $Data ) ){
                                         throw new InvalidArgumentException( 'Envie apenas numeros' );
                                 }elseif( preg_match( '/^[\w]$/', $Value ) ){
                                         throw new InvalidArgumentException( 'Envie apenas numeros' );
                                 }
                                 if( $this->operator == '*' ){
                                     $this->result[] = $Data * $Value;
                                 }elseif( $this->operator == '/' ){
                                     $this->result[] = $Data / $Value;
                                 }elseif( $this->operator == '+' ){
                                     $this->result[] = $Data + $Value;
                                 }elseif( $this->operator == '-' ){
                                     $this->result[] = $Data - $Value;
                                 }
                             }
                             return $this;
                       }
                       /**
                        * Retorna a soma de todos os resultados efetuados
                        * nas operações realizadas
                        * @param Boolean $format
                        * @param Integer $decimals
                        * @return Integer
                        */
                       public function getResults( $format = false, $decimals = 2 ){
                              if( !is_array( $this->result ) || sizeOf( $this->result ) == 0){
                                     throw new UnexpectedValueException( 'Nenhuma Operação foi Efetuada' );
                              }else{
                                  if( $format == true ){
                                       for( $i = 0; $i < sizeOf( $this->result ); ++$i ){
                                          $this->result[ $i ] = str_replace( ' ', NULL, number_format( $this->result[ $i ], $decimals, ',', '' ) );
                                       }
                                  }
                              }
                              $result = array_sum( $this->result );
                              unset( $this->result );
                              return $result;
                       }

           }
           echo '<pre>';
           $Mathematic = new Mathematic();
           $Valores = Array( 
                '100' => '100', 
                '20' => '10', 
                '30' => '10' 
           );
           echo $Mathematic->createOperation( 'Multiplica' )->newOperation( 10, 20 )->getResults(), '<br />';
           echo $Mathematic->createOperation( 'Multiplica' )->newOperation( $Valores )->getResults();


?>

 

Saída da primeira operação:

200

Saída da segunda operação:

10500

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Guilherme,

 

Todos agradecemos sua contribuição, é muito legal ver as pessoas compartilhando aquilo que aprendem, parabéns. :clap:

 

Uma dica para melhorar seu código é utilizar a função filter_input_array(), com ela você garantirá que os dados enviados são exatamente aqueles que você espera.

 

Digo isso pois em vários casos você não verifica a existência de um campo e, em uma outra situação (formulários de cadastro, checkout, etc...), isso poderia causar consequências negativas, um exemplo de uso da filter_input_array no caso do seu código:

 

<?php
$postData = filter_input_array( INPUT_POST ,
array(
	'doCalc'	=> FILTER_SANITIZE_ENCODED,
	'operacao'	=> FILTER_SANITIZE_ENCODED,
	'v1'		=> FILTER_VALIDATE_FLOAT,
	'v2'		=> FILTER_VALIDATE_FLOAT,
)
);

if ( is_array( $postData ) ) {
$resposta = 0;
$operacao = null;

switch ( $postData[ 'operacao' ] ) {
	default:
	case 'soma' :
		$resposta = $postData[ 'v1' ] + $postData[ 'v2' ];
		$operacao = '+';
		break;
	case 'subtracao' :
		$resposta = $postData[ 'v1' ] - $postData[ 'v2' ];
		$operacao = '-';
		break;
	case 'multiplicacao' :
		$resposta = $postData[ 'v1' ] * $postData[ 'v2' ];
		$operacao = '*';
		break;
	case 'divisao' :
		$resposta = $postData[ 'v1' ] / $postData[ 'v2' ];
		$operacao = '/';
		break;
}

echo $postData[ 'v1' ] , $operacao , $postData[ 'v2' ] , '=' , $resposta;
}

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Nandel - Pois é, amigo, andei analisando a calculadora e realmente ela não está nada aproveitável. Na verdade, é simplesmente uma função perdida em uma classe. Mas obrigado pelo guia, já estou entendendo melhor como adaptar ela à OO.

 

@William Bruno - Refaço as palavras que fiz para o Nandel, para você. Realmente, pequei em muitos aspectos na calculadora, mas vamos combinar que, além de ser a primeira, ela é didática. Dificilmente começaremos a aprender pelo mais difícil. Mas obrigado - novamente - pelo seu feedbeck. Foi útil. :)

 

@Andrey Knupp - Li, reli e li novamente o seu script e tirei muito proveito dele. Não só pra calculadora, mas pra muitas coisas relacionadas à OO. Só que eu queria realmente saber a função de definir a variável pública "$result" lá na 7ª linha. Poderia me explicar? Não estou questionando o seu uso, mas sim a funcionalidade. Até hoje não entendo o porquê são definidas estas variáveis.

 

@João Batista Neto - Acho que de meus 200 posts, nenhum fora de contribuição ao iMasters, o que fazem o resto dos posts serem totalmente desaproveitáveis, então acho que é melhor eu tomar iniciativas para melhorar a nossa comunidade, né? :P Bom, de qualquer forma - coincidência ou não - estudei a função filter_input e filter_input_array logo hoje, antes de ler o post. Acho que alguém andou iluminando a minha mente, ein? XD Bom, de fato, o filter_input ajuda - e muito - na construção de qualquer material que retorne/receba valores de $_POST/$_GET, e pode acreditar que vou usar muito e muito daqui pra frente. Agora, com relação a calculadora que você tera feito, obrigadíssimo de novo! Já tirei minhas conclusões dela e ela ficou super clean, João, obrigado por contribuir e me ajudar também. Prometo que minha próxima contribuição vai ser mais completa, okay? Hahaha...

 

Abraço! :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso elas são as propriedades, $this corresponde a você ( classe ), ->variavel corresponde, ao nome da propriedade. então se você tem um método por exemplo .. após finalizar toda a leitura de um resultset no banco, você seta uma propriedade, como $results, pra guardar todo o resultado, é então você pode fazer varias coisas .. você tendo todo o resultado de uma consulta SQL em uma váriavel global e de acesso a toda a classe, você pode acessar ela de qualquer método, eu quando não tinha index em uma coluna, pra acelerar as consultas ( indexar o resultado ) eu fazia o seguinte, existe o comando (show table status) que mostra algumas informações das tabelas do banco de dados atual, então nesse resultado retornado pelo show table status, eu verificava se há alguma modificação na tabela, só então consultava novamente o banco de dados, caso não há alguma modificação eu apenas continuo percorrendo esse array

Compartilhar este post


Link para o post
Compartilhar em outros sites

@William Bruno - Refaço as palavras que fiz para o Nandel, para você. Realmente, pequei em muitos aspectos na calculadora, mas vamos combinar que, além de ser a primeira, ela é didática. Dificilmente começaremos a aprender pelo mais difícil. Mas obrigado - novamente - pelo seu feedbeck. Foi útil. :)

a sua iniciativa foi muito válida.

 

Acate as recomendações que fiz, e reescreva.. afinal é assim que aprendemos.

No mais, parabéns pelo estudo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.