Jump to content


Photo

Variáveis Dentro De Classes Com Funções


  • Faça o login para participar
5 replies to this topic

#1 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 12/09/2007, 10:49

Estou mechendo numas classes aqui (não fui eu quem as fiz ;p).
O cara utiliza variaveis dentro do escopo da classe, tanto como os getters & setters dela.

Problema (eu acho) que a classe tem métodos de acesso ao banco de dados tambem, que fazem selectcs, updates,inserts,deletes, etc.

Quando ele quer passar o objeto da classe, ele simplesmente reinstância a classe:
ex:
<?php
	   class Foo {
		private $bar;


				public function __construct($var = null) {
		  $this->bar = $var;

				}

		public static function funcaoQueFazAlgo($var) {
				   return new Foo($var);
				}

		public function getBar() {}
				public function setBar() {}
	   }
?>

Eu fico pensando o que ele teve na cabeça para fazer isso, pois quando ele retorna o objeto da classe instanciado, ele dá acesso as funcoes da classe! Eu posso muito bem chamar dentro do template (Smarty) as funcoes de insert,update,select, etc.

Fico imaginando se alguem descobre isso, pode fazer a festa, acho uma tremenda falta de segurança o.o'

Geralmente eu uso o padrão Java Beans (uma classe Form, uma Action e uma Classe com as funcoes importantes). E retorno sempre o Form, que só tem as variáveis mesmo.

Mas não posso mudar o escopo do projeto né :(
Queria saber se tem alguma maneira de eu assegurar que quando eu instanciar a classe no retorno, nao dar acesso as funções importantes.

[]'s

Edição feita por: savior, 12/09/2007, 11:29.
alterei o nome da classe pra Maiúsculo

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#2 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 12/09/2007, 11:24

Pelo que eu vi aí, a visibilidade da variável da classe foi só pra meter mala ... ^^

Você chama outra classe ou errou a digitação ? class foo(), e new Foo() ?

Eu não sou um ás em OOP, mas pareceu uma classe normal ... inteiramente pública, porque mesmo que ele tenha setado a variável como private, ele disponibilizou uma função pública para alterar o valor da mesma.
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#3 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 12/09/2007, 11:30

Eu errei a digitação lá em cima, corrigi <_<'

Pus eh .... o problema n é nem alterar o valor da variável

O problema é que eu tenho acesso a funções de select,update,delete dentro da classe quando eu retorno uma instância dela :S

Falei pro cara que eu ganho acesso aos métodos da classe fazendo desse jeito, mas ... acha ele vai ouvir?

O pior que se esse pepino estourar, quem se ferra sou eu que to responsável pelo projeto <_<'

Quero descobrir uma maneira de evitar o acesso as funções da classe

Edição feita por: savior, 12/09/2007, 11:31.

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#4 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 12/09/2007, 11:41

Não entendi ainda o problema .... a função que você diz ser capaz de efetuar o select, etc é a getBar() ?

Você queria uma maneira de não permitir executar essa função de fora da clase diretamente ? como se alterasse a visibilidade da mesma para private ?
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#5 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 12/09/2007, 12:11

Um trecho de código para você entender (:

$chave = Licenca::procuraLicencaSerial($arrValores['tf_chave']);
if (intval($chave->getID()) > 0) {
//Somente cancela a chave de Licenca se a mesma estiver associada a um cliente.
 if ($chave->getIDCli() != 1) {
	switch ($arrValores['acao']) {
		case 'ativar':
			if ($chave->isCancelada()) {
				if (Licenca::liberarLicenca($chave->getID(), $chave->getIDCli()))
					Utils::showSucesso("index.php?modulo=chaves&amp;acao=cancela&amp;a=libera", "Chave Ativada com sucesso.");
				else {
					Utils::showErro(
						method_exists(Licenca::getErrors(),'getMessage') ?
						Utils::traceException(Licenca::getErrors()) :
						"N&atilde;o foi poss&iacute;vel cancelar a Licen&ccedil;a."
								);
				}
			} else
				Utils::showErro("N&atilde;o foi poss&iacute;vel ativar a Licen&ccedil;a. Pois ela j&aacute; se encontra <strong>Ativada</strong>.");
			break;
Essa licenca tem o problema que eu citei ali na classe de exemplo.

A variável $chave recebe um objeto Licenca.

Se eu quisesse no lugar de:
Licenca::liberarLicenca($chave->getID(), $chave->getIDCli());
Licenca::getErrors();
Eu poderia utilizar:
$chave->liberarLicenca($chave->getID(), $chave->getIDCli());
$chave->getErrors();

Entendeu o que eu quis dizer? A variavel recebe a classe toda até suas funções o.o
Algumas são estáticas, outras não.

No smarty direto eu posso fazer o que eu citei ali em cima, se eu quiser.

Magina só a mente malvada pode fazer:
php
print_r (get_class_methods($chave));

Ele vai ver a lista de todos os métodos, dae é só ele ir zuando com os métodos.

Queria não deixar quando a Classe fosse intânciada num retorno numa variável não deixar acessar os métodos.


(y)

Edição feita por: savior, 12/09/2007, 12:12.

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#6 Renan Gonçalves

Renan Gonçalves

    Web Developer

  • Usuários
  • 771 posts
  • Sexo:Masculino
  • Localidade:São Paulo, SP
  • Interesses:Programar PHP, Java (e JSP), Javascript (com Ajax, claro), Ruby (on Rails) !

Posted 12/09/2007, 15:20

Savior,


Esses métodos que você não quer que sejam vistos são usados em outras classes ?
Porque, veja bem, se você só utiliza esses métodos dentro dessa classe você pode mudar a assinatura para private.



[]'s
PS: Você quis dizer Enterprise Java Beans (EJB) ?

Renan Gonçalves
renan.saddam@gmail.com
(WebSite / Gmail / orkut / Windows Live! Messenger
)

"Aquele que se define se limita."





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq