Ir para conteúdo

Arquivado

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

Beraldo

Visibilidade de Constantes de uma Classe

Recommended Posts

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

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

Ola, primeiramente, adorei sua duvida, muito bem formulada, com parametros, e testes ^^ muito bom

Depois 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 28

funcionamento 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

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

é, 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

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

Ainda estou procurando algo sobre, =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.