2013-07-24 6 views
0

Я действительно схожу с ума от этой проблемы. Я не могу вызвать метод из родительского класса в статическом методе класса ребенка ..Вызвать метод из родительского класса

Это то, что я пытался, но он не работает ..

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']); 
    } 

Когда я называю $this->service Я получаю:

Fatal error: Using $this when not in object context 

я пытался сделать, что как статическим, я пытался ставить один и тот же метод в классе ребенка с помощью вызова метода родительского родительского :: метода, но ничего ...

Я новичок в ООП, любая помощь?

+3

Вы используете '$ this- 'в статической функции, это неправильно, потому что это может быть вызвано статически или в контексте объекта. – vicentazo

+0

@vicentazo благодарит за то, что сказал мне то, что я уже знаю ... –

+0

Здесь нет скобок? '$ this-> service = new service();' – MurifoX

ответ

3

Для доступа в статическом вызове свойство должно быть определенно статическим и

protected static $services; 

Оттуда вам нужно ссылаться в пределах вашего статического Митосе либо как.

self::$services 

или

static::$services 

Реферирование self в этом контексте будет ссылаться на $ услуги недвижимость, где определена ссылка. static будет ссылаться на свойство из контекста класса, на который ссылалась ссылка. Для получения дополнительной информации см, что руководство должно сказать о late static binding

UPDATE

Основываясь на том факте, что custom расширяет service в этом случае я сомневаюсь, что это то, что вы действительно после. Определение класса, например:

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']); 
    } 
} 

Может быть ближе к тому, что вы хотите.

+0

Теперь я получаю Неустранимая ошибка: вызов функции-члена make() для не-объекта –

+2

@diegopucci. Назначение в вашем конструкторе также должно использовать это обозначение. – Orangepill

+0

Я не знал, что вы можете использовать 'static ::'. –

0

Если родительский метод, make не статичен: Вы не может вызова не-статический метод из родительского класса из статического метода класса ребенка. Вы считали, что метод ребенка не статичен? Я думаю, что это ваш лучший вариант здесь.

Если родительский метод make статична:

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

Но это называется Late Static Bindings, который был введен в PHP 5.3.0. Он не будет работать в более старых версиях, поэтому будьте осторожны с этим.

0

Fatal error: Using $this when not in object context

Это на самом деле ответ на ваш вопрос. Специфика static members of class - вы можете использовать их без создания объекта. $ this - ссылка для объекта, в которой был вызван контекстный метод.

Так что старайтесь искать проблему таким образом - в статическом члене у вас нет никаких $ this. Вы можете использовать статические члены родительского класса таким образом - self :: method.

Или, вы можете создать объект на родительский класс и использовать любой «динамический» метод в «динамическом» нотации, но это сделает вас еще более сумасшедший позже, поверьте)

Смежные вопросы