Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO使用类连接到db_Php_Mysql_Pdo - Fatal编程技术网

Php PDO使用类连接到db

Php PDO使用类连接到db,php,mysql,pdo,Php,Mysql,Pdo,我正在做一个PDO系统,遇到了一个问题。我将为我的代码、用户、产品等创建多个类,我想知道它们之间的联系。我在我的一个班级里有这样的课程: class Database { private $_db; function __construct($db) { $this->_db = $db; } } $db来自一个配置文件,我还在其中加载所有类。现在的问题是: 我必须在所有类中创建相同的函数,还是可以让我的“数据库”类为所有类工作?

我正在做一个PDO系统,遇到了一个问题。我将为我的代码、用户、产品等创建多个类,我想知道它们之间的联系。我在我的一个班级里有这样的课程:

class Database
{
    private $_db;

    function __construct($db)
    {    
        $this->_db = $db;
    }
}
$db
来自一个配置文件,我还在其中加载所有类。现在的问题是:

我必须在所有类中创建相同的函数,还是可以让我的“数据库”类为所有类工作?

不,不必为每个类反复()创建相同的函数。这使得维护应用程序非常困难

请尝试以下方法之一:

1.依赖注入 您可以使用依赖项注入来实现这一点。这是非常情境化的,可能不是你想要的,但我想我还是把它放在这里

假设如下:

class Database
{
    /**
     * @var PDO
     */
    private $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }
}

class User
{
    /**
     * @var Database
     */
    private $db;

    // Here we inject a Database object (as hinted by Database $db) into the current instance
    public function __construct(Database $db)
    {
        $this->db = $db
    }
}

try
{
    $pdo = new PDO(...);
    $db = new Database($pdo);
}

catch(PDOException $ex)
{
    // Could not connect to database or some other error message
}



// Inject $db in the user class
$user = new User($db);
2.独生子女 您可以将数据库类设为单例,然后静态调用它。这可能更符合你的需要

class Database
{
    /**
     * @var Database
     */
    private static $instance;

    /**
     * @var PDO
     */
    private $db;

    protected function __construct(PDO $db)
    {
        $this->db = $db;
    }

    // You'd call this in your config
    public static function initialize(PDO $db)
    {
        if(self::$instance == null)
        {
            // Create a new instance of this class
            self::$instance = new self($db);
        }
    }

    // Get the instance
    public static function getInstance()
    {
        return self::$instance;
    }

    // Do something
    public function doSomething()
    {
        // Do something
        echo "Foo";
    }
}

class User
{
    public function doSomething()
    {
        // This would print "Foo"
        Database::instance()->doSomething();
    }
}

try
{
    $db = new PDO(...);
}

catch(PDOException $ex)
{
    // Could not connect to database or some other error message
}

Database::initialize($db);

$user = new User();

希望这能有所帮助。

我想说,这是一个你想了解更多的基本概念。它被称为,而你正在寻找的可能是一个你的问题的答案是:不,你不必在所有的类中创建相同的函数。是的,你可以让你的数据库类“为”你所有的数据库类工作(这些类就是数据库类,总是这样,请看)。@hakre告诉他如何在我需要放入扩展数据库的其他类中执行itSo,我还需要什么呢?@hakre听起来像是Laravel的雄辩的@JensJørgen:你可以做更多的事情,但从技术上讲,这个概念已经从数据库类扩展到了——正如你写的那样!在企业应用程序架构模式的第10章中可以找到一整套与数据库相关的示例。这不是PHP代码,而是大部分可以映射到PHP代码的概念,不需要任何单例。您可以只使用全局变量。也就是说,最好使用依赖注入。我想知道,到2014年底,单身汉仍然会被推荐。您只需要一个超级静态:(我的数据库类中出现以下错误:
Catchable致命错误:传递到数据库的参数1::\u construct()必须是PDO的实例,未给定。
我还需要添加
$user=new user($db)
在用户类中,或者我可以将其添加到配置文件中吗?您使用哪种方法?因此,如果我复制您编写的所有内容,它应该可以正常工作?@JensJørgen,但您最好根据需要编写它。