这个问题真的让我抓狂。我无法在子类的静态方法中从父类调用方法。。
这是我试过的,但不起作用。。
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::方法。
或者,您实际上可以在父类上创建一个对象,并使用"动态"表示法中的任何"动态"方法,但这会让您以后更加疯狂,相信我)