Pergunta

Abaixo está uma hierarquia e código de exemplo de classe. O que eu estou procurando é uma maneira de determinar se 'ChildClass1' ou 'ChildClass2' teve o método estático WhoAmI () chamado sobre ele sem re implementando-lo em cada classe criança.

<?php

abstract class ParentClass {

    public static function whoAmI () {

        // NOT correct, always gives 'ParentClass'
        $class = __CLASS__;

        // NOT correct, always gives 'ParentClass'. 
        // Also very round-about and likely slow.
        $trace = debug_backtrace();
        $class = $trace[0]['class'];

        return $class;
    }
}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ParentClass'
// Want to show 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ParentClass'
// Want to show 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";
Foi útil?

Solução 3

Agora que o PHP 5.3 está amplamente disponível na natureza, eu queria montar uma resposta resumo para esta questão para refletir técnicas recentemente disponíveis.

Como mencionado em outras respostas, PHP 5.3 introduziu tarde estática Encadernação através de um novo static palavra-chave. Como assim, um novo get_called_class() função também está disponível que só pode ser utilizado dentro de um método de classe (instância ou estática).

Para a finalidade de determinar a classe como foi perguntado nesta questão, a função get_called_class() é apropriado:

<?php

abstract class ParentClass {

    public static function whoAmI () {
        return get_called_class();
    }

}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";

As notas usuário contribuíram para get_called_class() incluem algumas implementações de amostra que devem trabalhar em PHP 5.2, bem, fazendo uso de debug_backtrace().

Outras dicas

Eu acredito que você está se referindo é um bug php conhecido. PHP 5.3 é com o objetivo de abordar esta questão com um novo recurso ligação tardia estática.

http: // www .colder.ch / news / 2007/08/24 / 28 / late-estáticos-bindings-expl.html

identificação de classe é muitas vezes um sintoma de não bem compreendido Polimorfismo.

Os clientes de ChildClass1 e ChildClass2 não precisa distinguir entre eles.

Não há lugar onde qualquer classe deve perguntar sobre someObject.whoAmI().

Sempre que você tem o desejo de escrever if someObject.whoAmI() == 'ChildClass1' { do X(someObject) } você deve realmente adicionar um método X() ao ParentClass com várias implementações nos diversos ChildClasses.

Este tipo de "tipo de tempo de execução de identificação" quase sempre pode ser substituído com desenhos de classe adequadamente polimórficas.

A partir do PHP 5.3 vai ser possível com o uso do estática palavra-chave , mas por enquanto não é possível.

No. Esperar para PHP 5.3.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top