Beraldo 864 Denunciar post Postado Março 5, 2007 Olá, pessoal. :D A partir do PHP 5, sabemos que é possível atribuiur visibilidade (public, protected ou private) a membros e métodos de uma classe. Sempre uso visibnilidade em variáveis de classe, mas ontem fiquei tentando saber se é possível atribuir visibilidade a uma constante de uma classe. Se procedermos da forma como se faz com variáveis, dá erro de sintaxe: class Teste { private BERALDO = "Beraldo"; //... }ou class Teste { private cont BERALDO = "Beraldo"; //... }Ambos os exemplos geram erro de sintaxe. No exemplo abaixo, é possível dar um echo na constante BERALDO fora da classe. Até mesmo é possível herdá-la em outra classe: class Teste { const BERALDO = "Beraldo"; public function __construct() { echo self::BERALDO; } } class Teste2 extends Teste { public function __construct() { //não estou usando parent para mostrar que a constante foi realmente herdada echo self::BERALDO; } } echo Teste::BERALDO;//mostra "Beraldo" $t = new Teste2;//também exibe "Beraldo" É só uma curiosidade. Se não for possível atribuir visibilidade a constantes, continuo usando veriáveis mesmo. :) Valeu []'s Compartilhar este post Link para o post Compartilhar em outros sites
ScornInPC 1 Denunciar post Postado Março 5, 2007 Ola, primeiramente, adorei sua duvida, muito bem formulada, com parametros, e testes ^^ muito bom entaum, na documentação, esta assim mesmo com o const. Da uma olhada como esta lá class cc {const value = 'abc 123';function print_constant() {// access class constants inside of the classecho self::value;}}echo cc::value; // access class constants outside of the class e aqui funcionou direitinho ^^ http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Março 5, 2007 Ola, primeiramente, adorei sua duvida, muito bem formulada, com parametros, e testes ^^ muito bomDepois de sofrer muito tentando entender dúvidas mal-formuladas de alguns membros, acabamos virando quase experts em formulação de tópicos. :D Digo "quase expert" pois acho que não me expressei bem... o exemplo que você postou funciona perfeitamente, mas eu queria fazer a mesma coisa usando constantes, sacou? Veja este exemplo: class Teste { private $BERALDO = "Beraldo"; public function __construct() { echo $this->BERALDO; } } class Teste2 extends Teste { public function __construct() { echo $this->BERALDO;//linha 23 } } $t = new Teste; echo $t->BERALDO;//Linha 28 $t2 = new Teste2; Esse exemplo exibe "Beraldo" (ao instanciar Teste na linha 27) e gera este erro: Fatal error: Cannot access private property Teste::$BERALDO in C:\Apache2\htdocs\teste.php on line 28funcionamento perfeito. :D Se comentarmos a linha 28, é gerado este erro: Notice: Undefined property: Teste2::$BERALDO in C:\Apache2\htdocs\teste.php on line 23 Isso funcionou perfeitamente (e como esperado) com variáveis, mas quero que esse comportamento aconteça com constantes. Deu para entender? ;) ^^ Compartilhar este post Link para o post Compartilhar em outros sites
ScornInPC 1 Denunciar post Postado Março 5, 2007 Sim entuam, na documentação diz isso, que se cria constantes com o const private const value = 'abc 123';const value = 'abc 123'; Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Março 5, 2007 Qual a diferença "prática" entre declarar uma propriedade do objeto com valor definido e uma constante? Compartilhar este post Link para o post Compartilhar em outros sites
ScornInPC 1 Denunciar post Postado Março 5, 2007 é, realmente não sei ^^ Muito bom ponto esse Prog =)Cade o Adailton, Tmferreira, Anderson Mello, Helpa nois ai ^^ Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Março 5, 2007 Sim entuam, na documentação diz isso, que se cria constantes com o const private const value = 'abc 123'; const value = 'abc 123'; Não vi no Manual o primeiro exemplo citado por você. :( Se fizermos private const X = 10, aparece este erro de sintaxe: Parse error: syntax error, unexpected T_CONST, expecting T_VARIABLE in...O segundo exemplo funiona perfeitamente. Acho que não é possível dar visibilidade a constantes. Era só curiosidade mesmo. Continuo usando variáveis. []'s Compartilhar este post Link para o post Compartilhar em outros sites
ScornInPC 1 Denunciar post Postado Março 5, 2007 Ainda estou procurando algo sobre, =) Compartilhar este post Link para o post Compartilhar em outros sites
ScornInPC 1 Denunciar post Postado Março 5, 2007 Bom, fiz uns testes aqui, e cheguei a uma conclusão. <?phpclass Teste { const BERALDO = "BERALDO"; public function __construct() { echo "<br>Classe Teste: " . Teste::BERALDO; }}class Teste2 extends Teste { public function __construct() { echo "<br>Classe Teste2: " . Teste2::BERALDO; }}$t = new Teste;$t2 = new Teste2;?> ó, seguinte. Se a Classe Teste2 esta herdando tudo da teste. é claro que a constante vai existir nela, pq ela tem tudo que a outra tem. só que as constantes não não a mesma. Entendeu?? cada classe tem sua constante BERALDO. Só que as duas são iguais. Pensando assim Prog, consigo dizer qual a difereça tb. A diferença eh essa. Gastariamos memoria para colocar 2 coisas iguais, se podemos colocar só uma =) Mais isso só vai ter valor colocando essa constante global, fora da classe pai. Assim, quando incluirmos essa classe a uma outra classe, ela vai ser a mesma para as duas, e naum uma para cada um <?phpdefine("BERALDO", "BERALDO");class Teste { public function __construct() { echo "<br>Classe Teste: " . BERALDO; }}class Teste2 extends Teste { public function __construct() { echo "<br>Classe Teste2: " . BERALDO; }}$t = new Teste;$t2 = new Teste2;?> no primeiro código, as 2 constantes são constantes alocadas em lugares diferentes, com valores e nomes iguais no segundo código as duas são a mesma constante procurei alguma função para mostrar o endereço que a cosntante está alocada, mais naum achei, se alguem tiver essa função ai, por favor, tente imprimir o entedeço nos constructors http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Março 5, 2007 Desculpe-me pela demora... não tive como voltar aqui antes. :( Muito interessante o fato de serem criadas duas constantes no primeiro exemplo citado por você, Scorm. ;) Essa eu não sabia. Não costumo definir constantes dentro de classes, então continuarei fazendo isso, para economizar memória. :) Mas então acho que não há como evitar que a constante alocada em uma classe seja herdada por uma estendida dela (classe filha), né? Ainda é melhor usar variáveis, que podem receber atribuições de visibilidade. Obrigado pela ajuda! :D Abraços Compartilhar este post Link para o post Compartilhar em outros sites