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

Posted

技术标签:

【中文标题】在另一个文件中扩展类的正确方法是啥?【英文标题】: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.net/manual/en/keyword.extends.php 【参考方案1】:

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

class Foo3 extends Foo

    ...


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

【讨论】:

如果我在 Foo3 文件中不需要“foo.php”,它仍然有效。要求我正在扩展的文件是一种好习惯吗?我想会的。 简短回答是。长答案,自动加载 (us.php.net/manual/en/function.spl-autoload-register.php)。【参考方案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 方法。

【讨论】:

以上是关于在另一个文件中扩展类的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能正确使用扩展类的方法?

扩展抽象类的类的类型是啥?

在另一个项目中插入活动的正确方法是啥?

在PHP中获取上传文件扩展名的最佳方法/实践是啥[重复]

扩展 GCC asm 中多个输入和输出操作数的正确用法是啥?

图像通用文件扩展名的正则表达式是啥样的?