0

As i know in MVC, Model always connect to database, example:

class a extends Model {
...
}


class Model {
    public function __construct() {
        $db = new database;
        $db->connect('localhost','root','','example');
    }
}

But, in the case i have more Model always run to get config in database. So, when run website will be 2 Model are used. This equivalent to 2 connect to database so its has effect to system when have many people visit my website (200 request = 400 connect to database)

4

1 回答 1

0

关于型号

实际上,模型首先不在课堂上。模型是一个层,其中包含大量对象。模型层中的两个主要类实例组负责以下职责之一:

  • 领域业务逻辑和规则:由领域对象实现(一) (二)
  • 数据访问和持久性:通常实现为数据映射器(3)

在代码中,它看起来类似于:

$user = $factory->buildObject('user');
$mapper = $factory->buildMapper('user');
$user->setId( 42 );
$mapper->fetch($user);
$now = time();
if ( $user->hasStatus( User::STATUS_LOCKED ) && !$user->isBanned( $now ) )
{
   $user->setStatus( User::STATUS_AVAILABLE );
}
$mapper->commit($user);

您可能会注意到,业务对象在任何时候都不会真正与数据库交互。或者甚至意识到这一点。信息可能存储在纯文本文件中,或通过远程 REST API 或某些 noSQL 事物存储。域对象不关心这一点。所有存储都由映射器处理。控制发票制作的业务逻辑不依赖于发票信息的来源。

关于连接

由于您使用的是 OOP,因此您可能会利用它。考虑这个例子:

class Test
{
    protected $ob = null;
    public function __construct( $ob )
    {
        $this->ob = $ob;
    }
    public function get() 
    {
        var_dump( $this->ob->data );
    }
    public function set( $val )
    {
        $this->ob->data = $val;
    }
}

$object = new stdClass;
$foo = new Test($object);
$bar = new Test($object);

$foo->set('lorem ipsum');
$bar->get();

要查看执行:http ://codepad.org/coCibwyk

您应该注意到,Test类的两个实例共享同一个实例。在您的代码中,您可以对PDO的实例执行相同的操作。

如果您使用类似于第一个代码剪切的东西,那么:

class Factory
{
    protected $connection = null;
    public function __construct( $connection )
    {
        $this->connection = $connection;
    }
    public function buildMapper( $className )
    {
        $className = $className . 'Mapper';
        $instance = new $className ;
        $instance->useConnection( $this->connection );
        return $instance;
    }
    // ... some other code 
}

因此,当您使用 时$mapper = $factory->buildMapper('user');,该方法会创建一个已经有连接的对象。

于 2012-04-25T12:16:21.097 回答