Ir para conteúdo

POWERED BY:

Arquivado

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

Vagabondis

Criando uma Classe que possui um Construtor!

Recommended Posts

Galera,

 

Se tivermos uma classe que contém um construtor que retorna um valor. Caso este valor seja um objeto, como por exemplo uma conexão, isso rá funcionar?

 

Exemplo:

 

class connect_mysql(){

var $con;

 

function connect_mysql(){

this->$con=mysql_connect($db_server,$db_name,$db_psw);

}

 

}

 

Ai na página eu instancio a classe:

 

$obj_con=new connect_mysql();

 

Eu teria nesta ultima variável o objeto de conexão? http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao é bem assim uma classe você abre assim:

 

class nome_da_classe{

 

}

 

e você tem que ter em mente que uma classe de conexao faz o que?

R: ela tenta abrir e fechar uma conexao entao um exemplo simples é assim:

 

class Conexao

{

   var $conexao  = "";

    

function Abrir()

    {   

  @$this->conexao = mysql_connect( "localhost", "usuario", "senha" );

  $this->Selecionar_DB("banco");

}

 

function Selecionar_DB($db)

{

  return isset( $this->conexao ) ? @mysql_select_db( $db ) : false;

}

 

function Fechar()

    {

  return isset($this->conexao ) ? mysql_close($this->conexao) : false; 

    }

}

 

$con = new Conexao();

$con->Abrir();

 

ECA!!! como eu odeio mecher com classe no php4 ,com php5 é bem melhor nem se compara, mas vamos la

esse exemplo é só pra você ter uma noção +- de como deveria ser

e é claro nao iria deixar a classe final assim é só um exemplo

pois depois você pode criar a classe para executar a query extendida da classe conexao

e eu costumo fazer um tratamento de erro personalizado por isso usei @ nao é pra esconder o erro e sim porque vou trata-lo caso tenha erro

se tiver alguma duvida sobre esse exemplo ou outra duvida posta ai

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, desculpe o meu erro de sitaxe na classe, eu coloquei os parênteses sem querer.

 

Bom, o meu ambiente de desenvolvimento está com o PHP5. Estou criando as classes com a ajuda do help online do site do PHP. Meus primeiros resultados positivos foram com as classes para a conexão com o banco:

 

class config_mysql{

var $db_name="teste";

var $db_user="teste";

var $db_psw="teste";

var $db_server="localhost";

}

 

class connect_mysql extends config_mysql{

var $con;

 

function connect_mysql(){

$this->con=mysql_connect($this->db_server,$this->db_user,$this->db_psw);

$this->select_db();

}

 

function select_db(){

mysql_select_db($this->db_name,$this->con);

}

}

 

class query_mysql extends connect_mysql{

var $sql_str;

 

function query_exec(){

return mysql_query($this->sql_str,$this->con);

}

}

 

Ai eu testei o seguinte:

 

$obj_con=new query_mysql;

$obj_con->sql_str="select * from imgs";

$sql_res=$obj_con->query_exec();

echo mysql_num_rows($sql_res);

 

Funcionou beleza!

 

Como você comentou que odeia classes em PHP4, eu gostaria de saber como seria no PHP5 e se estas que eu estou fazendo são PHP4 ou PHP5???

 

Outra dúvida é se eu poderia criar uma propriedade da classe para receber o resultado do SELECT ou é melhor fazer como eu fiz mesmo???

 

Valews!

Compartilhar este post


Link para o post
Compartilhar em outros sites

no php5 nao se usa var e sim, protected, private,public static

 

um exemplo usando o php5 seria +- assim:

PHP
  1. class Conexao
  2. {
  3. protected $mysqli = null;
  4. protected function Abrir()
  5. {
  6. @$this->mysqli = new mysqli( obj_mysqli(0), obj_mysqli(1), obj_mysqli(2), obj_mysqli(3) );
  7. }

  8. protected function Fechar() 
  9.  { 
  10. return isset($this->mysqli) ? $this->mysqli->close() : false;
  11.  } 

  12. private function Checa_Erro()
  13. {
  14. global $erro;
  15. if(mysqli_connect_errno() != 0)
  16. {
  17. $this->Grava_Log(mysqli_connect_errno());
  18. echo $erro[mysqli_connect_errno()];
  19. exit;

  20. elseif($this->mysqli->errno != 0)
  21. {
  22. $this->Grava_Log($this->mysqli->errno);
  23. echo $erro[$this->mysqli->errno];
  24. echo $this->mysqli->error;
  25. exit;
  26. }
  27. }

  28. private function Grava_Log($log)
  29. {
  30. global $erro;
  31. $data = date("d/m/Y H:i");
  32. error_log($data."|". strip_tags($erro[$log])."\n", 3, "erros.log");
  33. }

  34. }

 

obj_mysqli é uma função que eu criei que busca num arquivo de configuração os dados da conexao

 

e eu uso tbm __autoload()

 

isso é só um exemplo simples, mas como você pode ver eu sempre vou debugando o script, abro a conexao e testo se ela esta aberta e sem falha ,caso tenha falha eu mostro uma mensagem de erro personalizada e gravo um log de erro

a $erro pega no arquivo de configuração a lista dos erros possiveis com seu numero e mensagem personalizada

 

mas isso foi só meu exemplo você pode fazer do jeito que quiser só mostrei pra curiosidade

 

OBS:no php5 tem as funções novas para se trabalhar melhor com o mysql entao em vez de usar mysql use mysqli muito melhor, e ainda atende todas as inovações do mysql acima do 4.1,e no mysqli nao se usa mysql_select_db como você pode ver é uma linha só com a conexao,usuario,senha e banco

e nao crie uma class só pra colocar as configurações isso ta errado foje a ideia de orientação a objetos,nao use var

 

qualquer duvida posta ai

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom,

 

Eu entendi o que você exemplificou e até já olhei na documentação do PHP e vi a explicação de Private, Public e Protected.

 

Em relação àquela classe de configuração, a minha idéia é que aquelas informações iriam ficar guardadas em um arquivo texto e eu o acessaria para pegá-las ou alterá-las. Serviria pro caso de ser igual ao XOOPS que nós setamos os parâmetros do banco e ele configura.

 

Não sei se ele guarda as informações em um arquivo texto ou não. Mas na tela de instalação do XOOPS, que via browser, se eu tiver setado as configurações alguma vez mas não concluí a instalação, quando eu acessar denovo ele me traz o que eu setei por ultimo (nome do banco, servidor, usuario).

 

Eu estou utilizando o Apache 2 e o MySql 4.1.7. Para eu usar o mysqli.dll eu devo alterar no arquivo php.ini a linha:

extension=php_mysql.dll

Para

extension=php_mysqli.dll

? :unsure:

 

Eu não entendi:

O que é esse @ no início da linha 6?

E nesta mesma linha, você instanciou o mysqli na protected mysqli???

Nas linhas 23, 25 e 26 onde se lê errno deveria ser erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que entendi agora a tal da função mysqli.Eu li novamente e vi que você mencionou que tens uma função que busca em um arquivo de configuração as informações para a conexão com o banco.Só que esta função não pertence a classe que você mostrou, certo?Ela não pertence a nenhuma outra classe?É apenas uma função e pronto? ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom vamos la, 1 nao se deve guardar informações importantes em arquivo txt porque qualquer um poder ler o conteudo deles

se viu como eu fiz la eu uso um arquivo de configuração .php nele eu guardo toda configuração da conexao e a lista de erros do mysql

 

sobre o errno nao esta errado esta certo se você ver na documentação você vai ver

que errno mostra o numero do erro e error mostra a mensagem de erro dai que funciona meu debugger ele da o numero do erro e dentro do array ja esta minha mensagem personalizada sobre aquele erro

exemplo:

 

$erro[1007] = "SQL: Não foi possivel criar o banco ele ja existe";

$erro[1045] = "Erro de usuario ou senha";

$erro[1049] = "Não foi encontrado o banco de dados";

$erro[1050] = "SQL: Não foi possivel criar a tabela, ela ja existe";

$erro[1054] = "SQL: Esse campo não existe";

$erro[1062] = "Valor duplicado nos campos";

$erro[1064] = "Erro na sintaxe sql";

$erro[1065] = "Erro na sintaxe sql";

$erro[1113] = "SQL: Erro na sintaxe SQl";

$erro[1146] = "Erro na sintaxe sql, a tabela não existe";

 

http://br2.php.net/manual/pt_BR/function.mysqli-errno.php

http://br2.php.net/manual/pt_BR/function.mysqli-error.php

 

e sobre

extension=php_mysql.dll

Para

extension=php_mysqli.dll

nao precisa musar basta acresentar para você poder trabalhar com as duas funções do mysql

 

O que é esse @ no início da linha 6?

E nesta mesma linha, você instanciou o mysqli na protected mysqli???

 

o @ é para ocultar mensagens de erro do php caso tenha, eu faço isso para mudar o tipo de mensagens e nao esconder erros como muitos fazem

e sobre iniciar o mysql como protected é porque ela vai poder ser usada em classes herdeiras como vai ser o seu caso se você criar uma classe de comando para executar a query você vai poder usar a função abrir e fechar da classe conexao

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza, esclareceu legalz a minha dúvida quanto ao mysqli e ao lance de onde guardar os parâmetros para a conexão com o banco.

 

Só não sei ainda o que significa aquela "@"???

 

E se para eu usar o mysqli.dll eu devo alterar no arquivo php.ini a linha:

extension=php_mysql.dll

Para

extension=php_mysqli.dll

?

 

Eu vou testando enquanto você ou outra pessoa não responde!

Valews!

http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao o @ serve para ocutar o erro caso tenha, dai o php nao mostrara a mensagem de erro, e dai você pode criar ou tratar melhor as mensagens de erro leia:

http://br2.php.net/manual/pt_BR/ref.errorfunc.php

 

e eu respondi acima nao precisa apagar a extension=php_mysql.dll

só incluir a extension=php_mysqli.dllficando as duas:

 

extension=php_mysql.dll

extension=php_mysqli.dll

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Fabyo e galera do fórum,

 

Eu tava estudando agora as paradas do mysqli e me deparei com um exemplo lá da documentação que dizia ser "Estilo Orientado a Objetos". Eu criei um teste aqui e ficou assim:

 

PHP

[*]class db extends config_mysql{

[*] public $con;

[*] public $sql_str;

[*]

[*] public function db(){

[*] $this->con=new mysqli($this->db_server,$this->db_user,$this->db_psw,$this->db_name);

[*] }

[*]

[*] public function db_close(){

[*] return isset($this->con) ? $this->con->close() : false;

[*] }

[*]

[*] public function db_query(){

[*] return mysqli_query($this->con,$this->sql_str);

[*] }

[*]

[*] public function db_num_rows(){

[*] $res=$this->con->query($this->sql_str);

[*] return $res->num_rows;

[*] }

[*]}

 

Apesar dessas funções da classe, eu quero me deter apenas nas public function db() e public function db_num_rows().

 

A primeira é um Constructor, autoexecuta ao instanciar a classe.

 

Eu estava testando pegar o número de resultados do SELECT. No modo antigo eu tinha que chamar a public function db_query() dentro da função mysqli_num_rows. Desta forma a documentação PHP dizia ser Estilo Procedural.

 

Foi quando eu vi o outro estilo (Orientado a Objetos). Ai eu remodelei a public function db_num_rows(), mais precisamente apenas a linha 18.

 

Bom, postei aqui intencionando promover um benchmark. Quem se interessar em expressar sua opnião sobre o que eu postei é só mandar ver aqui.

 

Valews!

http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

só umas observações, você ainda esta fazendo uma classe só pra guardar as config da conexao, eu acho que isso nao tem nada haver com orientação a objetos

e foge do que oop te proporciona, outra coisa você tem que analisar porque você escolher um metodo public ou private ou protected

você tem que saber realmente como vai ser a visibilidade dele

e sobre a db_query você precisa passar a query exemplo:

 

public function db_query($query){

return mysqli_query($query);

}

 

mas mesmo assim você criou a $this->con entao você tem que usa-la ficando:

 

public function db_query($query){

return $this->con->query($query);

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

A parte da classe com os parâmetros de configuração é pq ainda não preparei como você indicou, usar um arquivo PHP para guardá-los.Estou só testando, quando eu for criar na véra ai com certeza eu naum vou deixar assim.Eu deixei tudo public por enquanto que estou fazendo testes. Em relação a passagem do parâmetro $query seria para que eu retirasse o public $sql_str;. É melhor que eu passe o parâmetro para a function da classe do que eu tenha uma variável dela para guardar tal informação, certo?E quanto a $this->con é aconselhável utilizar assim ou não?

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.