Ir para conteúdo

POWERED BY:

Arquivado

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

Douglas

Classes PHP

Recommended Posts

Muito bom esse materia Prog.

 

Mais algumas dúvidas.. Imagem Postada

 

Nessa classe que o Fabyo postou da conexão com banco de dados extendida com a biblioteca mysqli. Estava fuçando, para ver como funciona. (Depois de alguns milhões de requisições ao meu apache local, consegui fazer alguma coisa).

 

1. No momento em que se usa o parent::, em uma classe extendida (exemplo: mysqli), o parent:: corresponde a mysqli, ou seja a biblioteca extendida?

 

2. E quando a classe não está extendida, o que acontece com o parent::?

 

3. Os metódos mágicos do PHP, __construct, __destruct, etc. Usam visibilidade (private, protect, etc)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmmmm...

 

parent:

Mesmo que super em Java, este referencia-se a super classe daquele objeto, ou seja, a classe extendida. Quando a classe não extende ninguém, este objeto simplesmente não existe.

 

Construtores e Destrutores:

Comumente utiliza-se visibilidade public, se não declarar nenhuma, fica implicito que é um método público.

 

Mais um texto relacionado a OO:

http://www.javafree.org/content/view.jf?idContent=86

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo..No livro fala sobre super em Java, vou dar uma repassada, para entender melhor.O que acontece quando eu herdo (extends) uma classe que contém esses metódos (funções) com nomes mágicos? Funciona tudo normal?As variáveis que eu irei trabalhar dentro da classe. Quando eu devo declarar elas fora dos metódos?// vou ler essa referência.. valeu..

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que acontece quando eu herdo (extends) uma classe que contém esses metódos (funções) com nomes mágicos? Funciona tudo normal?

 

Bem, quando você herda uma classe que tem métodos __construct e __destruct estas deixam de existir na classe herdada, você pode criar novos construtores e destrutores, com isto você escreve o código específico para o comportamento deste novo objeto.

 

Exemplo:

class SerHumano { ... }

class Homem extends SerHumano { ... }

class Mulher extends SerHumano { ... }

 

Os objetos Homem e Mulher são diferentes, então, possuem seus construtores e destrutores próprios.

 

As variáveis que eu irei trabalhar dentro da classe. Quando eu devo declarar elas fora dos metódos?

 

As variáveis de fora do método são as propriedades de comportamento do objeto e as de dentro do método são variáveis auxiliares para aquele método exclusivamente, como uma variável de controle de um for, ou coisa parecida.

 

Melhorou ou complicou?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhorou, pois estou tirando todas as dúvidas!

 

Olhando a documentação do PHP, me deparei com Indução de Tipo (http://www.php.net/manual/pt_BR/language.oop5.typehinting.php).

 

Essa indução de tipo, funciona como uma herança, só que para variáveis, sem precisar externder uma classe? Funciona com metódos (funções) também?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse lance do self eu num sei qual é não.

 

Quanto a "indução de tipos" (eu nunca tinha ouvido esse termo, em Java isso é normal), você cria um método que vai receber como parametro um outro objeto. Gosto de dar exemplos: Imagem Postada

<?phpclass Aluno {   private $nome;   private $matricula;   function __construct($nome, $matricula) {	  $this->nome = $nome;	  $this->matricula = $matricula;   }      function setNome($nome) {	  $this->nome = $nome;   }   function setMatricula($matricula) {	  $this->matricula = $matricula;   }   function getNome() {	  return $this->nome;   }   function getMatricula() {	  return $this->matricula;   }}class Escola {   private $matriculados;      function matricular(Aluno $aluno) {	  $this->matriculados[] = $aluno;    }   function getAluno($matricula) {	  if (count($this->matriculados) > 0) {		 foreach($this->matriculados as $key => $value) {			if ($matricula==$this->matriculados[$key]->getMatricula())			   return $this->matriculados[$key]->getNome();		 }	  } else {		 return "Nenhum aluno encontrado.";	  }   }}$minhaEscola = new Escola();$minhaEscola->matricular(new Aluno('Felipe',1));$minhaEscola->matricular(new Aluno('Douglas',2));$minhaEscola->matricular(new Aluno('Adriano',3));$minhaEscola->matricular(new Aluno('Fabyo',4));echo $minhaEscola->getAluno(2);?>
É mais ou menos isso ae, não sei se consegui explicar direito.

 

Mais um pra galera ler:

http://www.clubedolinux.com.br/docs/php5.pdf

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posso estar enganado, mas o self::, seria para acessar variáveis e constantes que ficam fora dos metódos.Funcionaria como um parent:: mas para a classe atual.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa... fiz uma pequena alteração na classe, apenas para ficar mais parecida com um problema tratado no mundo real:

 

As alterações são simples, na classe Escola, eu fazia ele retornar diretamente o nome do aluno, mas o comportamento da classe ficaria melhor ela retornando um objeto Aluno, aí sim resgatando o nome do mesmo. Aproveitei tb para dar uma melhorada em alguns detalhes. Imagem Postada

<?phpclass Aluno {   private $nome;   private $matricula;   function __construct($nome, $matricula) {	  $this->nome = $nome;	  $this->matricula = $matricula;   }      function setNome($nome) {	  $this->nome = $nome;   }   function setMatricula($matricula) {	  $this->matricula = $matricula;   }   function getNome() {	  return $this->nome;   }   function getMatricula() {	  return $this->matricula;   }}class Escola {   private $matriculados;      function matricular(Aluno $aluno) {	  $this->matriculados[] = $aluno;    }   function getAluno($matricula) {	  if (count($this->matriculados) > 0) {		 foreach($this->matriculados as $objeto) {			if ($matricula==$objeto->getMatricula())			   return $objeto;		 }	  } else {		 return "Nenhum aluno encontrado.";	  }   }}$minhaEscola = new Escola();$minhaEscola->matricular(new Aluno('Felipe',1));$minhaEscola->matricular(new Aluno('Douglas',2));$minhaEscola->matricular(new Aluno('Adriano',3));$minhaEscola->matricular(new Aluno('Fabyo',4));$objAluno = $minhaEscola->getAluno(2);echo $objAluno->getNome();?>
Coloquei outras manipulações da classe, para um melhor entendimento de como a coisa funciona.

 

$minhaEscola = new Escola();$minhaEscola->matricular(new Aluno('Felipe',1));$minhaEscola->matricular(new Aluno('Douglas',2));$minhaEscola->matricular(new Aluno('Adriano',3));$minhaEscola->matricular(new Aluno('Fabyo',4));$objAluno = $minhaEscola->getAluno(2);echo $objAluno->getNome()."<br>";$objAluno = $minhaEscola->getAluno(3);echo $objAluno->getNome()."<br>";echo $objAluno->setNome('Adriano Alves');$objAluno = $minhaEscola->getAluno(1);echo $objAluno->getNome()."<br>";$objAluno = $minhaEscola->getAluno(3);echo $objAluno->getNome()."<br>";

Compartilhar este post


Link para o post
Compartilhar em outros sites

$minhaEscola = new Escola();$minhaEscola->matricular(new Aluno('Felipe',1));$minhaEscola->matricular(new Aluno('Douglas',2));$minhaEscola->matricular(new Aluno('Adriano',3));$minhaEscola->matricular(new Aluno('Fabyo',4));

Dessa forma você estaria seguindo o Pattern DAO x VO, correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem... neste exemplo não estou usando nenhuma camada de persistência (armazenamento de dados), então não da pra dizer que estaria usando DAO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, digo na forma de "representar". Passar o objeto para outro classe na instanciação, que terá o trabalho de armazenar, etc.Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eclesiades...

 

Na verdade, eu não sei se usei algum padrão. Imagem Postada

Em Java costuma-se fazer isto o tempo todo e não nos importamos diretamente se estamos usando algum padrão de projeto quanto fazemos isto, é meio que intuitivo.

 

Quando falamos em padrões de projeto, em Java, falamos de MVC, Singleton, Façade, etc. Acredito que deveria ser assim também em PHP, as pessoas se acostumaram a desenvolver estruturado, não que isto seja errado, mas cria maus hábitos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmm!Ótimo. No Manual do PHP na parte de php5/OOP já vem dando uma introdução. Aborda o uso do Singleton também, etc.Obrigado pela resposta. =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom galera, estou meio que entrando de ganso nesse tópico pq eu ja aprendi muito com ele e gostaria de esclarecer algumas dúvidas com relação a OO também, na realidade, são duas dúvidas.

 

Primeira, eu baixei um script na internet, que é uma classe para conectar com o banco de dados mysql, e gostaria de umas dicas com relação a mesma, eis a classe:

 

<?  * Desc  : Objeto para se conectar com o banco de dados mysql  Class ConexaoMysql  {  ////////////////Atributos da class//////////////////  var $servidor="localhost";  var $usuario="root";  var $senha="";  var $banco="dbname";  var $query="";  var $link="";    ////////////////Metodos da classe///////////////  // Metodo Contrutor  function ConexaoMysql()  {  $this->conexao();  }    // Metodo conexao com o banco  function conexao()  {  $this->link = mysql_connect($this->servidor,$this->usuario,$this->senha);  if (!$this->link) {  die("Error na conexao");  } elseif (!mysql_select_db($this->banco,$this->link)) {  die("Error na conexao");  }  }    // Metodo sql  function sql($query)  {  $this->query = $query;  if ($result = mysql_query($this->query,$this->link)) {  return $result;  } else {  return 0;  }  }    // Metodo que retorna o ultimo id de um inserção  function id()  {  return mysql_insert_id($this->link);  }    // Metodo fechar conexao  function fechar()  {  return mysql_close($this->link);  }  }  /////////////////FIM DA CLASSE////////////////  ?>
a minha dúvida é com relação à como utiliza-la para fazer uma consulta, ou até mesmo, para conectar com o banco de dados. Bom, instanciar um objeto de uma classe eu sei, tenho dificuldade em chamar funções passando os parametros da forma correta, mesmo com a leitura dos posts, eu ainda não consegui utilizar essa classe direito.

 

Uma outra dúvida, é ... que futuramente, eu pretendo desenvolver um sistema de CRM para empresa aonde eu trabalho em php5, existe a possibilidade de criá-lo totalmente OO, ou algumas rotinas deverão ser procedural.

 

Ps.: Para quem desconhece, CRM é um sistema de relacionamento com clientes, aonde é possivel abrir ocorrencias, responder ocorrencias, emitir relatórios, fazer vários tipos de consultas e etc.

 

Grato!

 

-------

 

<edit>

 

Eu vi um comentário aonde o autor diz, que em projetos grandes, com várias queries, esse tipo de classe não deve ser utilizada pois complica o entendimento, mas eu não consegui entender o real motivo! Alguém tem algum "pró" sobre utilizar essa classe para execução de queries.

 

O Autor cita algo sobre PDO, que eu desconheço.

 

Abraçoss!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu li tudo e vi que surgiu algumas duvidas e antes que passe batido queria tirar a duvida do Douglas quando ele disse o que acontece quando você herda uma classe com construtores

 

resposta você pode fazer ela fucnionar usando construtores tbm

 

veja exemplo:

 

class test2 extends test
{
function __construct()
{
	parent::__construct();

}

public function __destruct() 
{
   parent::__destruct();   
}
}

 

e reforçando todo metodo que nao foi declarado a visibilidade ele é por padrao "public"

 

Douglas

Me explica o self::

 

http://br2.php.net/manual/pt_BR/language.o...nekudotayim.php

 

Duas palavras-chaves especiais self e parent são usadas para acessar membros ou métodos de dentro da definição da classe.

 

como falei o manual do php é simples mas tem um conteudo basico que explica muita coisa

 

Void :

 

para começar a classe feita com php4 nao faz muito sentido, como eu sempre falo criar classes nao é só escrever class bla_bla {}

 

muita gente pensa que esta programando em oop só porque coloca funções e da o nome de classe, mas nao é assim

eu recomendo você usar sim classes mas nao essa e sim você fazer a sua propria e usando php5 de preferencia

 

e PDo é uma função do php5 para abstração a banco de dados

Compartilhar este post


Link para o post
Compartilhar em outros sites
CODE
<?php

 

class DB extends mysqli {

 

const 

SERVIDOR "localhost";

const 

USUARIO  "root";

const 

SENHA  "";

const 

BANCO  "vmc";

 

private static 

$tipo = array('bool','int','float','string','array','object','null');

 

/**

* Inicia

*

* @return bool

*/

function __construct()

{

try

{

@

parent::__construct(self::SERVIDORself::USUARIOself::SENHAself::BANCO);

 

if(

mysqli_connect_error())

{

throw new 

Exception(mysqli_connect_error());

}

return 

true;

}

catch(

Exception $e)

{

echo 

$e->getMessage();

}

}

 

/**

* Destroi conexão

*

* @return void

*/

function __destruct()

{

try

{

if(!

mysqli_connect_errno())

{

parent::close();

}

else

{

throw new 

Exception(mysqli_connect_error());

}

}

catch(

Exception $e)

{

echo 

$e->getMessage();

}

}

 

/**

* Executa query

*

* @param $sql (string) - SQL

* @return string

*/

function executa()

{

try

{

if(!

mysqli_connect_errno())

{

if(!

parent::query(func_get_arg(0)))

{

throw new 

Exception(parent::error());

}

return 

parent::query(func_get_arg(0));

}

else

{

throw new 

Exception(mysqli_connect_error());

}

}

catch(

Exception $e)

{

echo 

$e->getMessage();

}

}

 

/**

* Limpa variavel de SQL

*

* @param $tipo (string) - Tipo a ser

* @param $html (bool) - Codificar HTML

* @param $dado (string) - String a ser limpa

* @return string

*/

function limpa()

{

$arg func_get_args();

 

try

{

if(

$arg[1] == "false")

{

$retorna parent::real_escape_string(htmlentities(strip_tags($arg[2])));

}

else

{

$retorna parent::real_escape_string(htmlentities($arg[2]));

}

 

return 

$this->tipo($retorna$arg[0]);

}

catch(

Exception $e)

{

echo 

$e->getMessage();

}

}

 

/**

* Seta tipo

*

* @param $dado (string) - String a ser formatada

* @param $tipo (string) - Tipo a ser definido

* @return string

*/

function tipo()

{

$arg func_get_args();

 

try

{

if(!

in_array($arg[1], self::$tipo))

{

throw new 

Exception('Tipo de dado incorreto');

}

 

settype($arg[0], $arg[1]);

 

return 

$arg[0];

}

catch(

Exception $e)

{

echo 

$e->getMessage();

}

}

}

 

$teste = new DB();

$str_secao $teste->limpa("string"'false'$_GET['secao']);

$sql sprintf("SELECT * FROM site_secoes WHERE secao = '%s'"$str_secao);

 

if(

$resultado $teste->executa($sql))

{

while(

$row $resultado->fetch_assoc())

{

printf("

%s

"
$row['secao']);

}

}

 

 

?>

 

Alguém pode dar uma olhada, e ver como ficou?

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.