从PHP的父类访问扩展类

时间:2019-02-10 22:19:07

标签: php class oop extend

我有两个类,即A类和B类,我试图通过A类中的函数访问B类。

目前,我能够通过在类A的函数内部创建类B的新实例来做到这一点,但是我想知道是否有一种方法可以在内部不创建类B的新实例的情况下进行操作。属于A类。

这是我想做的一个例子:

class a{

    function a(){
        return $this->b();
    }


}

class b extends a{

    function b(){
        return "It Works!";
    }

}

$doIt = new a();
echo $doIt->a();

2 个答案:

答案 0 :(得分:2)

不能。但是您可以期待一种抽象方法。

abstract class a {
    function a() {
        return $this->b(); // OK
    }
    abstract function b(); // Has no method body. Classes extending this class will implement it
}
class b extends a {
    function b() {
        return 'something';
    }
}
$doIt = new b(); // Cannot instantiate abstract class a
echo $doIt->a();

答案 1 :(得分:2)

根据您的评论:

  

基本上,我有与数据库一起使用的B类,以及将用户在网站上的操作连接到B类的A类。因此,用户执行了一些操作-> A类开始工作->将信息传递给B类以添加到数据库。看来这不可能,但我知道有些人比我拥有更多的知识,所以我想看看是否有人知道这样做的方法。

正如您所描述的:B与数据库一起使用,A执行操作(由用户请求)。 B听起来像某种映射器/数据访问对象,而A听起来像一种服务(我将更仔细地参考BMapperAService)。 / p>

您所概述的内容表明您没有正确使用PHP继承。继承表示“是”关系。 (ImageMediaPathMoverAnimator,依此类推...)。虽然@Malcolm的答案在技术上可行,但不适用于您的情况。

在OOP中,我们可以说BMapperAService的依赖项。因此,每当我们在AService中调用方法时,我们都希望它依赖于BMapper的实例。通常通过依赖注入来满足这种关系(请参阅:What is dependency injection?)。

<?php

class AService {

    private $bMapper;

    public function __construct(BMapper $bMapper)
    {
        $this->bMapper = $bMapper;
    }

    public function doAction()
    {
        return $this->bMapper->performSomethingInDatabase();
    }

}

class BMapper {

    public function performSomethingInDatabase()
    {
        /**
         * ..whatever
         */
    }

}

$service = new AService(new BMapper);
$service->doAction();

您可以看到我们已经在其构造函数中定义了依赖类的依赖项,以使使用该类的任何人/任何人都可以满意。