Douglas 6 Denunciar post Postado Março 31, 2006 Pessoal... Estou com um livro sobre OOP - OOP Programação orientada a objetos - Desmitificado; Os exemplos de classes são todos em Java e C/C++, qual eu devo me assemelhar para o PHP? Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Março 31, 2006 A explicação de OO é válida para todas, mas uma ou outra linguagem pode apresentar um comportamento diferente no que diz respeito a uso de memória e coisas do tipo. Não tenho certeza absoluta por não conhecer muito de C++, mas acho que se assemelha mais ao Java. Lembrando que você só pode considerar os exemplos se comparando com PHP5. Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Março 31, 2006 humm...Então o PHP4 seria uma "emulação" de OOP?-----------O livro é legal, mas o é um pouco complicado de entender, é não é muito objetivo nas explicações. Acredito que seja a tradução, que está complicando. Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Março 31, 2006 Uma coisa que eu posso te dizer com certeza: Comprar livros de informática traduzidos de outros idiomas é uma b........ Muitos dos termos, as vezes, não deveriam ser traduzidos e eles traduzem, acaba que complica o entendimento do que ta escrito, de qualquer forma, é um passo. Qualquer coisa vai postando que a gente vai tentando "solucionar o enigma do livro". Quanto ao PHP4, a orientação a objetos era bem fraquinha. Você já deve ter lido neste livro que uma linguagem orientada a objetos deve ter algumas caracteristicas, como: Abstração, Encapsulamento, Herança, Interfaces e Polimorfismo. Algumas destas características não existem no PHP4. Para entender melhor isto que estou querendo dizer, de uma olhada nos capítulos 18 e 19 do manual do PHP: http://www.php.net/manual/pt_BR/language.oop.php http://www.php.net/manual/pt_BR/language.oop5.php Compartilhar este post Link para o post Compartilhar em outros sites
Illidan 0 Denunciar post Postado Março 31, 2006 Então o PHP4 seria uma "emulação" de OOP? Não sei dizer com certeza, mas acho que não... o que sei é que toda a parte de OO do PHP foi reescrita na versão 5, ficando muito próxima a Java. Se você não tiver problemas com Inglês, veja este artigo: http://www.php-mag.net/itr/online_artikel/...nodeid,114.html É o melhor que já encontrei sobre os conceitos de orientação a objetos... []'s! Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Março 31, 2006 É a tradução é muito mal feita, muita repetição do que já escrito, agora mesmo estou na parte do Encapsulamento. Ele me mostra um quadro (parece um UML). Student --------------------------- Número de identificação Nome SobreNome Graduação --------------------------- Write() Display() Ou coloca tudo em inglês ou tudo em português. Se alguém souber de titulos que expliquem OOP escrito por brasileiros, me avisem. Dúvidas com certeza eu terei, e muitas. Em breve estarei colocando aqui no fórum. [update] Valeu Prog e Illidan, com certeza, vou dar uma olhada nesses links. [/update] Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Março 31, 2006 Como o proprio manual do php tem bastante coisa pelo menos o basico ja da para você pegar e outra coisa oop é para php5 e nao esta nem 50% mas ja melhorou bastante ja o php 4 é ate uma gambiarra fazer oop com ele http://forum.imasters.com.br/index.php?showtopic=151480 e o oop do php é bem parecido com java e .NET Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Março 31, 2006 Hummm.. então vou direto para o php5.Algumas coisas básicas eu já tenho idéia do que seja. Então a leiutura me facilita um pouco.O que me complica é entender essa o funcionamento dos procedimentos (funções) de uma classe.Por exemplo. Em classes de conexão eu vejo um procedimento para conectar, outro procedimento para executar a query, e outro procedimento para fechar a conexão.Mas porque criar um procedimento para 'fechar' a conexão se eu poderia coloca-lo no fim do procedimento da query? Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Março 31, 2006 sim poderia mas uma classe bem feita e organizada ela faz exatamente o que o nome sugere exemplo um carro o volante você vira o carro para a direita e esquerda o freio para o carro o acelerador faz o carro correr a porta faz você ter acesso a entrar e sair do carro entendeu cada coisa no seu lugar nao pode ter um metodo faz tudo cada metodo cuida de um assunto tem ate uma metodologia que diz se sua função tem mais de 20 linhas sua função ta errada entao voltando ao caso eu poderia usar um metodo unico onde abre executa e fecha o banco mas eu nao teria essa opção sozinho se precisa-se chamar só o abrir ou fechar taria junto da executa_query ah e outra coisa no php5 você usa os construtores e destrutores dai você pode colocar neles para abrir e fechar o banco nao precisando mais do metodo abrir e fechar um exemplo que eu fiz (antigo ja) = ) mas vale como exemplo : class DB extends mysqli { public function __construct() { try { @parent::__construct(SERVIDOR, USUARIO, SENHA, BANCO); if(mysqli_connect_error()){ throw new Exception(mysqli_connect_error()); } return true; } catch(Exception $erro) { $this->exception_handler($erro); } } public function __destruct() { if(!mysqli_connect_errno()){ parent::close(); } } public static function exception_handler($exception) { $mensagem = $exception->getMessage(); $codigo = $exception->getCode(); $arquivo = $exception->getFile(); $trace = $exception->getTraceAsString(); $dir = getcwd()."\\logs\\"; if(!file_exists($dir)) { mkdir($dir); } error_log(date("Y-m-d H:i:s")."|$mensagem|$codigo|$arquivo|$trace\r\n\r\n", 3, $dir."debugger.log"); echo "Erro: " , $mensagem, "\n"; exit; } public function query($sql) { if(!mysqli_connect_errno()) { return parent::query($sql); } } } Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Março 31, 2006 Interessante essa classe.Mas na função (function exception_handler), você tem 'public static'? Não seria apenas um? public, static ou private?Cada ação que eu for realizar, é uma nova função que eu devo criar? (até rimou!) Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Março 31, 2006 http://br.php.net/manual/pt_BR/language.oop5.static.php A declaração static deve estar depois da declaração de visibilidade. Por compatibilidade com o PHP 4, se nenhum declaração de visibilidade for usada, então o membro ou método será tratado como se fosse declarado como public static. outra coisa qualquer function nao declarada a visibilidade o php intendera como "public" por isso é opcional colocar public mas eu sempre coloco sobre a 2 pergunta: lembre que em oop um objeto representa algo do mundo real. Metodos sao ações que o objeto pode fazer, propriedades sao dados pertinentes ao objeto. entao toda vez que você dá um nome a uma classe ou metodo se pergunte o que ela está representando. Daí veja o metodo, e pense se aquele metodo realmente é algo que aquele objeto pode fazer. tente perguntar para você mesmo o que seu metodo faz Se as perguntas não fazem sentido ou se as respostas não são simples, provavelmente tem algo errado na sua classe Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Março 31, 2006 Como é complicado de entender esse negócio de visibilidade. Vejam se eu entendi.O private, só pode ser acessado na classe atual, não pode ser herdado, certo?O static, tem um valor estático, (uma constante), e não pode ser alterado?Dúvidas..O protected, quando devo usa-lo e pra que serve?Qual a diferença entre (protected e private)? Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Março 31, 2006 private você limita apenas a propria classe o protected você limita entre as classes herdadas exemplo class Deus { private function Onipresente() { return "Eu Sou onipresente"; } protected function Pensar() { return "Eu posso Pensar"; } } class homem extends Deus { public function teste() { return parent::Pensar(); } public function teste2() { return parent::Onipresente(); } } $teste = new homem(); echo $teste->teste(); echo $teste->teste2(); resultado do exemplo acima: Fatal error: Call to private method Deus::onipresente() from context 'homem' in C:\root\test3.php on line 24 faça o teste e veja o homem herda a classe Deus mas tem coisas que só Deus pode fazer e o homem pode , porque o que Deus pode fazer é metodo private e só a Classe Deus que pode executa-la desculpe o exemplo fiz correndo to indo almoçar t+ mas se quiser posta algumas duvidas ai depois Compartilhar este post Link para o post Compartilhar em outros sites
Perfect Lion 10 Denunciar post Postado Março 31, 2006 Bem a sua conclusão está certo quanto ao static.agora a diferença em Protected ePrivate.Protected ele é protegido então você não vai conseguir usar uma função ou variavel protegida dentro da classe já o private ele é privado algo que somente a classe que contém o metodo ou uma varivel que vai ter acesso a ela mais você consegue ter acesso a ela fora da classe quando você cria um novo objeto (new objetc) chamando o proprio objeto que contem o private.Edit: O fabyo posto antes de mim e ta perfeito =) Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Março 31, 2006 Ainda não consegui entender muito bem o protect.O protect pode ser herdado como o public, mas não pode ser alterado (manipulado) é isso? Compartilhar este post Link para o post Compartilhar em outros sites
Perfect Lion 10 Denunciar post Postado Março 31, 2006 Protect ele está protegido ele pode ser usado em subclasse mais não pode ser usado fora das classe ex: class objeto{ protected function protegido(){ return "pode ser chamado em subclasses, mais fora das classes não"; } private function privado(){ return "não pode ser chamado em subclasses, mais pode chamar ele quando o objeto é iniciado como você está vendo agora"; } public function publico(){ return "aqui você pode usar tanto em subclasse quanto fora das classes"; }class subObjeto{ public function subPrivado(){ return $this->privado(); // aqui não mostra a mensagem } public function subProtegido(){ return $this->protegido(); // aqui mostra a mensagem } public function subPublico(){ return $this->publico(); // aqui mostra a mensagem }}}$teste = new objeto();echo $teste->publico() // aqui ele mostra a mensagemecho $teste->privado() // aqui ele mostra a mensagemecho $teste->protegido() // aqui da erro $teste2 = new subObjeto();echo $teste2->subPublico() // aqui ele mostra a mensagemecho $teste2->subPrivado() // aqui da erroecho $teste2->subProtegido() // aqui mostra a mensagem saco agora? Compartilhar este post Link para o post Compartilhar em outros sites
Illidan 0 Denunciar post Postado Março 31, 2006 Só completando o que o pessoal falou... existem estes três modificadores de visibilidade: public, protected e private. Public É o menos restritivo de todos. Permite acessar um atributo da classe (propriedade ou método) diretamente através de um código que esteja fora da classe. Protected Permite acesso aos atributos da classe somente através de um código que esteja dentro da classe onde ela foi definida, ou numa classe filha. Private É o mais restritivo. Permite acesso aos atributos da classe somente através de um código que esteja dentro da classe onde ela foi definida. Você nunca poderá ter um contrutor "private" ou "protected", caso contrário não é possível criar a instância da classe. Quanto ao modificador static, serve para que você acesse uma variável ou uma função estaticamente, ou seja, sem precisar criar o objeto. Por conta disto, você não pode utilizar a variável "$this" dentro de um método estático, pois o objeto pode não ter sido criado quando ele for chamado. Acaba sendo como uma variável ou função normal, só que está encapsulada dentro classe. Vou utilizar um exemplo da linguagem Java pra mostrar a utilidade do modificador "static". Nesta linguagem, você tem a classe "Math", em que as principais funções matemáticas estão definidas. Se você precisar de um "round", não precisa criar um objeto do tipo "Math" só pra executar essa tarefa. Chama o método estaticamente: Math.round(valor); No PHP, a sintaxe seria: Math::round($valor); beleza? []'s! Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Março 31, 2006 Eu pensava que era complicado, agora eu tenho mais que certeza. Em qual situação real, eu iria usar o modificador de visibilidade protect? Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Março 31, 2006 Veja o seguinte exemplo: Vamos imaginar um objeto Casa, esta tem várias propriedades e dentro da Casa temos vários outros objetos, tipo: Geladeira, Porta, Janela, Mesa, Banheiro ... Vamos imaginar que este objeto Casa tenha algumas propriedades, como: cor, endereco, ... Exemplificando public: (sem restrição) O objeto Banheiro desta Casa pode ser usado por qualquer Pessoa, independente de onde esta Pessoa venha e nem pede licença. Exemplificando private: (mais restritivo) Nenhuma Pessoa pode ter acesso ao objeto Banheiro da sua Casa, a não ser que este tenha uma chave (um método modificador). Exemplificando protected: (restrição intermediária) Todas as Pessoas do seu Condominio* tem acesso livre ao seu objeto Banheiro, como em public, mas as Pessoas de fora do seu Condominio* só podem usar o Banheiro caso tenham uma chave, como em private. *Condominio, neste contexto, pode ser um objeto que é criado dentro da classe que tenha a visibilidade protected, uma classe do mesmo pacote ou relacionadas de alguma maneira. Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Abril 1, 2006 O grupo JavaRN fez um encontro recentemente, no qual houve um mini-curso de Introdução à Orientação a Objeto. Acho que o material pode servir como consulta e exemplo do que já foi discutido por aqui. Orientação a Objetos http://www.j2eebrasil.com.br/jsp/cursos/javarn.zip Compartilhar este post Link para o post Compartilhar em outros sites