2013-07-24 4 views
0

Je deviens vraiment fou avec ce problème. Je ne suis pas en mesure d'appeler une méthode de la classe parente dans une méthode statique d'une classe enfant ..Appeler une méthode de la classe parente

C'est ce que j'ai essayé, mais il ne fonctionne pas ..

class custom extends service { 

    private $service; 

    function __construct() { 
     parent::__construct(); 
     $this->service = new service; 
    } 

    public static function activematches($callback) { 

     $select_by_user = parent::$db->select('matches', '*', array('user_id' => $user_id, 

     if (count($select_by_user) == 0 && count($select_by_opponent) == 0) 
      parent::$check->send('11'); 
     else 
      $this->service->make($callback['request'], $callback['data']); 
    } 

Quand j'appelle $this->service Je reçois:

Fatal error: Using $this when not in object context 

J'ai essayé de faire que statique, j'ai essayé de mettre la même méthode dans la classe des enfants en appelant la méthode :: mère méthode mère, mais rien ...

Je suis nouveau à POO, toute aide?

+3

Vous utilisez '$ cette 'dans une fonction statique, c'est faux car il peut être appelé statiquement ou dans un contexte d'objet. – vicentazo

+0

@vicentazo merci de me dire quelque chose que je sais déjà ... –

+0

Les parenthèses ne sont pas manquantes ici? '$ this-> service = nouveau service();' – MurifoX

Répondre

3

Pour l'accès dans une invocation statique, la propriété doit être définie statique et

protected static $services; 

De là, vous devez faire référence au sein de votre methos statique non plus.

self::$services 

dans ce contexte ou

static::$services 

Référencer self fera référence aux biens de services $ où la référence est définie. static fera référence à la propriété à partir du contexte de classe sur lequel la référence a été appelée. Pour plus d'informations, voir ce que le manuel dit au sujet de late static binding

MISE À JOUR

Basé sur le fait que custom étend service dans ce cas, je doute que ce soit ce que vous êtes vraiment après. Une définition de classe comme:

class custom extends service { 
    public function activematches($callback, $user_id) { 

     $select_by_user = $this->db->select('matches', '*', array('user_id' => $user_id)); 
     if (count($select_by_user) == 0 && count($select_by_opponent) == 0) 
      $this->check->send('11'); 
     else 
      $this->make($callback['request'], $callback['data']); 
    } 
} 

Peut être plus proche de ce que vous voulez.

+0

Maintenant, je reçois erreur fatale: Appel à une fonction membre make() sur un non-objet –

+2

@diegopucci L'affectation dans votre constructeur doit également utiliser cette notation. – Orangepill

+0

Je ne savais pas que vous pouviez utiliser 'static ::'. –

0

Si la méthode mère, make n'est pas statique: Vous ne pouvez pas appel d'une méthode non statique de la classe parente d'une méthode statique de la classe enfant. Avez-vous envisagé de rendre la méthode enfant non statique? Je pense que c'est votre meilleure option ici.

Si la méthode mère make est statique:

parent::make($callback['request'], $callback['data']); 

Mais ce qu'on appelle Late Static Bindings qui a été introduit en PHP 5.3.0. Cela ne fonctionnera pas dans les anciennes versions, alors soyez prudent avec ça.

0

Fatal error: Using $this when not in object context

Ceci est en fait la réponse à votre question. Le spécifique de static members of class est - vous pouvez les utiliser sans faire un objet. $ this - référence pour l'objet, dans quelle méthode de contexte a été appelée.

Alors essayez de regarder le problème de cette façon - dans static member vous n'avez pas $ this. Vous ne pouvez utiliser que des membres statiques de la classe parent de cette manière - self :: method.

Ou, vous pouvez réellement créer un objet sur la classe mère et utiliser toute méthode « dynamique » en notation « dynamique », mais cela vous rendre encore plus fou plus tard, croyez-moi)

Questions connexes