我正在开发一个带有几个简单类的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类。我该怎么做?我是否适当地扩展课程?我觉得显示和分析应该扩展用户,但对我来说似乎不对。我感谢您提供的任何帮助。谢谢!
答案 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”原则来组织您的类层次结构。对于您描述的内容,它看起来像:
Standard
和Consolidated
(在是-a 意义上)Analysis
,因此它看起来像是层次结构的合适候选者。User
和Display
需要访问Config
值,但它们似乎与概念方式无关,也不具有共同行为,因此看起来组合更好比继承更合适。关于 is-a 原则,您通常会认识到,当您的子类继承的行为不属于它时,它不适合。因此,例如,如果您的Config
类具有saveValuesToDB()
,它肯定看起来像User
不应该关心的东西(即配置值如何存储在数据库中)。您可以通过搜索继承与组合找到有关该主题的大量信息,并且是模式社区中的一个经常性主题。你可以找到一些关于OO设计和模式的好书的清单here。
HTH