Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从另一个类PHP7中调用一个类_Php_Oop_Php 7 - Fatal编程技术网

从另一个类PHP7中调用一个类

从另一个类PHP7中调用一个类,php,oop,php-7,Php,Oop,Php 7,我有一个抽象类,其中包含所有常用的东西(DB连接等),我可以将横幅放在其中,但我希望它们在自己的类中与DB分离。这就是我的作品 include "includes/abstract-class.php"; include "includes/extended-class.php"; include "includes/separate-class.php"; $separate = new SEPARATEClass(); $extended = new EXTENDEDClass($sepa

我有一个抽象类,其中包含所有常用的东西(DB连接等),我可以将横幅放在其中,但我希望它们在自己的类中与DB分离。这就是我的作品

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\u small\u banner()
函数

class EXTENDEDClass extends ABSTRACTClass 
{

    parent::draw_small_banner();
abstract class ABSTRACTClass {
    protected $separate;

    public function __construct(SEPARATEClass $separate) {
        $this->separate = $separate;
    }
}
我尝试了一些不同于其他Stackoverflow问题的方法,但这是唯一能让它起作用的方法。这是使用PHP7。有更好的方法可以工作吗

而且,我觉得奇怪的是,只有当空函数在抽象类中时,这才有效。如果有人能解释这一点或建议一个更整洁的替代方案,我将不胜感激


谢谢。

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

假设
SEPARATEClass
有如下内容

public function draw_small_banner() {
    // do some drawing or something
}
我会首先让它成为
ABSTRACTClass
的受保护成员

class EXTENDEDClass extends ABSTRACTClass 
{

    parent::draw_small_banner();
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();

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

假设
SEPARATEClass
有如下内容

public function draw_small_banner() {
    // do some drawing or something
}
我会首先让它成为
ABSTRACTClass
的受保护成员

class EXTENDEDClass extends ABSTRACTClass 
{

    parent::draw_small_banner();
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();

任何扩展了
ABSTRACTClass
并且没有忽略其构造函数的东西都应该可以访问
$this->separate
,因为您已经隐式地将其
公开了
,谢谢。对,但是
$this->separate->draw_small_banner()将无法为我工作。我不知道。
SEPARATEClass
是否有一个
draw\u small\u banner
public非静态方法?对不起,是的,它是public。就是这样
class SeparatedClass{
然后
公共函数draw\u small\u banner(){
任何扩展了
ABSTRACTClass
并且没有忽略其构造函数的东西都应该有权访问
$this->separate
,因为你已经隐式地将它设置为
公共的
谢谢。对,但是
$this->->separate->->draw\u small\u banner()
如果抽象类中没有空函数,我将无法工作。嗯,我不知道。
SEPARATEClass
是否有一个
draw_small_banner
公共的非静态方法?对不起,是的,它是公共的。这就是……
类SEPARATEClass{
然后
公共函数draw_small_banner(){
非常感谢。除了受保护的变量之外,我相信这就是我所拥有的。我的思想可能已经融化了。我明天会再试一次,然后带着反馈回来。如果你绝对希望你的子类实现一个方法,我建议从抽象类中删除该方法,并创建该方法并与该方法交互。然后执行在你的extendedClass中更新你的接口。谢谢。接口是带有空函数的抽象类的样子。我想它需要在当前类中设置,不能只是导入。这很有意义,也意味着我不会发疯。再次感谢。非常感谢。除了受保护的变量,我相信这是正确的我所拥有的。我的想法可能已经融化了。我明天会再试一次,然后带着反馈回来。如果你绝对想让你的子类实现一个方法,我建议从抽象类中删除该方法,并用该方法创建和接口。然后在你的扩展类中实现你的接口。谢谢。接口是带空函数的bstract类看起来像。我想它需要在当前类中设置,不能只是导入。这很有意义,也意味着我不会发疯。再次感谢。