繁体   English   中英

PHP OOP:如何在其他类中使用通用MySQL类

[英]PHP OOP: how to use a generic MySQL class in other classes

我刚刚开始使用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()解决了这个问题。 到用户类。

但是,为每个使用我的数据库方法的类(实际上都是这些方法)实例化mysql对象感觉效率很低。

有没有办法让mysql类及其方法可供所有其他类访问,而无需在每个方法中调用mysql类?

首先,在这种情况下你不需要使用单身 - 或者实际上,你几乎从不这样做。 例如,请参阅此文章

其次,我认为你的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对象执行它需要做的事情(构建连接,执行查询),您的用户对象显然是愚蠢的,并且您的服务只做一件事,即在实际存储层和调用它的事物之间提供一个层。

设计你的mysql类静态调用:

$username = Mysql::get_record("SELECT name FROM users WHERE id = '".$this->id."'");

http://php.net/manual/en/language.oop5.static.php

这是一个常见问题,因此有一个共同的解决方案。 您可能知道,在软件开发中,常见问题的常见解决方案称为设计模式。

有两种设计模式可以帮助您解决此问题。 从更抽象的意义上讲,您面临的问题是:

如何在B级提供A级课程?

单身人士模式

“在单例模式中,类可以将自身的一个实例分发给其他类。”

这不是您正在寻找的,因为您的网站可能使用多个数据库连接。 但是,很多人都以这种方式使用它。

阅读有关在此处使用单例类作为数据库提供程序的一些信息: https//www.ibm.com/developerworks/library/os-php-designptrns/#N10124

有关PHP中单例模式的更多信息: http//www.fluffycat.com/PHP-Design-Patterns/Singleton/

另一个合理的方法是注册表模式:

注册表模式

您可以在下面的链接中找到有关注册表模式的信息,以及与您正在寻找的实现几乎完全相同的实现: http//www.sitecrafting.com/blog/php-patterns-part/

更强大的是单例和注册表之间的组合。

祝你好运,享受学习OOP PHP!

您应该将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;
    }
}

使用全局变量,虽然这可能不是最好的选择。

$mysql = new mysql();

function someFunction() {
  global $mysql;
  $mysql->get_record(...)
}

或者是mysql类的静态方法(参见Singleton

class mysql {
  public static $theInstance = new mysql();
  public static function getInstance() {
    return $this->theInstance;
  }
}

function someFunction() {
  $database= mysql::getInstance();
  $database->get_record(...)
}

开始考虑使用Doctrine,它会更好

http://www.doctrine-project.org/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM