Leonardo™ 0 Denunciar post Postado Setembro 13, 2011 E aí beleza? Fui me aventurar como professor e uma pessoa me perguntou sobre a diferença em usar parent:: e this-> em um contexto de herança como a do exemplo abaixo: class Pai { protected $atributoDoPai; protected function metodoDoPai(){ return $this->atributoDoPai; } } class Filho extends Pai { public function metodoDoFilho( $valor ) { $this->atributoDoPai = $valor; return parent::metodoDopai(); } } Claro que as classes que ele havia me mostrado eram funcionais e não essas sem utilidade... Então fui indagado com a seguinte pergunta: Onde tem parent:: eu posso utilizar o this-> e vai acontecer a mesma coisa. Então porque tem essas duas formas de acessar o conteúdo da super classe? Eu respondi sem muita certeza isso: Acredito que o certo é usar parent::, pois você esta usando um recurso que pertence a classe e não a instância; apesar de você poder acessar o recurso. E essa é a única ocasião que você trata um método/atributo não estático como se fosse estático ( por causa do :: ). Fiquei inseguro com a resposta. Falei merd@? Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 13, 2011 Então fui indagado com a seguinte pergunta: Onde tem parent:: eu posso utilizar o this-> e vai acontecer a mesma coisa. essa premissa é falsa.Por isso a "dificuldade em responder". Partindo de uma premissa falsa, você não pode formular uma teoria, e querer justificar ou explicar ela. Então porque tem essas duas formas de acessar o conteúdo da super classe?Existem pq elas são diferentes, tanto em resultado qnto em conceitos.Usando ::parent você está acessando diretamente da super class, usando $this->, você está acessando o método da classe filha, depois de ter passado pelo overload(ou não) Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Setembro 13, 2011 Usando ::parent você está acessando diretamente da super class, usando $this->, você está acessando o método da classe filha, depois de ter passado pelo overload(ou não) Seria algo tipo: <?php class Pai { protected function get( ) { return 'Pai'; } } class Filho extends Pai { protected function get( ) { return 'Filho'; } public function _print( ) { printf( '<pre>parent::get( ); // %s<br/>$this->get( ); // %s</pre>', parent::get( ), $this->get( ) ); } } $filho = new Filho; $filho->_print(); Saída: parent::get( ); // Pai $this->get( ); // Filho Compartilhar este post Link para o post Compartilhar em outros sites
Leonardo™ 0 Denunciar post Postado Setembro 14, 2011 essa premissa é falsa.Por isso a "dificuldade em responder". Partindo de uma premissa falsa, você não pode formular uma teoria, e querer justificar ou explicar ela. Obrigado pela resposta! Cheguei a pensar nisso que você disse, mais acabei sendo infeliz na situação. Saída: parent::get( ); // Filho $this->get( ); // Pai Resultado não esta invertido? Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 14, 2011 Está invertido sim, pq ele inverteu os parâmetros do printf() denovo: porque diabos usar essa function ? ao menos vcs já programaram em C? para terem 'se acostumado' com isso ? acho ridículo usar uma function tão complexa, e que faz tanta coisa, para algo tão simples qnto concatenar. O resultado é esse ai: ilegibilidade no código, e erros. printf( '<pre>parent::get( ); // %s<br/>$this->get( ); // %s</pre>', parent::get( ), $this->get( ) ); Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Setembro 14, 2011 Calma, calma... Já corrigi o engano, tinha feito mais coisas nestas classes, mas resolvi remover e deixar mais limpa para o exemplo. Não diria um erro, apenas um engano. O foco não é desempenho e blá, blá, blá. Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 14, 2011 Não diria um erro, apenas um engano. em Matemática, enganos são erros. Programação tem muito de matemática, então, eu diria que em programação, enganos são erros. E esse engano só foi possível, por causa da camada de abstração e complexidade que o uso desnecessário dessa função trouxe. Galera: programar difícil, de forma ilegível, usando mil e umas funções, de forma complexa.. e tudo mais, não é programar bem ! na verdade, se pensar bem, é exatamente o contrário de 'programar bem' :lol: Enfim, apenas a minha opinião. Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Setembro 14, 2011 Galera: programar difícil, de forma ilegível, usando mil e umas funções, de forma complexa.. e tudo mais, não é programar bem ! Isso eu tenho que concordar :clap: Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Setembro 14, 2011 denovo: porque diabos usar essa function ? Simples, separação das camadas. <?php //Model $lang = 'pt'; $model = array( 'en' => array( 'Open' , 'Close' ), 'pt' => array( 'Abrir' , 'Fechar' ) ); //View vprintf( '<menu><li class="open">%s</li><li class="close">%s</li></menu>' , $model[ $lang ] ); acho ridículo usar uma function tão complexa, e que faz tanta coisa, para algo tão simples qnto concatenar. O resultado é esse ai: ilegibilidade no código, e erros. Sei lá, talvez uma mera questão de ponto de vista, mas eu sinceramente acho o código acima mais legível que o código abaixo: <?php //Model $lang = 'pt'; $model = array( 'en' => array( 'Open' , 'Close' ), 'pt' => array( 'Abrir' , 'Fechar' ) ); //View echo '<menu><li class="open">' , $model[ $lang ][ 0 ] , '</li><li class="close">' , $model[ $lang ][ 1 ] , '</li></menu>'; Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 14, 2011 Simples, separação das camadas. não vi onde você 'separou camadas' aqui. Pra mim, está misturado, pois tem 'muito html' no meio de código php. Sei lá, talvez uma mera questão de ponto de vista, mas eu sinceramente acho o código acima mais legível que o código abaixo: se a familia de funções printf() fosse mais legível, não tornaria mais comum e mais fácil de cometer aquele erro de troca de ordem de parâmetros que o @Carlos cometeu. Numa leitura da esquerda para a direita, estamos quebrando o fluxo de pensamento. Indo contra o senso comum e trocando o conhecimento que está 'no mundo' pelo conhecimento que está 'na cabeça'. "Erros só acontecem se forem possíveis de serem cometidos". http://wbruno.com.br/blog/2011/07/25/sobre-livro-o-design-dia-a-dia/ Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Setembro 14, 2011 não vi onde você 'separou camadas' aqui. Pra mim, está misturado, pois tem 'muito html' no meio de código php. Ué William, Veja só, quando eu disse separação de camadas, eu estava me referindo à exibição separada dos dados que ela utiliza, não de PHP com HTML. A mistura de HTML com PHP não é problema, de fato, essa mistura na exibição faz parte pela própria descrição da linguagem PHP. (sem contar que HTML e PHP não são camadas) se a familia de funções printf() fosse mais legível, não tornaria mais comum e mais fácil de cometer aquele erro de troca de ordem de parâmetros que o @Carlos cometeu. É como eu disse, talvez seja apenas uma questão de ponto de vista, pois não acho que essas funções possuem problemas de legibilidade. Numa leitura da esquerda para a direita, estamos quebrando o fluxo de pensamento. Mas é ai que está o grande ponto, não se lê da direita para a esquerda, ou da esquerda para a direita. Na esquerda fica a formatação da saída . Na direita os dados que serão formatados. Na prática, temos dois blocos que devem ser lidos individualmente. Pense assim: Caso 1: <?php $lang = 'pt'; $model = array( 'en' => array( 'Open' , 'Close' ), 'pt' => array( 'Abrir' , 'Fechar' ) ); vprintf( '<a href="#open">%s</a><a href="#close">%s</a>' , $model[ $lang ] ); Como a saída está separada dos dados, fica fácil modificá-la: <?php $lang = 'pt'; $model = array( 'en' => array( 'Open' , 'Close' ), 'pt' => array( 'Abrir' , 'Fechar' ) ); vprintf( '<ul><li><a href="#open">%s</a></li><li><a href="#close">%s</a></li></ul>' , $model[ $lang ] ); Ou <?php $lang = 'pt'; $model = array( 'en' => array( 'Open' , 'Close' ), 'pt' => array( 'Abrir' , 'Fechar' ) ); vprintf( '<menu><li><a href="#open">%s</a></li><li><a href="#close">%s</a></li></menu>' , $model[ $lang ] ); Se estivermos utilizando concatenação, fazemos referência ao item específico do conjunto de dados e, talvez, na modificação, corremos o risco de fazer uma referência errada, pois estamos lidando diretamente com os dados. Acho que é apenas uma questão de preferência, nada além disso. Confundir um parâmetro de uma função da família printf pode ocorrer com tanta frequência quanto errar um offset ao lidar diretamente com os dados que serão formatados. A atenção no código independe da ferramenta que está sendo utilizada e as consequências da falta de atenção são as mesmas, utilizando concatenação ou parâmetros de uma função. ;) Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 14, 2011 (sem contar que HTML e PHP não são camadas) por essa lóigica, html e css tb não seriam "camadas". e é possível escrevermos todo o nosso css no meio do html, a sintaxe permite isso. porém não fazemos, pq existem bons motivos para não praticarmos isso assim. Quero o mesmo para HTML + PHP. Lógica de negócio contra apresentação. Quero uma apresentação dinâmica, sem ter que entuchar minhas classes de código HTML. pois não acho que essas funções possuem problemas de legibilidade. possuem cara..aqui enqnto você "acha", eu provo que possuem um problema de legibilidade com um contra exemplo. Provar que está certo é difícil, mas provar que está errado, basta um contra exemplo. (vide post acima) Na esquerda fica a formatação da saída . Na direita os dados que serão formatados. porém as chaves do array, precisam casar da esquerda para a direita, com os placeholders, e a ordem dos %s, estão da esquerda para a direita. analisamos código assim: de cima para baixo, da esquerda para a direita.(subrotinas) Na prática, temos dois blocos que devem ser lidos individualmente. uma camada de complexidade que foi adicionada sem necessidade.Foi oq eu disse sobre "conhecimento no mundo" contra "conhecimento na cabeça". Acho que é apenas uma questão de preferência, nada além disso. talvez sim, e por isso que essa discussão é infinita. Compartilhar este post Link para o post Compartilhar em outros sites
Leozitho 81 Denunciar post Postado Setembro 14, 2011 Sinceramente, qual forma é a mais "legível" eu não sei dizer, pois já usei as duas... Mas, que usando estas funções em vez de uma simples concatenação causa uma perda de desempenho desnecessária, isso é fato! :P Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Setembro 14, 2011 Exatamente .. uma questão de costume, não é porque ela faz 'mil e uma coisas', que o uso dela é dispensável em certos casos. <?php $start = microtime( true ) ; printf( '.....%s.....' , 'iMasters' ); $end = microtime( true ) ; echo ( $end - $start ) , '<br />'; echo memory_get_usage() , '<br />'; unset( $start , $end ) ; $start = microtime( true ) ; echo '.....'. 'iMasters' .'.....'; $end = microtime( true ) ; echo ( $end - $start ) , '<br />'; echo memory_get_usage(); Saída .. .....iMasters.....4.7922134399414E-5 316016 .....iMasters.....5.0067901611328E-6 316016 Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Setembro 14, 2011 Mas, que usando estas funções em vez de uma simples concatenação causa uma perda de desempenho desnecessária, isso é fato! Sim, de fato é um fato. :D Compartilhar este post Link para o post Compartilhar em outros sites