【问题标题】:Access extended class from parent class in PHP从 PHP 中的父类访问扩展类
【发布时间】:2019-07-04 10:09:00
【问题描述】:

我有两个类,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();

【问题讨论】:

  • 这样不行。您不能实例化 A 并访问方法 B。您可以实例化 B 并访问 A 中的方法。
  • 那么从 A 实例化 B 是唯一的选择吗?
  • 你为什么要这样做?你的目标是什么?也许我们可以提出一个更好的方法来完成它?您建议的方式似乎打破了 oop 模型。
  • 嗯,A 不知道 B,但 B 知道 A。你可以使用 A,但它不知道 B。
  • 基本上我有 B 类与数据库一起使用,A 类将用户在网站上的操作连接到 B 类。所以用户做了一些事情->A 类开始工作->将信息传递给B 类添加到数据库。看起来这似乎不太可能,但我知道有些人的知识比我多得多,所以我想看看是否有其他人知道这样做的方法。

标签: php class oop extend


【解决方案1】:

来自您的评论:

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

正如您所描述的:B 与数据库一起使用,A 执行操作(由用户请求)。 B 听起来像是某种映射器/数据访问对象,而 A 听起来像是一种服务(我会参考 BMapper 和 AService 更谨慎)。

您所概述的内容表明您没有正确使用 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();

您可以看到,我们已经在其构造函数中定义了依赖类的依赖关系,以便满足使用该类的任何人/任何人的要求。

【讨论】:

  • 因表明对象组合是可行的方法而被投票赞成。
【解决方案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();

【讨论】:

  • 这相当于c++虚函数吗?
  • 不,它相当于一个 C++ 纯虚函数。除非用final 修饰,否则所有函数默认等价于 C++ 虚函数。
  • 所以像 int method() = 0;得到你。很酷。很高兴知道所有 php 方法都充当虚拟函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2012-01-06
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多