我有两个类,即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();
答案 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
听起来像一种服务(我将更仔细地参考BMapper
和AService
)。 / p>
您所概述的内容表明您没有正确使用PHP继承。继承表示“是”关系。 (Image
是Media
,PathMover
是Animator
,依此类推...)。虽然@Malcolm的答案在技术上可行,但不适用于您的情况。
在OOP中,我们可以说BMapper
是AService
的依赖项。因此,每当我们在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();
您可以看到我们已经在其构造函数中定义了依赖类的依赖项,以使使用该类的任何人/任何人都可以满意。