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]