在PHP中扩展类
在Java中扩展类时,通过在导入语句中使用合格包名避免了类名歧义。例如:假设我想让我的控制器扩展Spring的MultiActionController - 我将从标准Spring包中导入相同的内容。这也阻止了我扩展Mike或Perry的MultiActionController,因为我没有从它们的包中导入MultiActionController。在PHP中扩展类
同样在PHP中,假设我们在10个不同的库文件夹中有10个类,所有这些都称为MultiActionController。
当我写:
class MyController extends MultiActionController {
function __construct() {
parent::__construct();
}
}
我怎么知道PHP这是MultiActionController(从哪个文件夹),从延长?
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
}
谢谢,我一直是个白痴。 – 2010-02-28 15:41:39
这取决于你有哪一个。 PHP不会让你重新定义一个类同名,所以只包含类定义的上方(改变以适应文件名和您的软件布局):
include('../includes/Spring/MultiActionController.php');
class MyController extends MultiActionController {
....
}
谢谢,我一直是个白痴。 ;) – 2010-02-28 15:42:02
你必须包括持有类的文件,与平庸include()
声明:
include('lib/controllers/MultiAction.php');
然后你可以扩展它!
谢谢,我一直是个白痴。 – 2010-02-28 15:40:57
每个人都需要学习!顺便说一句,你应该读一下'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有关的东西......)
Thx作为回应。我在PHP 5.2.8上(见我上面的回复)。 – 2010-02-28 15:43:14
确定关于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();
}
}
这似乎是最清楚的(阅读:'最明确')的方式(尽管有点冗长,如果我敢说)。 – 2010-02-28 16:39:19
是否有一个原因,为什么你限于PHP4?如果你使用PHP5和5.3或更高版本,你会得到更好的名字空间的例子。 – 2010-02-28 15:21:26
不是。所以自动把这个,我不知道为什么。我在PHP 5.2.8上(这是我的主机提供的)。 – 2010-02-28 15:42:35
我编辑了你的问题以删除“php4”标记,并将其替换为“php5”,所以事情很明确:-) – 2010-02-28 15:45:00