Ir para conteúdo

Arquivado

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

Ericsson Berg

Class - Problema na segunda chamada da função

Recommended Posts

Boa tarde, galera!!

 

Tô com um problema na chamada da segunda função de uma class.

 

As functions trazem consultas do banco de dados, assim, em uma consulta eu terei que trazer dois arrays, então dentro da classe Veículos criei 

uma função base para chamar as duas função que trarão o resultado dos Selects, porém somente a primeira função traz resultado, a segunda somente funciona

se eu omitir a primeira, deve ser algo em relação a conexão, segue o código:

 

class Veiculos
{
        public function veic_lb_ll() 
		{

             $dados1 = Veiculos::query1();   
             $dados2 = Veiculos::query2();
             Retorno_consulta::formatResults($dados2); //Esta parte é só para demonstrar        
        }  
	public static function query1()
	{
            include_once('veiculos/veic_lb_ll.php'); //Este include traz a query   = armazena em $sql        
            $dados1 = Conexao::oracle($sql);
            return  $dados1;
	}
	public static function query2()
	{
            include_once('veiculos/veic_lb_ll.php');  //Este include traz a mesma query para teste         
            $dados2 = Conexao::oracle($sql);
            return  $dados2;
	}
      
}
//Classe de Conexão com o Banco de Dados
class Conexao{
    
    public static function oracle()
    {  
        $conn = oci_connect(DB_USER, DB_PASSWORD, DB_HOST) or die ("Conexão com o banco Falhou!");
        $statement = oci_parse($conn,$sql);
        oci_execute($statement);
        oci_close($conn);   
        //Criar um array
        $dados = array();
        //Transfere os dados para o array
        $x=0;                
        while (($row = oci_fetch_object($statement)) != false){
                $x++;
                $dados[$x] = $row;
        }
        oci_free_statement($statement);

        return $dados;
    }
    
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

De uma Pesquisada em Padroes de Projeto, Autoload, PSRs, Composer e S.O.L.I.D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo que esta começando os estudos com OOP, mas Oo é mais parecido com o mundo real do que imaginamos, tentar desacoplar o máximo possível é fundamental.

 

Sua conexão é estática, mas é problemática, se pelo menos fosse uma singleton ja resolveria, pois usaria uma unica instancia. E tem um while ali que não entendi.

 

Bom minha dica é, use registry para criar sua conexão, com resgistry você já tem o pattern singleton implementadoo e pode add quantas classes e conexões quiser.

Aqui tem um exemplo de uso.
https://github.com/wsduarte/php.registry

 

E tire aqueles include_onces dentro dos objetos!

Padre+Quevedo+isto+non+ecziste+1.jpg

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

kkkkkk, tirei o include_once mas deixei o include, porque traz as variáveis com o Select, achei a melhor forma de utilizar.

class Veiculos
{
    
    public function veic_lb_ll($requisicao)
        {
            include('veiculos/veic_lb_ll.php'); //Inclusão das querys
            $dados1 = $this->query1($sql1);  //Realiza o Select 1
            $dados2 = $this->query2($sql2);  //Realiza o Select 2
            $dados = array($dados1,$dados2);  //Cria array dos resultados

            Retorno_requisicao::formatResults($dados); //Devolve resultado da requisição criptografada       
        } 
}

.................................................................................

 

Então, tô tentando usar o Registry, mas estou tendo problemas para instanciar, se poder tirar uma dúvida no código. agradeço.

 

<?php

$ora_bd = "
    (DESCRIPTION=
                (ADDRESS_LIST=
                      (ADDRESS=(PROTOCOL=TCP) 
                        (HOST=10.0.00.000)(PORT=000)
                      )
                )
    (CONNECT_DATA=(SERVICE_NAME=SMAFF))  
)";
//Página do registry

// Hostname
define ( 'DB_HOST', $ora_bd);
// Username
define ( 'DB_USER', 'imasters' );
// Password
define ( 'DB_PASSWORD', 'im****' );
// Databse Name
define ( 'DB_DB', 'IMASTERS' );

class Registry{
    /**
     * Conjunto de dados
     * @var instanceof ArrayObject
    */
    private $data;
 
    /**
     * Aqui ficará a instancia do próprio objeto
     * @var instanceof self
    */
    private static $instance;
 
    /**
     * Private para não permitir ser instanciado
    */
    private function __construct(){ $this->connections = new ArrayObject; }
 
    /**
     * Cria a instancia do objeto
     * @return instanceof Registry
    */
    public static function getInstance(){
        if( !( self::$instance instanceof Registry ) ){
            self::$instance = new Registry;
        }
 
        return self::$instance;
    }
 
    /**
     * Adiciona um dado ao Registry
     * @param $key Nome para reconhecimento de determinado registro
     * @param $value Registro
     * @throws InvalidArumentException Caso a key já tenha sido adicionada
    */
    public function addElement( $key, $value ){
        if( $this->data->offsetExists( $key ) ){
            throw new InvalidArgumentException( sprintf( '"%s" have already added', $key ) );
        }
 
        $this->data->offsetSet( $key, $value );
    }
 
    /**
     * Remove um dado do Registry
     * @param $key O nome relacionado ao registro
     * $throws InvalidArgumentExcpeiton Caso o nome não esteja associado a algum registro
    */
    public function removeElement( $key ){
        if( !$this->data->offsetExists( $key ) ){
            throw new InvalidArgumentException( sprintf( '"%s" not found', $key ) );
        }
 
        $this->data->offsetUnset( $key );
    }
 
    /**
     * Retorna um registro
     * @param $key Nome de registro do elemento
     * @return Algum valor registrado
     * $throws InvalidArgumentExcpeiton Caso o nome não esteja associado a algum registro
    */
    public function getElement( $key ){
        if( !$this->data->offsetExists( $key ) ){
            throw new InvalidArgumentException( sprintf( '"%s" not found', $key ) );
        }
 
        return $this->data->offsetGet( $key );
    }
 
    /**
     * Retorna se um determinado nome de registro existe
     * @param $key Nome de registro do elemento
     * @return bool
    */
    public function existsElement( $key ){
        return $this->data->offsetExists( $key );
    }
}
       

$registry = Registry::getInstance();    
 
$connection = oci_connect(DB_USER, DB_PASSWORD, DB_HOST); 

//***************************/ O problema começar aqui e o código buga....
$registry->addElement( 'connection_1', $connection );    
																	
$registry = Registry::getInstance();
 
$connection = 'connection_1';
 
if( $registry->existsElement( $connection ) ){
    $oracle = $registry->getElement( 'connection_1' );//Ou connection_2
}

E já li algumas coisas e mexi e remexi código, mas sem êxito...

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 horas atrás, Ericsson Berg disse:

kkkkkk, tirei o include_once mas deixei o include, porque traz as variáveis com o Select, achei a melhor forma de utilizar.

Não existe oque você está fazendo, seja com require, include ou require_once.

 

O problema é que você está querendo usar o paradigma procedural inteiro dentro de classes, achando que isso é programar em OOP, apesar do PHP ser hibrida, tem que saber separar os conceitos.

 

O que tem dentro disso?

veic_lb_ll.php

Sobre a Registry, que desse um include nela ou use um Autoload

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dentro de veic_lb_ll.php tem as querys;

 

$sql1 = "Select query 1";

$sql2 = "Select query 2";

[...]         
include('veiculos/veic_lb_ll.php'); //Inclusão das querys
$dados1 = $this->query1($sql1);  //Realiza o Select 1
$dados2 = $this->query2($sql2);  //Realiza o Select 2
[...]    

Quanto a Registry, fiz o código acima e dei uma include.

Vou ver como fazer com o Autoload.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas pra isso não precisa de include, você pode montar o select na própria classe veículos.

E deixar o construtor de Query fora da classe de conexão e, para usar na classe Veículos, é só instanciar através do construtor. Já que é uma abstração e não uma implementação. 

 

Um exemplo simples:

 

/**
 * Class Veiculos
 */
class Veiculos
{

    /**
     * @var QueryBuilder
     */
    protected $builder;

    /**
     * Veiculos constructor.
     */
    public function __construct()
    {
        $this->builder = new QueryBuilder();
    }


    /**
     * @return object
     */
    public function queryFoo()
    {

        $sql = "SELECT * FROM foo WHERE .......LIMIT 1";

        return $this->builder->query( $sql );

    }

    /**
     * @return object
     */
    public function queryBar()
    {

        $sql = "SELECT * FROM bar WHERE ....... ORDER BY ASC";

        return $this->builder->query( $sql );

    }

}

 

 

QueryBuilder

require_once 'registry.php';

/**
 * Class QueryBuilder
 */
Class QueryBuilder {


    /**
     * @var
     */
    private $conn;

    /**
     * QueryBuilder constructor.
     */
    public function __construct()
    {
        $this->conn =  registry::getInstance()->get('nome_da_conexao');
    }

    /**
     * @param $sql
     * @return object
     */
    public function query($sql)
    {
        $statement = oci_parse($this->conn,$sql);
        oci_execute($statement);
        $data = oci_fetch_object($statement);
        oci_free_statement($statement);
        return $data;
    }

}

Lembrando que o arquivo de conexão não tem nada haver com essas duas classes acima, você tem que criar separadamente. 

Uma dica é usar inversão de dependência e, injetar, mas pra quem  já ta apanhando, seria meio complexo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por mateus.andriollo
      Boa tarde,
      Tenho alguns campos numéricos q ao fazer uma select gostaria q retornasse uma legenda
       
      exemplo:
      Status: 0=Inativo / 1=Ativo Condição: 1=Funcionando / 2=Em manutenção / 3=Manutenção Interna   
      Seria algo assim, tenho varias tabelas com estes campos... mas tenho q ficar usando replace.
      Existe uma forma de criar uma função para isso? Nem q na função eu tenha que setar nome do campo, ficando assim:
      Legenda('Status',cadastro.status) 
    • Por Luiz Henrique
      Olá pessoas,
       
      Tenho uma classe e dentro dela várias chamadas para métodos de acordo com a necessidade em outra classe (para obter dados DB), como são muitas e vou duplicar os arquivos, para ganhar tempo queria colocar o nome da classe em uma variável porém não funciona.
       
      use Class1; class Class2 { public $className = 'Class1'; ... $dados = $this->className::function(); // não funciona } Era para gerar isso:
      $dados = Class1::function();
      Se eu der um echo $this->$className, ele me retorno o nome da Class1 porém para executar um método dentro da Class1 não vai, diz que a classe Class1 não existe!
      Tem alguma forma de funcionar isso?
       
      Obrigado.
    • Por ernestovm
      Bom dia.
      Descobri, depois de muito trabalho, um problema esquisito. Tenho duas imagens que chamam funções JavaScript determinadas. Uma funciona e a outra não. Isso no Firefox. No Chrome as duas funcionam perfeitamente. Alguém conhece alguma gambiarra para fazer o Firefox funcionar? Segue os códigos:
      HTML:
      <img src="images/ic_abrir.png" width="70" height="70" onClick="abre_notificacao(<? echo "'".$us_codigo."','".$item."'"; ?>);" style="cursor:pointer" id="p_imagem-<? echo $item; ?>" name="p_imagem-<? echo $item; ?>">
       <img src="images/ic_excluir.png" width="70" height="70" onClick="excluir_notificacao(<? echo "'".$us_codigo."'"; ?>);" style="cursor:pointer">
      JAVASCRIPT:
      <script type="text/javascript">
          function abre_notificacao(codigo,indice) {
              $("#p_imagem-"+indice).attr("src","images/ic_abrir_ok.png");
              $("#ver-"+indice).css("display", "block");
          }
          function excluir_notificacao(codigo) {
              $.post("excluir_notificacao.php", {codigo: codigo}, function(resposta) {
                  confirm(resposta+" ("+codigo+")");
              });
              location.reload();
          }

      </script>
      A Função abre_notificacao(codigo,indice)  funciona perfeitamente nos dois browsers.
      A Função excluir_notificacao(codigo) só funciona no Chrome.
      Obrigado pela luz
    • Por unset
      Olá, estou começando a usar o twig template e estou com uma dúvida e não encontrei a resposta também não sei se é possível mais espero que seja possível
       
      Bom eu tenho um arquivo com várias funções, como eu faço para chamar essas funções no HTML?
       
      Não funciona assim {{ funcao() }}
    • Por Luiz Henrique
      Olá,
      Existe alguma forma de executar a função dentro da mesma?
      EX:
       
      function pai(){
          pai();
      }
       
      Obrigado.
×

Informação importante

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