Entrar
Usuário novo? Cadastre-se
php-especialistas · Lista de discussão em Português sobre questões não triviais sobre a linguagem de programação PHP
? Você já é um associado? Entre no Yahoo!

Dicas

Você sabia...
Você pode receber várias mensagens em um único e-mail. Basta configurar suas opções de entrega de e-mail.

Mensagens

  Ajuda
Avançado
Saber se um método está sendo chamado pela instância ou pela pró   Lista de mensagens  
Responder | Encaminhar Mensagem #18650 de 18782 |
Re: [php-especialistas] Saber se um método está sendo chamado pela instância ou pela própria classe.

experimente isso

Exported from Notepad++ <?php class b extends a { } class a { public
function teste() { print get_class( $this ) . "<br/>\n"; } public functioncoisa
() { $this->teste(); } } $a = new a(); $a->coisa(); $b = new b(); $b->coisa
(); ?>




























e me diga se resolveu o problema

2009/7/7 dalmir da silva <dalmirdasilva@...>

>
>
> Boa noite. Gostaria de saber se existe uma função (ou uma solução) que me
> informasse se um método está sendo chamado pela instância ou por outro
> método da própria ou da classe filha.
>
> Eu sei que em princípio é a mesma coisa, a instância e a palavra $this, mas
> pro PHP não é.
>
> Pra ser mais claro:
>
> Estou criando um jogo em php. Nesse jogo "você" pode/deve "programar" a(s)
> sua(s) unidade(s) militar(es). Depois de programada ela irá "combater" com
> outra unidade de alguma outra pessoa, essa também programada pelo seu
> "dono". (a historinha está meio vulgar, mas não é isso que importa), esse
> jogo será baseado em turnos; Supondo que você programasse um fuzileiro.
> Cada
> turno ele tem N movimentos, enquanto anda ele os gasta. No inicio de cada
> turno é recarregado seus movimentos.
>
> A classe base de um fuzileiro seria algo parecido com:
> abstract class FuzileiroBase {
> private $movimentos = 10;
> protected function _setMovimentos( $movimentos ) {
> $this->movimentos = $movimentos;
> }
> protected function _getMovimentos() {
> return $this->movimentos;
> }
> }
>
> A classe Avançada seria algo como:
> abstract class FuzileiroAdvanced extends FuzileiroBase {
> protected function anda() {
> $this->_setMovimentos( $this->_getMovimentos() - 1 );
> }
> public function _recarregaMovimentos() {
> $this->_setMovimentos( 10 );
> }}
>
> Evidente que é pra desconsiderar n fotos/metodos que eu ocultei pq nao sao
> relevantes. Ate aqui temos uma class (assim eu defini) base que tem os
> atributos privados e metodos protegidos, somente metodos que alteram os
> atributos; outra classe avançada que conterá os metodos úteis, os metodos
> dessa classe serão chamados pela classe final que será a unidade mulitar em
> sí. Vamos a ela:
>
> final class Vicente extends FuzileiroAdvanced implements FuzileiroEventos {
> public function _onTurnStart() {
> $this->anda();
> }
> }
>
> A ideia é que as açoes da unidade são implementadas "em cima" dos eventos
> que acontecem a ela. Daria pra implementar uma maquina de estados
> etc...(nao
> vem ao caso)
>
> Agora uma batalha de 5 turnos seria seria algo como:
>
> $vicente = new Vicente();
> for( $i = 0; $i < 5; $i++ ) {
> $vicente->_recarregaMovimentos();
> $vicente->_onTurnStart();
> }
>
> Claro que aqui ele nao lutaria sozinho, teria outras unidades, teria um
> campo de batalha, teria uma batalha especifica... (tudo isso ignorado);
>
> Agora vem os problemas:
>
> Pra se evitar Cheat nao pode ser permitido que o fuzileiro ande e
> recarregue
> seus movimentos, na verdade o metodo _recaregarMovimentos nunca pode ser
> chamado pela classe Vicente, somente pela instancia $vicente. Poderia-se
> resolver isso usando os próprios recursos da POO (protected, private...)
> mas
> o meu problema é que a lógica está inversa, eu preciso que a instância
> tenha
> liberdade pra chamar determinados métodos e que a classe final não possa
> chama-los. Pensei em usar "_" (underline) na frente dos métodos que não
> podem ser chamados pela classe final, mas isso é muito frágil.
>
> Pra entender melhor o jogo eu teria que explicar mais, mas até aqui eu acho
> é o suficiente pra entender o que eu havia perguntado:
>
> Preciso que os métodos que começam com "_" saibam se estão sendo chamados
> pela instância ou pela classe filha, algo assim:
>
> public function _recarregaMovimentos() {
> SE NAO ESTA SENDO CHAMADA PELA INSTANCIA($vicente) RETORNA
> $this->_setMovimentos( 10 );
> }
>
> Bom, era isso; Abração!
>
> --
> ________________________
> Dalmir da Silva
> +55 55 30262038
> +55 55 9925 4645
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>



--
O Blaine - http://thiagomata.blogspot.com/
/|\
|
/ \


[As partes desta mensagem que não continham texto foram removidas]




Qui, 9 de Jul de 2009 1:13 pm

thiago_mata
Offline Offline
Enviar e-mail Enviar e-mail

Encaminhar Mensagem #18650 de 18782 |
Expandir mensagens Nome/E-mail Classificar por data

Boa noite. Gostaria de saber se existe uma função (ou uma solução) que me informasse se um método está sendo chamado pela instância ou por outro método...
dalmir da silva
dalmirdasilva
Offline Enviar e-mail
9 de Jul de 2009
4:34 am

experimente isso Exported from Notepad++ <?php class b extends a { } class a { public function teste() { print get_class( $this ) . "<br/>\n"; } public...
Blaine
thiago_mata
Offline Enviar e-mail
11 de Jul de 2009
6:17 am

Bom dia Dalmir! Primeiramente, parabéns pela idéia do projeto. Mesmo tendo explicado 0,01% do jogo eu já me interessei (me lembrou o travian). Vamos ao...
Rodrigo Régis
regisnew
Offline Enviar e-mail
11 de Jul de 2009
6:17 am

Dalmir! Diz aí se o instanceof solucionou! -- Cordialmente Rodrigo Régis Palmeira regisbsb@... www.rodrigoregis.com.br 2009/7/9 Rodrigo Régis...
Rodrigo Régis
regisnew
Offline Enviar e-mail
11 de Jul de 2009
6:17 am

http://br.php.net/manual/en/function.is-subclass-of.php http://br.php.net/manual/en/ref.classobj.php Isso ajuda ?? []'s...
Marcello
phpmafia
Offline Enviar e-mail
13 de Jul de 2009
8:05 pm

Leia sobre o método mágico __call() acho que pode te ajudar ________________________________ From: dalmir da silva <dalmirdasilva@...> To:...
Luís Otavio
l_surf_campeche
Offline Enviar e-mail
13 de Jul de 2009
8:05 pm
Avançado

Copyright © 2009 Yahoo! do Brasil Internet Ltda. Todos os direitos reservados.
Política de Privacidade - Termos do Serviço - Diretrizes - Ajuda