如何避免两个同名的班级?

时间:2014-05-18 08:24:23

标签: php

在我的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.
}

2 个答案:

答案 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();
}

?>

我仍然说你最好养成使用命名空间的习惯。它们很棒,可以在任何地方工作。