Ir para conteúdo

POWERED BY:

Arquivado

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

Tiago Souza Ribeiro

Não entendi direito abstract, static...

Recommended Posts

Então, quando você define uma propriedade ou método como estático (static), o seu comportamento não é alterado, somente é alterado a forma que você vai chamá-lo.

Errado, o comportamento é alterado sim, pois a propriedade ou método é 'global' para aquela classe. Se você alterar uma propriedade estática, alterará para todos os objetos daquela classe.

 

Releia o post #11 para entender, Tiago... A 'regra' para se utilizar estático é algo que você deseja que seja único para todos os objetos da classe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Única coisa que entendi sobre static: não precisa instanciar. Pronto, é só isso? Quando alguém usaria static ao invés da outra forma "instanciavel"?

 

Só falta isso pra entender :P

 

exemplo prático, de uma implementação real e em pleno funcionamento:

www.php.net/manual/en/pdo.getavailabledrivers.php

 

Olha o paradoxo:

Eu preciso de um driver válido pra criar uma nova instância.

Como eu faria pra saber quais drivers estão disponíveis se eu tivesse que criar uma instância pra isso?

 

Ainda sugiro que você releia esse tópico, pois, o mesmo já contém diversos exemplos.

É sempre bom revisitar um escrito que não havíamos entendido anteriormente. Impressionante como um novo ponto de vista pode ser esclarecedor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aaaah, acho que entendi um pouco.

No exemplo do getAvailableDrivers o static é usado para que a pessoa não precise instanciar o PDO, criando uma conexão e tudo mais só pra ver os drivers disponíveis. É isso?

 

E Henrique: com único, você quer dizer algo global dentro da classe, não podendo ter nenhum outro objeto ou método com mesmo nome? Vou reler os posts pra ver se entendo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem muito a ver com OO, mas eu sempre quis entender o uso de static quando dentro de uma função, junto à uma variável normal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem muito a ver com OO, mas eu sempre quis entender o uso de static quando dentro de uma função, junto à uma variável normal.

 

serve pra que aquele valor seja declarado apenas uma vez

function contar() {
static i=0;
echo i++ . PHP_EOL;
}
contar();
contar();

Compartilhar este post


Link para o post
Compartilhar em outros sites

E isso serve pra quê, exatamente?Sabe,na prática.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E isso serve pra quê, exatamente?Sabe,na prática.

 

Naquele tópico meu do desafio das Permutações eu fiz o uso de uma variável estática dentro da função, utilidade na prática ? claro ... pense que você dispara uma função em várias partes do site, ou até mesmo no mesmo script, e precisa que essa variável seja mantida.

 

<?php

      function doCheckAndIncrement ( $v ) {
             static $checkedCount = 0 ;

             if ( $v & 1 ) {
                    printf ( '%d [%d]%s' , $v , $checkedCount , PHP_EOL ) ;
                    $checkedCount ++ ;
             }

      }

      for ( $i = 0 ; $i < 10 ; ++ $i ) {
             doCheckAndIncrement ( $i ) ;
      }

      echo PHP_EOL ;

      $x = 10 ;
      while ( $x > 0 ) {
             doCheckAndIncrement ( $x ) ;
             -- $x ;
      }

      echo PHP_EOL ;

      doCheckAndIncrement ( 21 ) ;

 

Se você tem uma rotina e dispara ela após algumas verificações ou dentro de outras rotinas sem fazer o uso de variável externa ... coisa do tipo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O uso mais comum, Bruno Augusto é em funções com recursividade, na qual o resultado da primeira chamada influi no da segunda. Normalmente, é possível fazer isso passando parâmetros, mas quando essa dependência não é um parâmetro, ou você declara static, ou usa outra função com o parâmetro a mais para fazer a recursividade.

 

______________________________________

 

E Henrique: com único, você quer dizer algo global dentro da classe, não podendo ter nenhum outro objeto ou método com mesmo nome? Vou reler os posts pra ver se entendo...

Quanto à nomenclatura, isso vale pra qualquer propriedade ou método, não só os estáticos.

 

Estou querendo dizer que, para propriedades estáticas, uma alteração no seu valor afeta TODOS os objetos daquela classe que a referenciam, diferentemente das propriedades de instância (não-estáticas), as quais cada objeto possui uma DIFERENTE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou querendo dizer que, para propriedades estáticas, uma alteração no seu valor afeta TODOS os objetos daquela classe que a referenciam, diferentemente das propriedades de instância (não-estáticas), as quais cada objeto possui uma DIFERENTE.

 

Nope. Novamente, não afeta os objetos. Afeta a classe. Sei que foi isso que você quis dizer. Mas estou tentando deixar isso bem claro. Não podemos dar margem às dúvidas :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim Evandro, isso já foi dito e acredito que o autor já tenha entendido pelos seus comentários, mas nada impede que objetos da classe referenciem propriedades estáticas, normalmente é o que acontece, como aqui:

class Foo {
private static $bar;
public function getBar() {
   	return self::$bar;
}
}

O exemplo é meio besta, sem sentido, mas essa é a ideia. Dessa forma, toda instância de Foo referencia a MESMA variável $bar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu sei que vai ter gente querendo me bater pois ainda não peguei "o conceito", ainda mais não pude entrar final de semana então recapitulando...

 

lá vai eu falar bosta mais cá vou eu...

 

se você declarar alguma propriedade estática quando você definir algum valor para ela através de algum método essa mesma propriedade não terá esse mesmo valor em outro método dentro da mesma função?

Compartilhar este post


Link para o post
Compartilhar em outros sites
se você declarar alguma propriedade estática quando você definir algum valor para ela através de algum método essa mesma propriedade não terá esse mesmo valor em outro método dentro da mesma função?

 

Não direi sim, pois não entendi exatamente a sua pergunta, ela está ambígua. Entretanto, lhe darei a resposta correta.

 

Quando existe uma propriedade estática que seu valor pode ser alterado através de um método(estático ou não), todos os métodos, e classes, que utilizarem essa variável, usufruirão do novo valor (o valor alterado).

 

Vamos a um exemplo bem simples:

Classe Teste. Cada instancia possui um valor único, e imprime o valor da variável estática $variavelEstatica.

class Teste {

   private static $variavelEstatica = 0;
   private static $instancias = 0;
   private $instancia;

   public function __construct() {
       self::$instancias++;//Contador de instâncias
       $this->instancia = self::$instancias;//Recebe um valor para sua instância;
   }

   public function setVariavelEstatica($valor) {
       self::$variavelEstatica = $valor;
   }

   public function imprimir() {
       echo 'Valor de $variavelEstatica, impresso da instância nº '.$this->instancia.', da classe '.__CLASS__.', é '.self::$variavelEstatica.'<br />';
   }
}

 

O teste:

$classe1 = new Teste();//Instância nº 1
$classe1->imprimir();//Imprimo o valor. Resultado: 0
$classe1->setVariavelEstatica(10);//Atribuo o valor 10
$classe1->imprimir();//Resultado: 10

$classe2 = new Teste();//Instância nº 2
$classe2->imprimir();//Resultado: 10. Valor atribuído na instância nº 1
$classe2->setVariavelEstatica(5);//Atribuo valor 5

$classe1->imprimir();//Resultado: 5. Valor atribuído na instância nº 2

 

Saída:

Valor de $variavelEstatica, impresso da instância nº 1, da classe Teste, é 0

Valor de $variavelEstatica, impresso da instância nº 1, da classe Teste, é 10

Valor de $variavelEstatica, impresso da instância nº 2, da classe Teste, é 10

Valor de $variavelEstatica, impresso da instância nº 1, da classe Teste, é 5

 

Veja que indiferente a classe que foi utilizada para a impressão, o valor corresponde ao mesmo, em ambas as classes, para o valor da variável estática.

Compartilhar este post


Link para o post
Compartilhar em outros sites

aaaagora siim, eu estava pensando justamente o contrário.

 

que o valor estático seria alterado apenas na propriedade em que ela foi chamada sendo que nas outras Classes ou métodos que usufruem da mesma propriedade não iriam receber alterações

 

agora sim claro como água limpa..

 

grande abraços.

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.