Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;
}
}Como encerra os tópicos??
De uma Pesquisada em Padroes de Projeto, Autoload, PSRs, Composer e S.O.L.I.D
Tô com o artigo bom aqui de padrões de projeto, tô lendo desde ontem.
O meu problema acima era o include_once, mas já até reformulei a estrutura da class.
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!
/applications/core/interface/imageproxy/imageproxy.php?img=http://4.bp.blogspot.com/-i9hRRN-0jAw/T_RX_m3pf_I/AAAAAAAAJEg/btOCZYnB1y4/s1600/Padre%2BQuevedo%2Bisto%2Bnon%2Becziste%2B1.jpg&key=e34b149fbb8070ab72061c8e063ef2c00e60f15a64843b4e34b1929b673257b4" />
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...
>
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.](http://php.net/manual/pt_BR/language.oop5.php)
O que tem dentro disso?
veic_lb_ll.php
Sobre a Registry, que desse um include nela ou use um Autoload
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 2Quanto a Registry, fiz o código acima e dei uma include.
Vou ver como fazer com o Autoload.
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.
Penei, mas resolvi.
Erro besta....