Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom Galera, surgiram mais algumas dúvidas sobre OOTenho lido muito sobre isso pela net, e tenho aprendido muito aqui no fórum tb!Obrigado a todos que ajudaram.Bom, "venhamos" as dúvidas1 - Buscando sobre material OO no forum, eu achei um tópico muito interessante do Douglas, aonde ele relata suas dúvidas sobre programação orientada a objetos.E uma questão bem interessante que eu vi no fórum, e vou ressalta-la novamente é:
Classe Conta- conta;- saldo;Classe Usuario- nome;- cpf; ... Então, eu lhe pergunto... Onde você acha que ficaria mais coerente colocar um método criarConta()??? Se a gente parar para pensar, bem... quem cria a conta, é o usuário e é o usuário quem usa a conta, mas poxa, faz algum sentido tem métodos como criarConta(), transferirValor(), getNumeroConta(), setNumeroConta() e fecharConta() na classe Usuário?
Bom, gostaria de levantar essa questão aqui, uma vez que ela não foi respondida anteriormente.2 - A outra dúvida é:tenho a primeira Classeclass MinhaClasse { protected $Variavel = 'X'; function getVar() { return $this->Variavel; } }Eu só consigo acessar o valor da variavel por uma outra classe, caso eu declare tanto o métodoQuanto o atributo como "static" ???ou seja, só consigo acessar o valor da variavel x dessa forma:class MinhaClasse { public static $Variavel = 'X'; public static function getVar() { return self::$Variavel; } }class OutraClasse extends MinhaClasse { public static function doisPontosDuplo() { echo parent::getVar(); }}E uma questão bem interessante que eu vi no fórum, e vou ressalta-la novamente é:
>
Classe Conta
- conta;
- saldo;
Classe Usuario
- nome;
- cpf;
... Então, eu lhe pergunto... Onde você acha que ficaria mais coerente colocar um método criarConta()??? Se a gente parar para pensar, bem... quem cria a conta, é o usuário e é o usuário quem usa a conta, mas poxa, faz algum sentido tem métodos como criarConta(), transferirValor(), getNumeroConta(), setNumeroConta() e fecharConta() na classe Usuário?
Bom, gostaria de levantar essa questão aqui, uma vez que ela não foi respondida anteriormente.
Cara, eu acho que você pensar em objetos dentro de um sistema é ligeiramente diferente de você pensar em objetos na vida real. No sistema, também acho que o certo seria criar esses métodos dentro da classe "Conta" (ou numa outra, como "Administrador", por exemplo). Até porque, mesmo na vida real, não é o usuário quem cria a conta... ele apenas faz uma solicitação.
2 - A outra dúvida é:Eu só consigo acessar o valor da variavel por uma outra classe, caso eu declare tanto o método
Quanto o atributo como "static" ???
ou seja, só consigo acessar o valor da variavel x dessa forma:
class MinhaClasse {
public static $Variavel = 'X';
public static function getVar() {
return self::$Variavel;
}
}
class OutraClasse extends MinhaClasse {
public static function doisPontosDuplo() {
echo parent::getVar();
}
}
A resposta é "não". Você tem que declará-las como "static" somente se você quiser acessá-las estaticamente... que são em situações que um objeto não precisaria ser instanciado, pois não é possível chamar a variável $this dentro de um método estático.
Cara, preciso sair agora, mas fico devendo um bom exemplo com variáveis e métodos estáticos. Eu posto aqui mais tarde...
Abraços!
Bom em relação a dúvida 1 , não faria sentido os métodos (criarConta() e etc) na classe usuário, pois em OO não "interessa" quem vai criar uma conta, consultar uma conta, mas sim que existe o método pra que alguém acesse.
>
1 - Buscando sobre material OO no forum, eu achei um tópico muito interessante do Douglas, aonde ele relatasuas dúvidas sobre programação orientada a objetos.E uma questão bem interessante que eu vi no fórum, e vou ressalta-la novamente é:
Classe Conta- conta;- saldo;Classe Usuario- nome;- cpf;... Então, eu lhe pergunto... Onde você acha que ficaria mais coerente colocar um método criarConta()??? Se a gente parar para pensar, bem... quem cria a conta, é o usuário e é o usuário quem usa a conta, mas poxa, faz algum sentido tem métodos como criarConta(), transferirValor(), getNumeroConta(), setNumeroConta() e fecharConta() na classe Usuário?
Bom, gostaria de levantar essa questão aqui, uma vez que ela não foi respondida anteriormente.
Lembro deste post, foi eu quem comecei a pergunta que gerou essa resposta. Estava bem confuso e o Prog gentilmente me ajudou a esclarecer as coisas. [http://forum.imasters.com.br/index.php?s=&...st&p=547083](http://forum.imasters.com.br/index.php?s=&showtopic=171993&view=findpost&p=547083)Quando você diz que a pergunta não foi "respondida", é porque essa pergunta é daquelas no estilo do Prog; aquelas perguntas que ele não diz a resposta explicitamente, porém a resposta está no contexto. :) Leia do início da minha pergunta e acho que você entenderá, embora eu também ache que minhas perguntas ficaram confusas. Qualquer coisa, pergunte. [http://forum.imasters.com.br/public/style_emoticons/](http://forum.imasters.com.br/public/style_emoticons/)default/thumbsup.gif Aliás, esse tópico foi um ótimo aprendizdo para todos, contou com a ajuda do Fabyo, do Illidan, do Prog, enfim, foi uma ótima discussão.2 - Só complementando a resposta do Illidan, teste esse código e você verá que funciona, ou seja, acessamos normalmente o valor da variável declarado na classe "mãe". Lembrando que para isso estamos usando o próprio método getter da classe "mãe", sendo essa forma a mais "correta".class MinhaClasse { protected $variavel = 'X na classe MinhaClasse'; public function GetVariavel() { return $this->variavel; }}class OutraMinhaClasse extends MinhaClasse { public function GetX() { return parent::GetVariavel(); }}$obj_outra = new OutraMinhaClasse();echo $obj_outra->GetX();Illidan, aguardo o seu exemplo de acesso a membros estáticos. :) Também sou um iniciante em OOP, aprendi muita coisa aqui no fórum e estou aprendendo bastante com seus tópicos também. Abraço.Falaaa meuu velho!!Puts, valeu, era isso que eu precisava, eu tinha pensado em algo parecido, mas fiz alguma kgada no inicio e por isso não deu certo.Valeu mesmo!Valeu Illidan tb, e como o Epyllion tb estou no aguardo de exemplos.Enqto isso, vou procurando mais documentações na net. oque eu achar de interessante eu posto neste tópico!Fuiss!!
Também sou um iniciante em OOP, aprendi muita coisa aqui no fórum e estou aprendendo bastante com seus tópicos também.
Que ótimo! :) Fico muito feliz em saber disso...
Esse tópico que você postou foi bem legal, mesmo... eu nem lembrava, mas eu tinha citado um exemplo com o "static" nele:
> Quanto ao modificador static, serve para que você acesse uma variável ou uma função estaticamente, ou seja, sem precisar criar o objeto. Por conta disto, você não pode utilizar a variável "$this" dentro de um método estático, pois o objeto pode não ter sido criado quando ele for chamado. Acaba sendo como uma variável ou função normal, só que está encapsulada dentro classe.
Vou utilizar um exemplo da linguagem Java pra mostrar a utilidade do modificador "static". Nesta linguagem, você tem a classe "Math", em que as principais funções matemáticas estão definidas. Se você precisar de um "round", não precisa criar um objeto do tipo "Math" só pra executar essa tarefa. Chama o método estaticamente: Math.round(valor);
No PHP, a sintaxe seria: Math::round($valor);
Além desse, acabo de lembrar do outro que eu vi na linguagem Java, também... (aliás, estudar um pouco de Java é ótimo pra quem quiser aprender mais sobre programação orientada a objetos).
Vamos supor que você crie uma classe "Color" no seu sistema:
class Color {
protected $red = 0;
protected $green = 0;
protected $blue = 0;
function __construct($color = null) {
if ($color !== null) {
$this->setColor($color);
}
}
}
Neste exemplo, poderia haver uma pequena confusão para o programador na hora em que ele quisesse criar uma novo objeto do tipo "Color", pois ele poderia se perguntar: "como eu devo passar a cor pelo construtor?". Seria um Array com 3 valores, um para cada cor do sistema RGB? Ou seriam 3 parâmetros separados? Ou ainda um número inteiro correspondente ao valor em hexadecimal de cada cor? Pelo método "setColor", você pode tornar sua classe flexível para aceitar todos esses tipos de parâmetros. Mas e quando você não lembrar quais cores devem ser misturadas pra se criar um amarelo, por exemplo?
Na classe "Color", em Java, você possui algumas variáveis estáticas que ajudam nisso. No caso do Java, essas variáveis possuem o modificador "final", além do "static", o que torna essas variáveis naquilo que chamamos de "constante", só que está encapsulada numa classe. O código similar em PHP seria:
class Color {
protected $red = 0;
protected $green = 0;
protected $blue = 0;
const BLACK = 0x000000;
const WHITE = 0xFFFFFF;
const RED = 0xFF0000;
const YELLOW = 0x00FFFF;
function __construct($color = null) {
if ($color !== null) {
$this->setColor($color);
}
}
}
$cor = new Color(Color::YELLOW);
Portanto, essas constantes da classe são como variáveis estáticas, com a diferença que não podem ter seu valor alterado.
Beleza? Deu pra esclarecer um pouco mais sobre esse assunto de acessar um membro da classe de forma estática?
Abraços!
p**** velho, valeu mesmo.
http://forum.imasters.com.br/public/style_emoticons/default/clap.gif Ajudou muito mesmo !
Valeu[]'s
Obrigado, Illidan. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Abraço.
http://forum.imasters.com.br/public/style_emoticons/default/joia.gif Valeu, mas sua resposta não foi la, muito esclarecedora cara ... mas valeu mesmo assim
e com relação a segunda dúvida. Alguém tem idéia se existe outra forma !?