组织/扩展PHP项目中的类

时间:2012-10-31 19:52:06

标签: php oop class extend

我正在开发一个带有几个简单类的PHP项目。我正在努力使我的课程更复杂,但我也想开始使用类来管理用户,配置设置,显示等其他内容。我很难弄清楚如何“组织”它们。我应该如何扩展这些类?

我有以下课程:

//main application settings, constants, etc.
Class Config {
}

//add/edit/delete/check permissions of users
Class Users extends Config {
}

//displays the pages
Class Display extends Config {
}

//main application
Class Analysis extends Config {
}

//specific methods for this type of analysis
Class Standard extends Analysis {
}

//specific methods for this type of analysis
Class Consolidated extends Analysis {
}

我遇到的问题是我希望能够从所有其他类(Display,Analysis,Standard和Consolidated)访问Users和Config类。我该怎么做?我是否适当地扩展课程?我觉得显示和分析应该扩展用户,但对我来说似乎不对。我感谢您提供的任何帮助。谢谢!

4 个答案:

答案 0 :(得分:1)

在我的项目中,我的用户和配置类是singleton classes,这使我可以通过一个简单的方法调用轻松地将实例拉入任何其他类。

Class User{
    private static $_instance;

    private function __construct(){
    }

    public function getInstance(){
        if( !self::$_instance ){
            self::$_instance = new User();
        }

        return self::$_instance;
    }
}

然后我需要访问该用户对象的任何地方

$user = User::getInstance();

答案 1 :(得分:1)

你可以尝试

trait Config {
}

// Common to Display
abstract class Display {
    function __construct(Users $user);
}

// Common to analysis
abstract class Analysis {

    function __construct(Users $user);
}

// add/edit/delete/check permissions of users
class Users {
    use Config ;
}

// Mobile Display
class Mobile extends Display {
}

// Web Display
class Web extends Display {
}

// specific methods for this type of analysis
class Standard extends Analysis {
}

// specific methods for this type of analysis
class Consolidated extends Analysis {
}

// main application
class Main {
    use Config ;
    public function setDisplay(Display $display);
    public function setAnalysis(Analysis $analysis);
}

$user = new Users("Jeff");
$main = new Main();
$main->setDisplay(new Mobile($user));
$main->setAnalysis(new Standard($user));

答案 2 :(得分:0)

将它们保存在单独的文件中,然后使用自动加载。避免让OOP疯狂的倾向。请记住,类可以作为属性引用,而不仅仅是在扩展方法中。

答案 3 :(得分:0)

作为一般经验法则,您可以使用“is-a”原则来组织您的类层次结构。对于您描述的内容,它看起来像:

  • StandardConsolidated(在是-a 意义上)Analysis,因此它看起来像是层次结构的合适候选者。
  • UserDisplay需要访问Config值,但它们似乎与概念方式无关,也不具有共同行为,因此看起来组合更好比继承更合适。

关于 is-a 原则,您通常会认识到,当您的子类继承的行为不属于它时,它不适合。因此,例如,如果您的Config类具有saveValuesToDB(),它肯定看起来像User不应该关心的东西(即配置值如何存储在数据库中)。您可以通过搜索继承与组合找到有关该主题的大量信息,并且是模式社区中的一个经常性主题。你可以找到一些关于OO设计和模式的好书的清单here

HTH