试图了解课程和OOP
我有以下情况,我将我的课程定义为
// Include database connection class
require_once INCLUDE_PATH.'database.class.php';
$database = new Database;
// include the functions helper class
require_once INCLUDE_PATH.'functions.php';
$functions = new functions();
// include the error handling class
require_once INCLUDE_PATH.'error_handling.php';
$errorHandling = new errorHandling();
database.php中
class Database{
public function __construct(){
// Create dsn connection string
$dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
$options = array(
// avoids duplicate connections being opened
PDO::ATTR_PERSISTENT => true,
// sets error mode if a database error is thrown
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
// Create a new PDO instanace
try{
$this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
} catch(PDOException $e){ // Catch any errors
$this->error = $e->getMessage();
// email the administrator and redirect and display a user friendly message for the user
$errorHandling->database_connection();
}
} // end of construct function to setup database connection
} // end of database class
的functions.php
class functions{
public function email_admin {
// run code to email the administrator with the error
}
}
error_handling.php
class errorHandling{
public function database_connection(){
// this handles the code that holds the errors for
// both the admin message and user message and redirects
// the user to a page to show the user friendly error
// if the database connection fails
// it also runs the code to email the admin before redirecting
$functions->email_admin();
}
所以你可以看到我想做什么,而且很可能非常糟糕。我对用户和管理员有广泛的错误处理,所以我使用一个类,所以我不会混淆代码。我正在使用一个辅助函数,我正在使用具有所有sql东西的数据库类。
在某些情况下,数据库函数在错误处理和函数中使用函数来通过电子邮件发送管理员。我可以把所有东西都归为一大类并解决我的问题,但这样做效率不高。
当我需要时,我可以在每个单独的函数中使用全局$函数和全局$ errorHandling,但这似乎是重复的。有没有更好的方法来处理这个问题,或者你能指出我的文章或阅读处理这个问题。我已经尝试使用谷歌搜索,但很多教程是非常一般的,我发现很难找到处理我的具体问题的东西。我也知道扩展,但它不适合扩展数据库类,我仍然只能扩展一个我相信的类。
当我尝试使用时出现问题:
$ errorHandling-> database_connection();
在数据库类中。如果我这样做,我会收到一个错误: 在非对象或类似的东西上调用成员函数database_connection()
答案 0 :(得分:1)
您当前的问题是variable scope问题:$errorHandling
类的方法范围内未定义Database
,因此您尝试调用database_connection()
未定义事物的方法(缺少更好的词......)。
如果您的Database
类依赖于其他几个类,并且继承不是明显的方法,因为没有真正的继承关系,您可能需要查看依赖注入。简而言之,当您构造一个Database
对象时,您将在对象中注入必要的依赖项,并将它们分配给该对象的属性,以便您可以在那里使用它们。
一个简单的例子:
主要代码:
$errorHandling = new errorHandling();
$database = new Database($errorHandling);
在Database
课程中:
class Database{
private $_errorHandler;
public function __construct(errorHandling $errorHandling){
$this->_errorHandler = $errorHandling;
// the rest of your code
// ...
$this->_errorHandler->database_connection();
顺便说一下,你还应该看看Autoloading of classes,这会让你的生活变得更容易,因为课程的数量会增加。