Ric*_*ick 9 php mysql oop class
我刚刚开始使用OOP PHP并遇到了一个问题.我已经设置了一个通用的mysql类,它允许我连接到一个数据库,并有一些函数从表中获取记录:
class mysql{
//some lines to connect, followed by:
public function get_record($sql)
{
$result = mysql_result(mysql_query($sql));
return $result;
//obiously it's a bit more advanced, but you get the picture.
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,我有一个类来获取用户详细信息:
class user{
__construct($id)
{
$this->id = $id
}
public function get_username($id)
{
$username = get_record("SELECT name FROM users WHERE id = '".$this->id."'");
return $username;
}
}
Run Code Online (Sandbox Code Playgroud)
我试过这个,但得到了函数get_record未知的错误.我通过添加$ mysql = new mysql()解决了这个问题.到用户类.
但是,为每个使用我的数据库方法的类(实际上都是这些方法)实例化mysql对象感觉效率很低.
有没有办法让mysql类及其方法可供所有其他类访问,而无需在每个方法中调用mysql类?
首先,在这种情况下你不需要使用单身 - 或者实际上,你几乎从不这样做.例如,请参阅此文章.
其次,我认为你的OO设计有点偏.面向对象编程和设计的要点是将责任分离为单独的类.现在,您为User类提供了两个主要职责 - 存储/携带一个用户的相关数据,并查询数据服务(在本例中是一个简单的MySQL /数据库抽象层).
您应该首先将该功能移动到单独的对象中.通常,这称为服务 - 所以在这种情况下,它是一个UserService.A UserService有一个责任:提供User对象的访问权限.所以它看起来像这样:
class UserService {
public function __construct($mysql); // uses the mysql object to access the db.
public function get($id) {
$result = $this->mysql->get_record("select x from y");
$user = new User($result['id'], $result['name']); // assuming user has a constructor that takes an id and a name
return $user;
}
public function save($user);
public function delete($user);
}
Run Code Online (Sandbox Code Playgroud)
您可以在请求开始时(或者您需要访问用户的位置)将它们组合在一起:
$mysql = new MySQL($credentials);
$service = new UserService($mysql);
$user = $service->find(1337);
Run Code Online (Sandbox Code Playgroud)
它并不完美,但它的设计更加整洁.您的MySQL对象执行它需要做的事情(构建连接,执行查询),您的用户对象显然是愚蠢的,并且您的服务只做一件事,即在实际存储层和调用它的事物之间提供一个层.
您应该将 mysql 对象传递给每个用户对象。所以它看起来像这样:
$mysql = new mysql();
$user = new user( $mysql, $id);
$name = $user->get_username();
class user {
public function __construct($mysql, $id) {
$this->mysql = $mysql;
$this->id = $id;
}
public function get_username() {
$username = $this->mysql->get_record("SELECT name FROM users WHERE id = '".$this->id."'");
return $username;
}
}
Run Code Online (Sandbox Code Playgroud)