2012-10-31 75 views
1

我正在使用几个简单的类来处理PHP项目。我正在努力让我的课变得更加复杂,但我也想开始使用类来管理用户,配置设置,显示等其他内容。我很难想出如何“组织”他们。就像我应该如何扩展这些类?在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 { 
} 

我遇到的问题是我希望能够从所有其他类(显示,分析,标准和统一访问用户和配置类)。我将如何做到这一点?我是否正确地扩展了这些类?我觉得显示和分析应该扩展用户,但对我来说似乎并不合适。我很感激您可以提供的任何帮助。谢谢!

+0

您使用的是哪个版本的PHP? '5.4'或'<5.4' – Baba

+0

我正在使用PHP版本5.4。 – Jeff

回答

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(); 
+0

对于最后一部分,你将如何从你的一个类中引用它? – Jeff

+0

以相同的方式从任何地方,包括其他类,因为您正在使用静态方法来实例化对象,并且它是一个单例,您将始终获得相同的对象,而不是实例化一个新对象。 –

0

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

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

感谢您的示例!我现在如何访问Analysis和Display类中的方法?我会使用$ main->方法吗? – Jeff

+0

它可以是http://pastebin.com/SM53hWRZ或类似的东西http://pastebin.com/cunpS6is – Baba

0

根据经验,一般情况下,你可以使用“is-a”的原则来组织你的类层次结构。对于你的描述,它看起来像:

  • StandardConsolidated是(在是,一个感)Analysis,所以它看起来像一个很好的候选人的层次结构。
  • UserDisplay需要访问Config值,但它们在概念上似乎并不相关,也没有共同的行为,所以它看起来组合比继承更适合。

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

HTH