【问题标题】:Calling a class from within another class PHP7从另一个类 PHP7 中调用一个类
【发布时间】:2018-06-09 14:11:35
【问题描述】:

我有一个抽象类,其中包含所有常见的东西(数据库连接等),我可以将横幅放在那里,但我希望它们在自己的类中与数据库分开。这就是我所拥有的...

include "includes/abstract-class.php";
include "includes/extended-class.php";
include "includes/separate-class.php";

$separate = new SEPARATEClass();
$extended = new EXTENDEDClass($separate);

那么,在抽象类中……

abstract class ABSTRACTClass 
{

    public function __construct (SEPARATEClass $separate){
        $this->separate = $separate;
    }

    // This empty function is needed in order for there not to be fatal errors 
    // even though the function with the same name that actually has content is 
    // in the separate class...
    protected function draw_small_banner(){
    }

然后,在我想要调用函数的扩展类中,我可以执行这样的操作,从 SEPARATEClass() 调用 draw_small_banner() 函数...

class EXTENDEDClass extends ABSTRACTClass 
{

    parent::draw_small_banner();

我从其他一些 Stackoverflow 问题中尝试了几种不同的方法,但这是我让它工作的唯一方法。这是使用 PHP 7。有更好的方法吗?

另外,我觉得这很奇怪,只有当空函数在抽象类中时才有效。如果有人能解释这一点或提出更简洁的替代方案,我将不胜感激。

谢谢。

【问题讨论】:

  • 任何扩展 ABSTRACTClass 并且没有省略其构造函数的东西都应该可以访问$this->separate,因为你已经隐式地使它成为了public
  • 谢谢。是的,但是如果没有抽象类中的空函数,$this->separate->draw_small_banner(); 对我不起作用。
  • 嗯,我不知道。 SEPARATEClass 是否有 draw_small_banner 公开的非静态方法?
  • 抱歉,是的,它是公开的。就是这样...class SEPARATEClass { 然后public function draw_small_banner(){

标签: php oop php-7


【解决方案1】:

正如 cmets 中所述,任何扩展 ABSTRACTClass 并且没有省略其构造函数的东西都应该可以访问 $this->separate

假设SEPARATEClass 有类似的东西

public function draw_small_banner() {
    // do some drawing or something
}

我会先让它成为ABSTRACTClass的受保护成员...

abstract class ABSTRACTClass {
    protected $separate;

    public function __construct(SEPARATEClass $separate) {
        $this->separate = $separate;
    }
}

那么,在你的扩展类中,你应该可以访问它

class EXTENDEDClass extends ABSTRACTClass {
    public function drawStuff() {
        $this->separate->draw_small_banner();
    }
}

执行看起来像

$separate = new SEPARATEClass();
$extended = new EXTENDEDClass($separate);
$extended->drawStuff();

【讨论】:

  • 非常感谢。除了受保护的变量,我相信这就是我所拥有的。我的心可能已经融化了。我明天再试一次,然后回来提供反馈。
  • 如果您绝对希望您的子类实现一个方法,我建议从抽象类中删除该方法并创建该方法并与该方法接口。然后在您的扩展类中实现您的接口。
  • 谢谢。接口是具有空函数的抽象类的样子。我想它需要在当前类中设置,它不能只是导入。这是有道理的,并且意味着我不会发疯,我想。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2015-12-19
  • 2014-02-07
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多