Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.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_Class_Require_Extends - Fatal编程技术网

Php 在另一个文件中扩展类的正确方法是什么?

Php 在另一个文件中扩展类的正确方法是什么?,php,class,require,extends,Php,Class,Require,Extends,这就是我在foo.php中的内容 class Foo { public $foo = NULL; public $foo2 = NULL; public function setFoo ($foo, $foo2) { $this->foo = $foo; $this->foo2 = $foo2' } } 这就是我在foo3.php中的内容 class Foo3 extends Foo { public $

这就是我在foo.php中的内容

class Foo
{
    public $foo = NULL;
    public $foo2 = NULL;

    public function setFoo ($foo, $foo2)
    {
       $this->foo = $foo;
       $this->foo2 = $foo2'
    }
}
这就是我在foo3.php中的内容

class Foo3 extends Foo
{
    public $foo3 = NULL;

    public function setFoo3 ($foo3)
    {
       $this->foo = $foo3;
    }
}  
这是我在第三个文件run.php中需要它的方式:

require_once "foo.php";
require_once "foo3.php";
$foo = new Foo();
$foo->setFoo3("hello");
我得到这个错误:

致命错误:调用未定义的方法Foo::setFoo3()


我不确定问题是否在于我如何要求他们。谢谢。

当然不行了。您已经创建了一个
Foo
对象,然后试图对其调用
foo3
。但是
Foo
没有
foo3
方法。

在您的示例中,您正在实例化
Foo
,它是父对象,不知道该方法
setFoo3()
。试试这个:

class Foo3 extends Foo
{
    ...
}

require_once "foo.php";
require_once "foo3.php";
$foo = new Foo3();
$foo->setFoo3("hello");
首先,在foo.php中,不应该将字段标记为public,因为这些值是在setFoo($foo1,$foo2)方法中设置的。相反,您可能会遇到以下情况:

<?php

class Foo
{
    private $foo1;
    private $foo2;

    public function setFoo($foo1, $foo2) {
        $this->foo1 = $foo1;
        $this->foo2 = $foo2;
    }
 }
然后可以在run.php中创建
Foo3
类的实例化,如下所示:


我在这里没有看到任何“extend”关键字。检查:如果我在Foo3文件中不需要_once“foo.php”,它仍然可以工作。要求我扩展的文件是一种好的做法吗?我想是的。简短的回答是的。长答案,自动加载()。谢谢;)有没有具体的理由不去做“$this->foo=$foo3;”,而是去做超类方法呢?没有,如果需要的话可以。思考如何设计类,例如,一个
Person
类而不是
Foo
可以包含描述普通人属性的字段。在这种情况下,您可能拥有的子类(所有扩展
Person
类)是,例如
教师
学生
,每个子类都包含特定于其需求的属性。
<?php

require_once "foo.php";

class Foo3 extends Foo
{
    public function setFoo3($foo3) {
        $this->setFoo($foo3, "some foo3 specific value"); // calling superclass method
    }
}
<?php

require_once "foo3.php";

$foo3 = new Foo3();
$foo3->setFoo3("bar");