在扩展时从其他类中检索数据

时间:2011-03-21 20:53:39

标签: php oop inheritance

首先,我对OOP很新,而且我正在努力奋斗。我对我的应用程序和继承的当前设计有疑问。

我有一个bootstrapper文件,在包含它们之后启动我的所有核心类,如下所示:

$security = new Security;
$error_handler = new ErrorHandler;
$application = new Application;
$mysql = new MySQL;
$template = new Template;
$user = new User;

我首先加载Security和ErrorHandler类,因为Application类首先需要它们(抛出自定义404错误,使GET变量安全等)。现在所有类都扩展了Application类,但我似乎无法从子类或父类调用任何类中的任何数据。

我读到我需要首先调用父类的构造函数来使用任何数据。那在我眼里并不是那么性感和有用,我当时并没有真正看到使用扩展

我应该改变设计吗?或者我如何使用从一个类到另一个类的数据?我已经尝试过写作,但最终陷入了噩梦,因为我根本无法使用任何不同子类的数据。

2 个答案:

答案 0 :(得分:0)

如果您有一个定义__construct()方法的子类,并希望调用其父__construct()方法,则子类的__construct()方法必须调用父类的方法

这就是它在PHP中的方式;那是你必须做的;没什么选择。


作为参考,引用手册的Constructors and Destructors部分:

  

不调用父构造函数   隐式地,如果子类定义   构造函数。为了跑步   父构造函数,调用   parent::__construct()内的{{1}}   子构造函数是必需的。

答案 1 :(得分:0)

无论如何,这是一个奇怪的设置。您绝对不应该使用某些引导程序功能来预加载类,特别是如果某些类对其他类具有有限的依赖性。更好的是这个:

您的Security和ErrorHandler类应该使用静态方法来允许在不声明类的情况下使用它们的功能,或者应该将它们创建为Application类的类var。

class Security {
    // can be invoked anywhere using Security::somefunction('blah');
    public static somefunction($somevar) { ... }
}

OR

require_once('security.php');
require_once('errorhandler.php');

class Application {
    public $security;
    public $errorHandler;
    public function __construct() {
        $this->security = new Security;
        $this->errorHandler = new ErrorHandler;
    }
}

当您说您无法访问任何课程的数据时,我不确定您的意思。类应该自然地继承父父声明的任何变量和函数。例如:

require_once('application.php');
class User extends Application {
    public function throwError($message) {
        return $this->errorHandler->somefunction($message);
    }
}

如果没有在User类中明确声明$this->errorHandler,那么这应该仍然有效,因为$errorHandler类var在Application类中声明。