Douglas 6 Denunciar post Postado Abril 1, 2006 Já estou baixando... Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Abril 1, 2006 Muito bom esse materia Prog. Mais algumas dúvidas.. 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
Prog 183 Denunciar post Postado Abril 1, 2006 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
Douglas 6 Denunciar post Postado Abril 1, 2006 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
Prog 183 Denunciar post Postado Abril 1, 2006 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
Douglas 6 Denunciar post Postado Abril 1, 2006 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
Douglas 6 Denunciar post Postado Abril 1, 2006 Me explica o self::// Tinha visto na documentação mas não estou encontrando.. Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Abril 1, 2006 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: <?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
Douglas 6 Denunciar post Postado Abril 1, 2006 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
Eclesiastes 2 Denunciar post Postado Abril 1, 2006 Douglas disse: Funcionaria como um parent:: mas para a classe atual.Justamente.http://www.php.net/manual/pt_BR/language.o...nekudotayim.phpPara estudos também deixo um link:http://www.lozano.eti.br/palestras/patters-php.pdf Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Abril 1, 2006 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. <?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
Eclesiastes 2 Denunciar post Postado Abril 1, 2006 Prog disse: $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
Prog 183 Denunciar post Postado Abril 1, 2006 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
Eclesiastes 2 Denunciar post Postado Abril 2, 2006 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
Prog 183 Denunciar post Postado Abril 2, 2006 Eclesiades... Na verdade, eu não sei se usei algum padrão. 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
Eclesiastes 2 Denunciar post Postado Abril 2, 2006 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
Void : 0 Denunciar post Postado Abril 3, 2006 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
Fabyo 66 Denunciar post Postado Abril 3, 2006 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
Void : 0 Denunciar post Postado Abril 3, 2006 grato grande Fabyo! Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Abril 5, 2006 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::SERVIDOR, self::USUARIO, self::SENHA, self::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