在PHP中扩展类

问题描述:

在Java中扩展类时,通过在导入语句中使用合格包名避免了类名歧义。例如:假设我想让我的控制器扩展Spring的MultiActionController - 我将从标准Spring包中导入相同的内容。这也阻止了我扩展Mike或Perry的MultiActionController,因为我没有从它们的包中导入MultiActionController。在PHP中扩展类

同样在PHP中,假设我们在10个不同的库文件夹中有10个类,所有这些都称为MultiActionController。

当我写:

class MyController extends MultiActionController { 
    function __construct() { 
     parent::__construct(); 
    } 
} 

我怎么知道PHP这是MultiActionController(从哪个文件夹),从延长?

+0

是否有一个原因,为什么你限于PHP4?如果你使用PHP5和5.3或更高版本,你会得到更好的名字空间的例子。 – 2010-02-28 15:21:26

+0

不是。所以自动把这个,我不知道为什么。我在PHP 5.2.8上(这是我的主机提供的)。 – 2010-02-28 15:42:35

+0

我编辑了你的问题以删除“php4”标记,并将其替换为“php5”,所以事情很明确:-) – 2010-02-28 15:45:00

PHP将扩展包含在include语句中的类。

例如,假设你已经在文件bar.php声明的类Foo:在另一个FIE

class Foo { 
    // methods and fields 
} 

然后:

include 'bar.php'; 
class Aardvark extends Foo { 
    // this class will extend the class Foo in file bar.php 
} 
+0

谢谢,我一直是个白痴。 – 2010-02-28 15:41:39

这取决于你有哪一个。 PHP不会让你重新定义一个类同名,所以只包含类定义的上方(改变以适应文件名和您的软件布局):

include('../includes/Spring/MultiActionController.php'); 

class MyController extends MultiActionController { 
    .... 
} 
+0

谢谢,我一直是个白痴。 ;) – 2010-02-28 15:42:02

你必须包括持有类的文件,与平庸include()声明:

include('lib/controllers/MultiAction.php'); 

然后你可以扩展它!

+0

谢谢,我一直是个白痴。 – 2010-02-28 15:40:57

+0

每个人都需要学习!顺便说一句,你应该读一下'include()','require()'和'require_once()'之间的区别。如果php文件丢失,require()会以相同的方式执行,但会导致致命错误,并且require_once会避免多次从不同脚本中调用php文件,所以include()会引发非致命错误!可以在这里查询=> http://it.php.net/require_once – 2010-02-28 16:17:55

有几个具有相同名称的类会在某一天或那一天导致一些问题:在执行一个脚本时,不能包含两个具有相同名称的类 - 它会给你一个致命错误。

什么是通常在PHP (在PHP 5.3和命名空间之前,至少)是在类名中包含库和/或“包”的名称。

例如,您可以有一个班级名称MyLibrary_Package_MultiActionController,另一个名为OtherLib_Blah_MultiActionController


那么,什么是一般做是使用类名称,将其“地图”对目录和文件,通过“/”取代“_”,并在最后一个级别的末尾添加.php - 这之中通常使用autoloading feature of PHP来完成,以避免必须编写大量的require指令。

例如,名为MyLibrary_Package_MultiActionController的类应该存储在MyLibrary/Package/MultiActionController.php中。


作为旁注:你在标签“php4”中,在你的问题中...如果你真的使用PHP 4,你不应该忘记它已经老了,不再被维护了(即使对于与安全有关的问题),而且PHP 5真的是要走的路!实际上,你将无法在PHP 4中做很多关于面向对象的编程;在PHP 4的面向对象的东西真的很基本...

(的东西,如自动加载,这是我写的一个情侣款的早期并没有存在于PHP 4 - 同为public/private/protected和许多其他OO有关的东西......)

+0

Thx作为回应。我在PHP 5.2.8上(见我上面的回复)。 – 2010-02-28 15:43:14

+0

确定关于PHP 5.2 vs PHP 4:这是个好消息:-) – 2010-02-28 15:44:02

我会用namaspaces

namespace package_products_multicontroller { 
include("/packages/products/multicontroller.php"); 
} 

class MyController extends package_products_multicontroller\MultiActionController { 
    function __construct() { 
     parent::__construct(); 
    } 
} 
+0

这似乎是最清楚的(阅读:'最明确')的方式(尽管有点冗长,如果我敢说)。 – 2010-02-28 16:39:19