在PHP中扩展类

6
在Java中扩展类时,通过使用导入语句中的限定包名来避免类名歧义。
例如:假设我想让我的控制器扩展Spring的MultiActionController - 我会从标准的Spring包中导入相同的内容。这也防止我从Mike或Perry的包中扩展MultiActionController,因为我没有从它们的包中导入MultiActionController。
同样,在PHP中,假设我们有10个不同库文件夹中的10个类都被称为MultiActionController。
当我写下以下代码时:
class MyController extends MultiActionController {
    function __construct() {
        parent::__construct();
    }
}

如何告诉PHP要扩展哪个MultiActionController(来自哪个文件夹)?

你为什么只使用PHP4?如果你使用的是PHP5,尤其是版本5.3或更高版本,你将会得到更好的命名空间示例。 - Mark Tomlin
我不是。SO自动放置了那个,我不知道为什么。我使用的是PHP 5.2.8(这是我的主机提供的)。 - PHP Newbie
我已经编辑了你的问题,删除了“php4”标签,并将其替换为“php5”,以便事情更加清晰 :-) - Pascal MARTIN
5个回答

7
有几个同名类会在某一天导致一些问题:在执行一个脚本时,您不能包含两个同名的类——这将导致致命错误。通常情况下,在PHP (至少在PHP 5.3和命名空间之前)中使用库和/或“包”的名称来包含在类名中。
例如,您可以有一个类名为MyLibrary_Package_MultiActionController,另一个名为OtherLib_Blah_MultiActionController的类。
然后,通常使用该类名来将其“映射”到目录和文件,将 '_'替换为'/',并在最后一级添加.php ——这通常使用PHP的自动加载功能完成,以避免编写大量的require指令。
例如,名为MyLibrary_Package_MultiActionController的类应存储在MyLibrary/Package/MultiActionController.php中。
顺便说一下:您在问题中使用了“php4”标签...如果您实际上正在使用PHP 4,那么您不应忘记它已经过时,不再维护(甚至没有针对安全相关问题的维护),而PHP 5才是正确的选择!
实际上,您无法在PHP 4中做太多关于面向对象编程的事情;PHP 4中的面向对象内容非常基础... (例如,我之前几段写过的自动装载等东西在PHP 4中不存在——同样适用于public/private/protected和许多其他与OO相关的事情...)

谢谢回复。我使用的是PHP 5.2.8(请参见我上面的回复)。 - PHP Newbie

2

这取决于你要包含哪个文件。PHP不允许你重新定义同名的类,所以只需在类定义之前包含即可(根据文件名和软件布局进行更改):

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

class MyController extends MultiActionController {
   ....
}

谢谢,我真是个白痴。;) - PHP Newbie

1

PHP将通过include语句扩展您所包含的类。

例如,假设您在文件bar.php中声明了一个名为foo的类:

class Foo {
    // methods and fields
}

然后在另一个文件中:

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

谢谢,我真是个白痴。 - PHP Newbie

1

您需要使用一个平凡的include()语句来包含保存类的文件:

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

那么你就可以扩展它!


谢谢,我真是个笨蛋。 - PHP Newbie
每个人都需要学习!顺便说一下,你应该阅读一下include()require()require_once()之间的区别!include() 如果 PHP 文件缺失会抛出非致命错误,require() 也一样,但是会抛出致命错误,而 require_once 则避免了 PHP 文件在不同脚本中被多次调用!可以在这里查看 => http://it.php.net/require_once - Enrico Carlesso

1

我会使用命名空间

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

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

这似乎是最清晰(即“最明确”)的方式(尽管有点冗长,如果我可以这么说的话)。 - PHP Newbie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接