当前位置:Gxlcms > PHP教程 > PHP面向对象【标识映射】

PHP面向对象【标识映射】

时间:2021-07-01 10:21:17 帮助过:8人阅读

  1. /*
  2. 标识映射在数据映射器的基础上增加了标识映射类,主要功能是保存已经创建好的对象,在需要的时候可以直接获取而不是重复创建造成系统性能的下降。
  3. 在数据映射器基础上还增加了部分调用标识映射类的方法,示例代码如下:
  4. */
  5. namespace woo\domain;
  6. //标识映射类
  7. class ObjectWatcher{
  8. private $all = array(); //存放对象的小仓库
  9. private static $instance; //单例
  10. private function __construct (){}
  11. static function instance(){
  12. if(!self::$instance){
  13. self::$instance = new ObjectWatcher();
  14. }
  15. return self::$instance;
  16. }
  17. //获取一个唯一的标识,这里采用了领域类类名+ID的方式创建一个唯一标识,避免多个数据库表调用这个类时出现ID重复的问题
  18. function globalKey(DomainObject $obj){
  19. $key = get_class($obj) . "." . $obj->getId();
  20. return $key;
  21. }
  22. //添加对象
  23. static function add(DomainObject $obj){
  24. $inst = self::instance();
  25. $inst->all[$inst->globalKey($obj)] = $obj;
  26. }
  27. //获取对象
  28. static function exists($classname,$id){
  29. $inst = self::instance();
  30. $key = "$classname.$id";
  31. if(isset($inst->all[$key]){
  32. return $inst->all[$key];
  33. }
  34. return null;
  35. }
  36. }
  37. namespace woo\mapper;
  38. abstract class Mapper{ //抽象基类
  39. abstract static $PDO; //操作数据库的pdo对象
  40. function __construct (){
  41. if(!isset(self::$PDO){
  42. $dsn = \woo\base\ApplicationRegistry::getDSN();
  43. if(is_null($dsn)){
  44. throw new \woo\base\AppException("no dns");
  45. }
  46. self::$PDO = new \PDO($dsn);
  47. self::$PDO->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
  48. }
  49. }
  50. //数据映射器基础上新增的方法以下会简称新增,这里的作用的是获取对象而不是查询数据库并重复创建对象
  51. //(对比一下原数据映射器的相关代码即可了解)
  52. private function getFroMap($id){
  53. return \woo\domain\ObjectWatcher::exists($this->targetClass(),$id);
  54. }
  55. //新增,这里的作用的是将创建的对象保存起来
  56. private function addToMap(\woo\domain\DomainObject $obj){//////
  57. return \woo\domain\ObjectWatcher::add($obj);
  58. }
  59. //对比原数据映射器的代码,便发现它不是直接创建对象而是首先在标识映射类中查找,找不到才调用的
  60. //子类的方法创建并插入到标识映射类,下面的find方法也遵循了这一原则
  61. function createObject($array){
  62. $old = $this->getFromMap($array['id']); //新增
  63. if($old){return $old} //新增
  64. $obj = $this->doCreateObject($array); //在子类中实现
  65. $this->addToMap($obj); //新增
  66. return $obj;
  67. }
  68. //
  69. function find($id){ //通过ID从数据库中获取一条数据并创建为对象
  70. $old = $this->getFromMap($id); //新增
  71. if($old){return $old} //新增
  72. $this->selectStmt()->execute(array($id));
  73. $array= $this->selectStmt()->fetch();
  74. $this->selectStmt()->closeCursor();
  75. if(!is_array($array)){
  76. return null;
  77. }
  78. if(!isset($array['id'])){
  79. return null;
  80. }
  81. $object = $this->createObject($array);
  82. $this->addToMap($object); //新增
  83. return $object;
  84. }
  85. function insert(\woo\domain\DomainObject $obj){ //将对象数据插入数据库
  86. $this->doInsert($obj);
  87. $this->addToMap($obj); //新增
  88. }
  89. //需要在子类中实现的各抽象方法
  90. abstract function targetClass();//////
  91. abstract function update(\woo\domain\DomainObject $objet);
  92. protected abstract function doCreateObject(array $array);
  93. protected abstract function selectStmt();
  94. protected abstract function doInsert(\woo\domain\DomainObject $object);
  95. }
  96. class SpaceMapper extends Mapper {
  97. //其他代码在数据映射器一文中已有实现这里略过
  98. //.............
  99. //类名,在标识映射类中生成唯一标识用的
  100. protected function targetClass(){
  101. return "woo\\domain\\Space";
  102. }
  103. }

以上就是PHP面向对象【标识映射】的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行