从父类调用方法

时间:2013-07-24 14:44:07

标签: php

我真的对这个问题感到疯狂。 我无法在子类的静态方法中调用父类的方法。

这是我尝试的但它不起作用..

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 ::方法将相同的方法放在子类中,但没有...

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

3 个答案:

答案 0 :(得分:3)

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

 protected static $services;

从那里你需要在你的静态方法中引用。

 self::$services 

 static::$services 

在此上下文中引用self将引用定义引用的$ services属性。 static将从调用引用的类上下文引用该属性。有关详细信息,请参阅手册对late static binding

的说明

<强>更新

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

可能更接近你想要的。

答案 1 :(得分:0)

如果父方法make不是静态的: 您无法从子类的静态方法中调用父类的非静态方法。您是否考虑过将子方法设为非静态?我认为这是你最好的选择。

如果父方法make是静态的:

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

但这被称为Late Static Bindings,它是在PHP 5.3.0中引入的。它在旧版本中不起作用,所以要小心。

答案 2 :(得分:0)

  

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

这实际上是您的问题的答案。 static members of class的具体内容是 - 您可以在不创建对象的情况下使用它们。 $ this - 对象的引用,其中调用了上下文方法。

因此,尝试以这种方式查看问题 - 在静态成员中,您没有任何$ this。 您只能以这种方式使用父类的静态成员 - self :: method。

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