从 PHP 中的父 class 访问扩展 class
Access extended class from parent class in PHP
我有两个 classes,class A 和 class B,我试图通过 class A 中的函数访问 class B .
目前我可以通过在 class A 中的函数内部创建一个 class B 的新实例来做到这一点,但我想知道是否有办法做到这一点这没有在 class A.
中创建 class B 的新实例
这是我想做的一个例子:
class a{
function a(){
return $this->b();
}
}
class b extends a{
function b(){
return "It Works!";
}
}
$doIt = new a();
echo $doIt->a();
你不能。但是你可以期待一个抽象方法。
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();
来自您的评论:
Basically i have class B that works with the database, and class A that connects the users actions on the site to class B. So user does something->class A starts working->Passes info on to class B to add to the database. It did seem that this is not all that possible, but i know there are people with a lot more knowledge than I have so i wanted to see if anyone else knew of some way to do this.
如您所述:B
使用数据库,A
执行操作(由用户请求)。 B
听起来像是某种 mapper/data 访问对象,而 A
听起来像是一种服务(我将参考 BMapper
和 AService
以更加慎重) .
您所概述的内容表明您没有正确使用 PHP 继承。继承表示 "is a" 关系。 (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();
你可以看到我们已经在它的构造函数中定义了我们依赖的 class 的依赖,要满足 whoever/whatever 正在使用 class.
我有两个 classes,class A 和 class B,我试图通过 class A 中的函数访问 class B .
目前我可以通过在 class A 中的函数内部创建一个 class B 的新实例来做到这一点,但我想知道是否有办法做到这一点这没有在 class A.
中创建 class B 的新实例这是我想做的一个例子:
class a{
function a(){
return $this->b();
}
}
class b extends a{
function b(){
return "It Works!";
}
}
$doIt = new a();
echo $doIt->a();
你不能。但是你可以期待一个抽象方法。
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();
来自您的评论:
Basically i have class B that works with the database, and class A that connects the users actions on the site to class B. So user does something->class A starts working->Passes info on to class B to add to the database. It did seem that this is not all that possible, but i know there are people with a lot more knowledge than I have so i wanted to see if anyone else knew of some way to do this.
如您所述:B
使用数据库,A
执行操作(由用户请求)。 B
听起来像是某种 mapper/data 访问对象,而 A
听起来像是一种服务(我将参考 BMapper
和 AService
以更加慎重) .
您所概述的内容表明您没有正确使用 PHP 继承。继承表示 "is a" 关系。 (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();
你可以看到我们已经在它的构造函数中定义了我们依赖的 class 的依赖,要满足 whoever/whatever 正在使用 class.