【发布时间】:2016-05-26 15:55:38
【问题描述】:
抱歉,可能不是最准确的标题。我很难弄清楚这甚至会被称为什么。
我对 php 的 OOP 有点陌生,因为我的大部分时间都花在了过程编程上。为了更好地学习这些概念,我正在使用一个现有的应用程序并使用 OOP 重写它的一部分。下面的例子是我如何设置基类,然后我将基类扩展成几个更小的类以便于维护。下面,您可以看到我如何扩展基类以创建用户类。 请注意,我的类定义在单独的文件中,但我有一个自动注册它们的工作自动加载器
class EventScheduler{
function __construct(){
// set up database connections here
}
}
class User extends EventScheduler{
private function getUserProfile($username){
// return an array here representing
// details of passed username from database
}
public function getUserType($username){
return $this->getUserProfile($username)['user_type'];
}
}
我希望喜欢能够从基类内部引用 User 类,如下所示:
$eventApp = new EventScheduler();
$userType = $eventApp->User->getUserProfile("nameHere");
我目前正在做的是:
$eventApp = new EventScheduler();
//do some stuff here using the base class
$users = new User();
$userType = $users->getUserProfile("nameHere");
但是当我添加更多子类时,我不想像在那里那样实例化每个扩展类,我希望将它们全部分组在基础对象下,而不是将每个扩展类都包含在其中自己的对象。
【问题讨论】:
-
我想我不明白你想做什么。 “我想做的是从基类内部引用 User 类”——这违背了扩展类的目的。如果需要子类的方法在基类中,把方法放到基类中。
-
试图理解你在做什么......在正确的面向对象设计中,父类没有扩展(子)类的概念。如果您希望父类具有子类的某些功能,您可以在父类中定义一个抽象方法,该方法需要所有子类实现。
-
如果我将额外的用户函数放在我的基类中,我将拥有一个没有良好逻辑分离的庞大基类。无论如何将逻辑分成基类中的不同部分。 Id 基本上想将事物分为用户、房间、建筑物、设备和事件。
-
Users 和 Rooms 应该以什么方式从同一个类扩展?为什么房间和建筑物会从同一个类延伸?房间包含在建筑物中。这显然是一个“你做错了”的案例。
-
我相信你是对的。顶部有一个权限层,仅允许某些用户修改或保留某些建筑物中的房间。取消类并使用纯函数调用会简单得多;将相似的函数分离到各自的包含文件中。