在我的php文件中,我这样做
pagecontroller.php
include_once(RUDRA."/controller/AbstractTemplateController.php");
if (file_exists(get_include_path() . CONTROLLER_PATH . "/TemplateController.php" )) {
include_once (CONTROLLER_PATH . "/TemplateController.php");
} else {
include_once (RUDRA . "/controller/TemplateController.php");
}
在TemplateController.php中,一个名为'的模板扩展了AbstractTemplateController'已定义,如果开发人员已经定义了一个类TemplateController,它也扩展了AbstractTemplateController,那么它将使用它,否则它将回退到默认定义。
然后在其他文件中我将使用类似的东西
include_once("pagecontroller.php")
$c = new TemplateController();
有没有更好的方法呢? 因为我包括两个文件AbstractTemplateController.php&在两种情况下都是TemplateController.php,我cpuld已经在同一个文件中写了两个类定义,它们会保存一个include(如果没有自定义的TemplateController.php)?
我尝试过编写AbstractTemplateController& TemplateController在一个文件中,但如果开发人员定义了自己的TemplateController,则会创建两个具有相同名称情况的类。
pupose是至少有一个定义,如果customDefinition不存在则只使用默认定义。这段代码是抽象的。
如果CustomClass存在(在特定文件夹中),则表示要使用的定义,否则使用默认值(这只是简单地扩展AbstractOne)
CONTROLLER_PATH。 " /TemplateController.php"
class TemplateController extends AbstractTemplateController {
/* over-ridden method of AbstractTemplateController
*/
public function invoke($abc,$def){
echo $abc . " " .$def;
}
}
RUDRA。 " /controller/TemplateController.php"
class TemplateController extends AbstractTemplateController {
// nothing at all this is simply to make sure TemplateController class is available
// for others to use.
}
答案 0 :(得分:2)
使用名称空间和约定。
E.g。您可以检查是否存在一个TemplateController类,它扩展了与您的命名空间不同的AbstractTemplateController(因为您的实现将特定于您的命名空间),如果没有;回到你的TemplateController实现。
http://php.net/manual/en/language.namespaces.php
答案 1 :(得分:1)
php提供了一个不让你多次加载/写一个类的功能。
bool class_exists ( string $class_name );
示例是:
<?php
function __autoload($class)
{
include($crigger_error("Unable to load class: $class", E_USER_WARNING);
}
}
if (class_exists('MyClass')) {
$myclass = new MyClass();
}lass . '.php');
// Check to see whether the include declared the class
if (!class_exists($class, false)) {
trigger_error("Unable to load class: $class", E_USER_WARNING);
}
}
if (class_exists('MyClass')) {
$myclass = new MyClass();
}
?>
在上面的示例中使用了autoload,你可以这样做而不用自动加载:
<?php
// Check that the class exists before trying to use it
if (class_exists('MyClass')) {
$myclass = new MyClass();
}
?>
我仍然说你最好养成使用命名空间的习惯。它们很棒,可以在任何地方工作。