从父类调用方法


Call a method from parent class

这个问题真的让我抓狂。我无法在子类的静态方法中从父类调用方法。。

这是我试过的,但不起作用。。

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

我试着把它变成静态的,我试着通过调用父方法parent::method把相同的方法放在子类中,但什么都没有。。。

我是OOP新手,有什么帮助吗?

对于静态调用中的访问,属性必须定义为静态以及

 protected static $services;

从那里开始,你需要在你的静态方法中参考。

 self::$services 

 static::$services 

在此上下文中引用self将引用定义引用的$services属性。static将从调用引用的类上下文中引用属性。有关更多信息,请参阅手册对后期静态绑定的说明

更新

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

可能更接近你想要的。

如果父方法make不是静态的:不能从子类的静态方法调用父类的非静态方法。你有没有考虑过让child方法不是静态的?我认为这是你最好的选择。

如果父方法make是静态的:

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

但这被称为后期静态绑定,它是在PHP 5.3.0中引入的。它在旧版本中不起作用,所以要小心。

致命错误:不在对象上下文中时使用$this

这实际上是你问题的答案。类的静态成员的特性是-您可以在不生成对象的情况下使用它们$this-对象的引用,在该对象中调用了上下文方法。

所以试着用这种方式来看待这个问题——在静态成员中,你们并没有任何$this。您只能以这种方式使用父类的静态成员-self::方法。

或者,您实际上可以在父类上创建一个对象,并使用"动态"表示法中的任何"动态"方法,但这会让您以后更加疯狂,相信我)