1

我正在开发一个带有几个简单类的 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

4 回答 4

1

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

Class User{
    private static $_instance;

    private function __construct(){
    }

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

        return self::$_instance;
    }
}

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

$user = User::getInstance();
于 2012-10-31T19:56:55.877 回答
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));
于 2012-10-31T20:11:01.810 回答
0

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

于 2012-10-31T19:57:24.070 回答
0

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

  • Standard并且Consolidated是(在某种意义上),所以它看起来是一个很好的层次结构候选者Analysis
  • User并且Display需要访问这些Config值,但它们似乎在概念上没有关联,也没有共同的行为,所以看起来组合比继承更适合这里。

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

高温高压

于 2012-10-31T20:36:02.090 回答