Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Dúvida sobre o static e interpretador PHP


Rafael Laurindo

Pergunta

Um atributo declarado como "static", pode ser acessado sem que necessite instanciar sua classe, certo? E ainda, se atribuíssemos um valor para esse atributo, e instânciassemos a classe, esse atributo permaneceria com o último valor recebido, não sendo redefinido para o primeiro, ou seja, o que recebeu quando a classe foi criada. A dúvida é, toda vez que chamarmos o interpretador, um atributo estático é redefinido para seu valor original, ou seja, de quando a classe foi criada?

Obs.: Fiz o esse teste rodando em linha de comando.

Editado por Rafael Laurindo
Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

Bom, deixa eu ver se consigo te esclarecer...

Basicamente quando uma propriedade, método ou classe é static é reservado um local na memória para ela que pode ser acessado de qualquer parte da aplicação desde que você inclua o arquivo e que ele esteja encapsulado de forma adequada. Exemplo:

<?php

class http {
    public static $public_static = null; // pode ser modificado em qualquer parte do codigo
    protected static $protected_static = null; // pode ser modificado apenas na classe e nas classes filhas
    private static $private_static = null; // pode ser modificado apenas na classe
    function __construct()
    {
        http::$private_static = 'metodo estatico privado'; // modifica com sucesso na classde
        echo http::$private_static;
    }
}

class http2 extends http {
    function __construct()
    {
        http::$protected_static = 'metodo estatico protegido'; // modifica com sucesso na classde filha
        echo http::$protected_static;
        echo '<br>';
    }
}

http::$public_static = 'metodo estatico publico'; // modifica com sucesso mesmo fora da classe
echo http::$public_static;
echo '<br>';

$objeto_protected = new http2();
$objeto_privado = new http();

?>

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz o teste em linha de comando nesse código...

<?php
class PC
{
    public static $mouse='optico';
    public $teclado='USB';
}

/*echo PC::$mouse; //exibe óptico
PC::$mouse='Bolinha';
echo PC::$mouse; // exibe Bolinha
$pc = new PC();
echo $pc->teclado; //exibe USB
$pc->teclado = 'PS2';
echo $pc->teclado; //exibe PS2
new PC();
echo $pc->teclado;/**/ //exibe USB
echo PC::$mouse; //exibe Bolinha

O construtor new, não redefine o valor atribuido a um atributo estático. Porém, depois de testado e funcionado, eu comentei as linhas 8 à 15, rodei novamente em linha de comando, o resultado foi "óptico", a idéia era mostrar "Bolinha", alguém sabe me dizer por que?

Editado por Rafael Laurindo
Link para o comentário
Compartilhar em outros sites

  • 0

Salve,

Veja o código abaixo:

<?php
error_reporting( E_ALL & ~E_NOTICE | E_STRICT );
class Classe
{
    public static $membro = NULL;
    
    public static function setMembro($membro)
    {
        self::$membro = $membro;
    }
    
    public static function getMembro()
    {
        return self::$membro;
    }
    
    public static function getInstance()
    {
        static $instance;
        if(!$instance)
        {
            $instance = new self();
        }
        return $instance;
    }
}
printf('<pre>%s</pre>', var_export( Classe::$membro )); //NULL
Classe::setMembro('Ola Mundo!');
printf('<pre>%s</pre>', var_export( Classe::$membro )); //Ola Mundo!
$instancia = Classe::getInstance();
printf('<pre>%s</pre>', var_export( $instancia->getMembro() )); //Ola Mundo!

Não sou muito bom em OO, mas acho que o código em si já consegue responder sua dúvida... ou não ?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Na verdade não, pois eu testei o código postado anteriormente, em linha de comando, e como disse, ele não retorna o valor esperado. Estou estudando sobre o design pattern Singleton, parece que tenho que alocar esse objeto definitivamente na memória, e não sei fazer isso. Por isso, toda vez que chamo o interpretador em linha de comando, ele reinicia os valores, mesmo os estáticos

Link para o comentário
Compartilhar em outros sites

  • 0

Brother,

Qual versão do PHP 5 você esta usando ?

Modo CLI não tem nada a ver o que você falou...

Coloca seu código prático aqui, por favor...

Na verdade não, pois eu testei o código postado anteriormente, em linha de comando, e como disse, ele não retorna o valor esperado. Estou estudando sobre o design pattern Singleton, parece que tenho que alocar esse objeto definitivamente na memória, e não sei fazer isso. Por isso, toda vez que chamo o interpretador em linha de comando, ele reinicia os valores, mesmo os estáticos

Link para o comentário
Compartilhar em outros sites

  • 0

Achei...

<?php
class PC
{
    public static $mouse='optico';
    public $teclado='USB';
}
echo PC::$mouse; //exibe óptico
echo "<br>";
PC::$mouse='Bolinha';
echo PC::$mouse; // exibe Bolinha
echo "<br>";
$pc = new PC();
echo $pc->teclado; //exibe USB
echo "<br>";
$pc->teclado = 'PS2';
echo $pc->teclado; //exibe PS2
echo "<br>";
//--------------------------------------------------
//ISSO AQUI JOGA UMA INSTANCIA PARA O BUFFER, 
//NÃO QUER DIZER QUE O $pc SERÁ REINICIALIZADO ¬¬
//--------------------------------------------------
new PC(); 
//--------------------------------------------------
//EXPERIMENTE DESCOMENTAR A LINHA ABAIXO
//$pc = new PC();
//echo $pc->teclado, '<br>'; //VAI IMPRIMIR USB
//echo PC::$mouse, '<br>'; //VAI IMPRIMIR 'BOLINHA'
//--------------------------------------------------
echo $pc->teclado;/**/ //exibe PS2
echo "<br>";
echo PC::$mouse; //exibe Bolinha    
echo "<br>";

Link para o comentário
Compartilhar em outros sites

  • 0

Bom galera, esse é o fórum que mais confio, logo o que mais visito. Sei que as pessoas me ajudaram de boa vontade, nunca duvidarei disto. Mas até agora, o static pra mim, só serve para acessar um atributo ou método sem precisar instanciar sua classe, porque persistir em memória, que era o que eu precisava, ele não faz. Preciso de ajuda e esclarecimento. Obrigado desde já.

Editado por Rafael Laurindo
Link para o comentário
Compartilhar em outros sites

  • 0
Mas até agora, o static pra mim, só serve para acessar um atributo ou método sem precisar instanciar sua classe.

Ele serve pra agir independente da instancia, o que não é simplesmente acessar sem precisar instanciar.

Você pode, por exemplo, retornar, através de uma propriedade estática, a quantidade de instancias daquela classe, somando ++ a essa propriedade no construtor.

Pelo que eu entendi da sua dúvida, você pode guardar esses valores usando sessions e derivados.

Abraço.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...