Model.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. namespace Heanup\Frame;
  3. class Model
  4. {
  5. /**
  6. * 创建单例模式
  7. * @return Model
  8. */
  9. public static function getInstance()
  10. {
  11. static $pool;
  12. $class = get_called_class();
  13. if (!isset($pool[$class])) {
  14. $pool[$class] = new $class();
  15. }
  16. return $pool[$class];
  17. }
  18. /**
  19. * 强大的批量获取方法,从数据库或者缓存中读取数据
  20. * 1. 先读取缓存
  21. * 2. 然后从数据库中读取缓存没有命中的
  22. * 3. 将没有命中的写入缓存
  23. * 4. 返回结果
  24. * @param $idArray
  25. * @param string $databaseClass 完整数据库类路径, 要求拥有getBatch方法
  26. * @param string $cacheClass 完整缓存类路径, 要求拥有 getBatch, setBatch 方法
  27. * @return bool
  28. */
  29. public static function getBatchFromDatabaseOrCache($idArray, $databaseClass = '', $cacheClass = '')
  30. {
  31. $cachedData = array();
  32. // 从缓存中读取数据
  33. if ($cacheClass && class_exists($cacheClass) && method_exists($cacheClass, 'getBatch')) {
  34. $cachedData = $cacheClass::getBatch($idArray);
  35. }
  36. // 取出剩余的ID
  37. $idLeft = array();
  38. foreach ($idArray as $id) {
  39. if (isset($cachedData[$id]) && $cachedData[$id]) {
  40. continue;
  41. }
  42. $idLeft[] = $id;
  43. }
  44. // 从数据库取出内容
  45. $databaseData = array();
  46. if ($idLeft && $databaseClass && class_exists($databaseClass) && method_exists($databaseClass, 'getBatch')) {
  47. $databaseData = $databaseClass::getBatch($idLeft);
  48. }
  49. // 设置从数据库读取的缓存
  50. if ($databaseData && $cacheClass && class_exists($cacheClass) && method_exists($cacheClass, 'setBatch')) {
  51. $cacheClass::setBatch($databaseData);
  52. }
  53. // 合并数据
  54. $data = array();
  55. foreach ($idArray as $id) {
  56. if (isset($cachedData[$id]) && $cachedData[$id]) {
  57. $data[$id] = $cachedData[$id];
  58. } elseif (isset($databaseData[$id]) && $databaseData[$id]) {
  59. $data[$id] = $databaseData[$id];
  60. }
  61. }
  62. return $data;
  63. }
  64. /**
  65. * 检查状态位, 如果code是布尔, 则直接返回
  66. * @param $stat
  67. * @param $code
  68. * @return int
  69. */
  70. protected static function checkStat($stat, $code)
  71. {
  72. if (is_bool($code)) {
  73. return $code;
  74. }
  75. $code = intval($code);
  76. $result = $stat & $code;
  77. return $result;
  78. }
  79. }