Re: [PHP-ES] llamada estática a método de cl ase, detectada como llamada dinámica
[email protected] (Manu)
| Newsgroups | php.general.es |
|---|---|
| Message-ID | <[email protected]> |
Por si interesa, esta es la expliacion:
http://bugs.php.net/bug.php?id=47891
Manu escribió:
> Gracias Mauricio,
>
> tienes razon en que no es un metodo definido como estatico. Pero esta
> asi porque quiero que este metodo se pueda llamar de estas dos maneras:
>
> Forma A)
> $actor = new Actor ();
> $tipos = $actor->getTipos ();
>
> y también:
>
> Forma B)
> $tipos = Actor::getTipos ();
>
> Si lo defino como estático, la pseudovariable $this nunca es accesible
> desde el metodo getTipos (). Y necesito que getTipos () pueda
> comprobar si se ha llamado de la Forma A o de la Forma B.
>
> El problema esta en que llamando al metodo de la Forma B, si dentro
> consulto si $this esta creado me dice que si, detectando que se ha
> llamado de la Forma A cuando en realidad lo he llamado con la Forma B.
>
> Mauricio Cuenca escribió:
>> Actor::getTipos() no es un método estático. Debes definirlo como tal
>> en el prototipo de la función:
>>
>> public static function getTipos() {}
>>
>> --
>> Mauricio
>>
>> On Mar 22, 2010, at 17:00, Manu <[email protected]> wrote:
>>
>>> Hola,
>>>
>>> tengo una situación en la que no sé si se trata de un bug de php o
>>> una funcionalidad conocida del mismo. Lo he probado en php 5.2.12 y
>>> también en php 4.4.9. Se reproduce en ambos y no encuentro
>>> documentacion al respecto.
>>>
>>> Me explico y os paso un código de ejemplo muy simple.
>>>
>>> - Tenemos dos clases Actor y Director.
>>> - Creo un objeto del tipo Actor ($actor1) y llamo a su método
>>> serDirigido (). Actor->serDirigido (); // llamada desde una
>>> instancia de Actor. No es llamada estatica.
>>> - Desde este método llamo estáticamente a un método de la clase
>>> Director. Director::dirigir ();
>>> - Desde este segundo método, llamo estáticamente a un método de la
>>> clase Actor. Actor::getTipos ().
>>>
>>> El problema está en que si compruebo si existe $this dentro de
>>> Actor::getTipos (), resulta que $this, SI EXISTE y está inicializado
>>> con el objeto que disparo esta pila de llamadas; $actor1. Yo pienso
>>> que $this no debería estar creado porque he invocado a la clase de
>>> forma estática y no como método de una instancia de la clase.
>>>
>>> Este es el código de ejemplo:
>>>
>>> <?php
>>>
>>> class Director
>>> {
>>> public function dirige ()
>>> {
>>> // llamo a un metodo estatico de Actor
>>> $tipos = Actor::getTipos ();
>>> }
>>> }
>>>
>>> class Actor
>>> {
>>> public $actor_id;
>>>
>>> public function __construct($actor_id)
>>> {
>>> $this->actor_id = $actor_id;
>>> }
>>>
>>> public function serDirigido ()
>>> {
>>> Director::dirige();
>>> }
>>>
>>> public function getTipos ()
>>> {
>>> if(isset($this) && get_class($this) == __CLASS__)
>>> {
>>> echo "Actor es un objeto...\n";
>>> print_r ($this);
>>> }
>>> else
>>> {
>>> echo "Actor:: es estatico ...";
>>> }
>>> }
>>> }
>>>
>>> $actorA = new Actor ("malo Malisimo");
>>> $actorA->serDirigido();
>>>
>>> ?>
>>>
>>> Sería fácil solucionar este problema. Pero necesito saber a que se
>>> debe que $this esté inicializado al llamar desde un método estático.
>>> ¿Puede deberse a un bug de php?
>>> Gracias y un saludo,
>>> Manu.
>>>
>>>
>>>
>>> --
>>> PHP Spanish Localization Talk Mailing List (http://www.php.net/)
>>> To unsubscribe, visit: http://www.php.net/unsub.php
>>>
>
>