【问题标题】:What is the proper way to extend a class in another file?在另一个文件中扩展类的正确方法是什么?
【发布时间】:2011-12-26 16:37:31
【问题描述】:

这就是我在 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()

我不确定问题是否在于我对它们的要求。谢谢。

【问题讨论】:

标签: php class require extends


【解决方案1】:

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

class Foo3 extends Foo
{
    ...
}

require_once "foo.php";
require_once "foo3.php";
$foo = new Foo3();
$foo->setFoo3("hello");

【讨论】:

【解决方案2】:

首先,在您的 foo.php 中不应标记您的字段public,因为您在setFoo($foo1, $foo2) 方法中设置了这些值。相反,你可能有类似的东西:

<?php

class Foo
{
    private $foo1;
    private $foo2;

    public function setFoo($foo1, $foo2) {
        $this->foo1 = $foo1;
        $this->foo2 = $foo2;
    }
 }

那么你应该在声明类Foo3时添加extends关键字,另外你需要在文件开头包含扩展类文件。在您的情况下,您的 foo3.php 文件中可能有以下内容:

<?php

require_once "foo.php";

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

然后您可以像这样在 run.php 中创建 Foo3 类的实例:

<?php

require_once "foo3.php";

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

我的建议是,您应该阅读一些有关 OOP 技术的知识;)

【讨论】:

  • 谢谢 ;) 是否有特定的理由不做 "$this->foo = $foo3;"但是要做超类方法呢?
  • 不,如果你需要,你可以。想想如何设计你的类,例如一个Person 类而不是你的Foo 可以包含一个描述普通人属性的字段。在这种情况下,您可能拥有的子类(所有扩展 Person 类的子类)例如是 TeacherStudent,每个子类都包含特定于其需求的属性。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2021-08-23
    • 2020-02-13
    • 2017-09-14
    • 1970-01-01
    相关资源
    最近更新 更多