您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

构建自各儿的PHP框架-创建组件的机制

2024/4/3 21:45:32发布19次查看
构建自己的php框架--创建组件的机制
在之前的博客中,我们完成了基本的model类,但是大家应该还记得,我们创建数据库的pdo实例时,是hard好的配置,并且直接hard在model类中。
代码如下:
public static function getdb() { if (empty(static::$pdo)) { $host = 'localhost'; $database = 'sf'; $username = 'jun'; $password = 'jun'; $options = [ pdo::attr_emulate_prepares => false, pdo::attr_stringify_fetches => false ]; static::$pdo = new pdo(mysql:host=$host;dbname=$database, $username, $password, $options); static::$pdo->exec(set names 'utf8'); } return static::$pdo; }
这明显是不合适的,修改的时候需要取修改框架的代码。现在我们就来将它抽出来。
首先我们需要将配置拿到相应的配置文件中,我们在simple-framework文件夹下创建一个config文件夹,然后添加一个db.php文件。在里面添加相关的配置。
代码如下:
return [ 'class' => '\pdo', 'dsn' => 'mysql:host=localhost;dbname=sf', 'username' => 'jun', 'password' => 'jun', 'options' => [ \pdo::attr_emulate_prepares => false, \pdo::attr_stringify_fetches => false, ],];
其实就是返回一个数组,数组中是我们创建pdo实例所需要的参数。在创建pdo实例之前,将db.php文件require进来即可。
代码如下:
public static function getdb() { if (empty(static::$pdo)) { $config = require('../config/db.php'); static::$pdo = new $config['class']($config['dsn'], $config['username'], $config['password'], $config['options']); static::$pdo->exec(set names 'utf8'); } return static::$pdo; }
这样还是有点不爽,在require配置文件的时候,我需要一层层的去看相对位置,如果错了,就找不到了。而且将来不管是配置文件还是model文件的位置变动了,相对位置就变了,我都需要修改这段代码。如果改成绝对地址是不是会好一些,至少配置文件位置不变,就不需要修改这段代码。
但是要改成绝对地址,我就需要定位simple-framework文件夹的地址,所以我们在public/index.php中define一个常量,标记simple-framework文件夹的地址。
public/index.php代码如下:
run();
定义了常量sf_path,model中的require可改为如下代码:
$config = require(sf_path . '/config/db.php');
ok,这样看起来好多了。
但是我又想到,假设将来我又需要一个cache的实例,我是不是又要把getdb的方法写一遍呢?如果要避免这种情况,我是不是应该把它抽想出来呢?那要如何抽象呢?
这个时候我们可能需要有一个方法,我们只需要告诉它我们需要创建一个什么实例,然后它就自己去取相应的参数,并创建出相应的实例来。这样是不是很爽。
我们需要在src文件夹下创建一个sf.php,在其中创建一个createobject方法,用来创建实例。
但这个时候我们又遇到一个问题,pdo实例创建的时候,要按一定的顺序传一定个数的参数,但我们之后需要创建的其它的实例,可能传递的参数的个数和key都不同,那我们该怎么办?
所以我们需要一种机制能够将参数存起来,真正创建实例时,再取出来使用。我们可以在src/db文件夹下创建一个connection类,sf中的createobject方法创建了这个类的实例,这个类提供一个创建pdo实例的方法即可。
sf.php中的代码如下:
$value) { $instance->$key = $value; } return $instance; }}
sf类没有namespace,所以不符合psr4的规则,需要手动引入,在public/index.php中加入如下一句话:
require_once(sf_path . '/src/sf.php');
connection.php中的代码如下:
value) * to establish a db connection. please refer to the * [php manual](http://www.php.net/manual/en/function.pdo-setattribute.php) for * details about available attributes. */ public $attributes; public function getdb() { return new pdo($this->dsn, $this->username, $this->password, $this->attributes); }}
虽然不显示声明dsn/username/password和attributes属性也是可行的,但我觉得还是声明出来比较好,这样大家看到这个类的时候,会知道有哪些属性。
model类中的getdb方法改成如下代码:
public static function getdb() { if (empty(static::$pdo)) { static::$pdo = sf::createobject('db')->getdb(); static::$pdo->exec(set names 'utf8'); } return static::$pdo; }
不要忘记需要use一下sf。
config中的db.php也要跟着修改,代码如下:
'\sf\db\connection', 'dsn' => 'mysql:host=localhost;dbname=sf', 'username' => 'jun', 'password' => 'jun', 'attributes' => [ \pdo::attr_emulate_prepares => false, \pdo::attr_stringify_fetches => false, ],];
我默默的将options换成了attributes,毕竟在pdo的文档里,写的是attribute。
好了,今天就先到这里。项目内容和博客内容也都会放到github上,欢迎大家提建议。
code:https://github.com/craryprimitiveman/simple-framework/tree/0.8
blog project:https://github.com/craryprimitiveman/create-your-own-php-framework
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product