在Java中扩展类时,通过在import语句中使用限定包名来避免类名歧义。
例如:假设我希望我的控制器扩展Spring的MultiActionController - 我将从标准的Spring包中导入它。这也阻止我扩展Mike或Perry的MultiActionController,因为我没有从他们的包中导入MultiActionController。
同样在PHP中,我们在10个不同的库文件夹中有10个类,所有这些文件夹都被称为MultiActionController。
当我写:
class MyController extends MultiActionController {
function __construct() {
parent::__construct();
}
}
如何告诉PHP从哪个MultiActionController(从哪个文件夹扩展)?
答案 0 :(得分:7)
有几个具有相同名称的类将会在一天之内导致一些问题:在执行一个脚本期间,您不能包含两个具有相同名称的类 - 它会给您带来致命错误。
一般来说,在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,则不应忘记它已经过时,不再维护(即使是与安全相关的问题)< / em>,PHP 5真的是要走的路!
事实上,使用PHP 4,您无法在面向对象编程方面做太多工作; PHP 4中面向对象的东西真的很基础......
(自动加载的内容,我之前写的几段,在PHP 4中不存在 - 同样适用于public
/ private
/ protected
,和很多其他与OO有关的事情...)
答案 1 :(得分:2)
这取决于你包括哪一个。 PHP不会让你重新定义一个同名的类,所以只需要包含在类定义之上(更改以适合文件名和软件布局):
include('../includes/Spring/MultiActionController.php');
class MyController extends MultiActionController {
....
}
答案 2 :(得分:1)
PHP将使用include语句扩展您包含的类。
例如,假设您在文件bar.php中声明了一个类foo:
class Foo {
// methods and fields
}
然后在另一个fie:
include 'bar.php';
class Aardvark extends Foo {
// this class will extend the class Foo in file bar.php
}
答案 3 :(得分:1)
你必须包含持有该类的文件,并带有平庸的include()
语句:
include('lib/controllers/MultiAction.php');
然后你可以扩展它!
答案 4 :(得分:0)
我会使用namaspaces
namespace package_products_multicontroller {
include("/packages/products/multicontroller.php");
}
class MyController extends package_products_multicontroller\MultiActionController {
function __construct() {
parent::__construct();
}
}