Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.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
Php 如何从父类访问子函数_Php_Oop_Abstract Class - Fatal编程技术网

Php 如何从父类访问子函数

Php 如何从父类访问子函数,php,oop,abstract-class,Php,Oop,Abstract Class,然后我打电话: class hydra { var $dbcon; function __construct($ezSQL){ $this -> dbcon=$ezSQL; } } class user extends hydra{ function foo(){ echo "bar is: ".$this->dbcon; } } 但是,在这一点上,我得到了以下错误: $hydra

然后我打电话:

  class hydra {
    var $dbcon;

    function __construct($ezSQL){
        $this -> dbcon=$ezSQL;
    }

  }
  class user extends hydra{
    function foo(){
       echo "bar is: ".$this->dbcon;
    }
  }
但是,在这一点上,我得到了以下错误:

$hydra      = new hydra($ezSQL);
如何设置一个将继承其所有子函数的类,以便执行以下操作:

Fatal error: Cannot instantiate abstract class hydra
输出:

酒吧名称:foobar


我认为你对继承的想法是错误的。 父级不从子级继承函数,子级从父级继承函数。 在您的情况下,
hydra
没有函数
foo()
。 类
user
继承了构造函数和
hydra
的属性,因此下面的代码将起作用

$hydra = new hydra("foobar");
$hydra -> foo();
同样,您不能设置继承其所有子函数的类。
这不是面向对象编程的工作方式。

您无法将子功能放入父功能中。想想看,妈妈是不是从她女儿那里得到了她的表情?不是。是从父代继承的子代

您给出的代码不会抛出任何错误。但从错误来看,hydra似乎是一个抽象类。当您想将childrens方法称为hydra时,您应该将该方法称为abstract

$hydraChild = new user("foobar");
$hydraChild -> foo();
现在可以实例化
user
,但调用
foo()
方法作为
hydra
。它的帮助完全是类型暗示

abstract class hydra {
    var $dbcon;
    function __construct($ezSQL){
        $this -> dbcon=$ezSQL;
    }
    abstract public function foo();
}

这里的函数
dofoo
$h
视为
hydra
实例

你把它完全倒过来了。子类可以访问父类的函数,而不是相反。抽象类不能被实例化,这就是为什么它们被称为抽象类。父母不在孩子之后继承,反之亦然。所以没有办法有一个“容器”类,你可以继续添加扩展吗?创建X个相互扩展的子对象,然后创建一个包含所有子对象的容器来扩展自身,这似乎适得其反。抽象类不必有抽象方法。@danronmoon你知道吗?这就是我一直在寻找的。我只是不明白为什么要初始化两个类,而实际上只需要Hydra的构造和它的一个子函数。只有在父类中声明函数是抽象公共函数时,才能将foo()调用为hydra,对吗?当您将其调用为
hydra
时,必须声明该类。我的想法完全错误,谢谢。它最终成功了。就个人感觉而言,这对我来说没有任何意义。我想我应该继续读下去,试着更好地理解父母与孩子的关系。谢谢你!
function dofoo(hydra $h){
    $h->foo();
}
$user = new user("bar");
dofoo($user);