PHP OOP:从子级调用方法父级

时间:2013-11-03 18:29:35

标签: php oop

我是这堂课

class Controller {

    protected $f3;
    protected $db;


    function __construct()
    {

        $f3=Base::instance();

    $db=new \DB\SQL('mysql:host=62.xxx;port=3306;dbname=Sqlxxx','xxxx','xxxxx');

    $this->f3=$f3;
    $this->db=$db;

    $this->db->exec('SET CHARACTER SET utf8');
    $this->db->exec('SET time_zone = \'+00:00\'');

    }
}

和他的孩子

class WebController extends Controller {
    public function login()
    {
        $db=new \DB\SQL('mysql:host=62.xxx;port=3306;dbname=Sqlxxx','xxxx','xxxxx');
        $user = new \DB\SQL\Mapper($db, 'users');
        $auth = new \Auth($user, array('id'=>'username', 'pw'=>'password'));
    }
 }

我需要在WebController中使用另一个$db对象,你可以注意到目前我做了重复的代码。

如何在没有重复代码的情况下从父级调用$ db?我确实试过了

$db = parent::__construct();
没有运气。谢谢

2 个答案:

答案 0 :(得分:1)

你应该提取creaing $ db到方法(createConnection),即:。

class Controller {
    protected $f3;
    protected $db;


    function __construct()
    {
        $this->f3=Base::instance();
        $this->db=$this->createConnection();  
    }
    protected function createConnection() {
        $db = new \DB\SQL('mysql:host=62.xxx;port=3306;dbname=Sqlxxx','xxxx','xxxxx');
        $db->exec('SET CHARACTER SET utf8');
        $db->exec('SET time_zone = \'+00:00\'');
        return $db;
    }
}

然后你可以使用提取的方法:

class WebController extends Controller {
    public function login()
    {
        $db=$this->createConnection();
        $user = new \DB\SQL\Mapper($db, 'users');
        $auth = new \Auth($user, array('id'=>'username', 'pw'=>'password'));
    }
}

或使用通过构造函数

创建的连接
class WebController extends Controller {
    public function login()
    {
        $user = new \DB\SQL\Mapper($this->db, 'users');
        $auth = new \Auth($user, array('id'=>'username', 'pw'=>'password'));
    }
}

答案 1 :(得分:1)

你应该明确地将你的构造函数声明为公开的。

您没有覆盖子项中的构造函数,因此使用了父构造函数。

子进程继承受保护的父属性。

因此,您可以使用$ this-> db来访问父级的数据库对象。