我刚刚开始使用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. } }
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; } }
我试过这个,但得到了函数get_record未知的错误.我通过添加$MysqL = new MysqL()来解决这个问题.到用户类.
首先,在这种情况下你不需要使用单身 – 或者实际上,你几乎从不这样做.例如,见
this article.
其次,我认为你的OO设计有点偏.面向对象编程和设计的要点是将责任分离为单独的类.现在,您将为User类分配两个主要职责 – 存储/携带一个用户的相关数据,并查询数据服务(在这种情况下,是一个简单的MysqL /数据库抽象层).
您应该首先将该功能移动到单独的对象中.通常,这称为服务 – 所以在这种情况下,它是UserService. 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); }
您可以在请求开始时(或者您需要访问用户的位置)将所有内容绑定在一起:
$MysqL = new MysqL($credentials); $service = new UserService($MysqL); $user = $service->find(1337);
它并不完美,但它的设计更加整洁.您的MysqL对象执行它需要做的事情(构建连接,执行查询),您的用户对象显然是愚蠢的,并且您的服务只做一件事,即在实际存储层和调用它的事物之间提供一个层.