Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP项目中组织/扩展类_Php_Oop_Class_Extend - Fatal编程技术网

在PHP项目中组织/扩展类

在PHP项目中组织/扩展类,php,oop,class,extend,Php,Oop,Class,Extend,我正在做一个PHP项目,其中有几个简单的类。我正在努力使我的类变得更复杂,但我还想开始使用类来处理其他事情,如管理用户、配置设置、显示等。我很难弄清楚如何“组织”它们。比如我应该如何扩展这些类 我有以下课程: //main application settings, constants, etc. Class Config { } //add/edit/delete/check permissions of users Class Users extends Config { } //dis

我正在做一个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 {
}

我遇到的问题是,我希望能够从所有其他类(显示、分析、标准和合并)访问用户和配置类。我该怎么做?我是否适当地扩展了课程?我觉得显示和分析应该扩展用户,但对我来说似乎并不合适。我感谢你能提供的任何帮助。谢谢

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

Class User{
    private static $_instance;

    private function __construct(){
    }

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

        return self::$_instance;
    }
}
然后在我需要访问该用户对象的任何地方

$user = User::getInstance();

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

您可以尝试

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));

一般来说,您可以使用“”原则来组织类的层次结构。根据您的描述,它看起来像:

  • Standard
    Consolidated
    是(在is-a意义上)
    Analysis
    ,因此它看起来是层次结构的一个很好的候选者
  • User
    Display
    需要访问
    Config
    值,但它们似乎没有概念上的关联,也没有共同的行为,因此这里的组合似乎比继承更合适
关于is-a原则,您通常会认识到,当您的子类继承的行为不属于它时,它不适合。因此,例如,如果您的
Config
类有一个
saveValuesToDB()
,它看起来肯定是
用户不应该关心的东西(即配置值如何存储在数据库中)。通过搜索继承与组合,您可以找到关于该主题的大量信息,并且是模式社区中经常出现的主题。您可以找到一些关于OO设计和模式的好书


HTH

您使用的是什么版本的PHP
5.4
<5.4
对于最后一部分,您将如何从您的一个类中引用它?从任何地方使用相同的方式,包括其他类,因为您正在使用静态方法实例化对象,并且它是一个单例,您将始终获得相同的对象,而不是实例化新对象。谢谢您的示例!我现在如何访问分析和显示类中的方法?我会使用$main->method吗?可以是这样的