在另一个文件中扩展类的正确方法是啥?
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
类的子类)例如是 Teacher
和 Student
,每个子类都包含特定于其需求的属性。【参考方案3】:
这当然行不通。您已经创建了一个 Foo
对象,然后尝试在其上调用 foo3
。但是Foo
没有foo3
方法。
【讨论】:
以上是关于在另一个文件中扩展类的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章