PageRenderTime 61ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/class/util/Version.php

https://github.com/JeCat/framework
PHP | 399 lines | 188 code | 47 blank | 164 comment | 23 complexity | df25ad8a9410f58c26b6cbd08e0958ca MD5 | raw file
  1. <?php
  2. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3. // 这个文件是 JeCat PHP框架的一部分,该项目和此文件 均遵循 GNU 自由软件协议
  4. //
  5. // Copyleft 2008-2012 JeCat.cn(http://team.JeCat.cn)
  6. //
  7. //
  8. // JeCat PHP框架 的正式全名是:Jellicle Cat PHP Framework。
  9. // “Jellicle Cat”出自 Andrew Lloyd Webber的音乐剧《猫》(《Prologue:Jellicle Songs for Jellicle Cats》)。
  10. // JeCat 是一个开源项目,它像音乐剧中的猫一样自由,你可以毫无顾忌地使用JCAT PHP框架。JCAT 由中国团队开发维护。
  11. // 正在使用的这个版本是:0.7.1
  12. //
  13. //
  14. //
  15. // 相关的链接:
  16. // [主页] http://www.JeCat.cn
  17. // [源代码] https://github.com/JeCat/framework
  18. // [下载(http)] https://nodeload.github.com/JeCat/framework/zipball/master
  19. // [下载(git)] git clone git://github.com/JeCat/framework.git jecat
  20. // 不很相关:
  21. // [MP3] http://www.google.com/search?q=jellicle+songs+for+jellicle+cats+Andrew+Lloyd+Webber
  22. // [VCD/DVD] http://www.google.com/search?q=CAT+Andrew+Lloyd+Webber+video
  23. //
  24. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  25. /*-- Project Introduce --*/
  26. /*
  27. * 孔源 10月12日 从jecat0.5合并到0.6
  28. */
  29. namespace org\jecat\framework\util;
  30. class Version
  31. {
  32. /**
  33. * 构造函数
  34. *
  35. * @access public
  36. * @param $nPrimaryNum int 主版本号(架构版本号),用于区分不同的架构
  37. * @param $nSecondaryNum=0 int 次版本号(接口版本号),用于区分不同的接口
  38. * @param $nModificatoryNum=0 int 修正本号(修正版本号),用于区分每次局部修改
  39. * @param $nInternalNum=0 int 内部本号,通常为 CVS 或 SVN 版本号
  40. * @param $sVersionCode='' string 内部代号,例如 alpha, beta, rc 等
  41. * @static
  42. * @return string
  43. */
  44. public function __construct( $nPrimaryNum, $nSecondaryNum=0, $nModificatoryNum=0, $nInternalNum=0, $sVersionCode='' )
  45. {
  46. $this->nPrimaryNum = $nPrimaryNum ;
  47. $this->nSecondaryNum = $nSecondaryNum? $nSecondaryNum: 0 ;
  48. $this->nModificatoryNum = $nModificatoryNum? $nModificatoryNum: 0 ;
  49. $this->nInternalNum = $nInternalNum? $nInternalNum: 0 ;
  50. $this->sVersionCode = $sVersionCode ;
  51. }
  52. public function SetVersionCode($sVersionCode='')
  53. {
  54. $this->sVersionCode = $sVersionCode ;
  55. }
  56. /**
  57. * 比较
  58. * 返回值小于0 表示 低于 $aTo 版本
  59. * 返回值等于0 表示 两个版本相等
  60. * 返回值大于0 表示 高于 $aTo 版本
  61. * 仅比较 主版本、次版本、修正版本, 不对 内部版本、版本代号 进行比较
  62. *
  63. *
  64. * @access public
  65. * @param $aTo Version
  66. * @return int
  67. */
  68. public function compare(Version $aTo)
  69. {
  70. // 比较主版本
  71. if( $this->primaryNumber() > $aTo->primaryNumber() )
  72. {
  73. return 1 ;
  74. }
  75. else if( $this->primaryNumber() < $aTo->primaryNumber() )
  76. {
  77. return -1 ;
  78. }
  79. else
  80. {
  81. // 比较 次版本
  82. if( $this->secondaryNumber() > $aTo->secondaryNumber() )
  83. {
  84. return 1 ;
  85. }
  86. else if( $this->secondaryNumber() < $aTo->secondaryNumber() )
  87. {
  88. return -1 ;
  89. }
  90. else
  91. {
  92. // 比较修正版本
  93. if( $this->modificatoryNumber() > $aTo->modificatoryNumber() )
  94. {
  95. return 1 ;
  96. }
  97. else if( $this->modificatoryNumber() < $aTo->modificatoryNumber() )
  98. {
  99. return -1 ;
  100. }
  101. else
  102. {
  103. // 比较内部版本
  104. if( $this->internalNumber() > $aTo->internalNumber() )
  105. {
  106. return 1 ;
  107. }
  108. else if( $this->internalNumber() < $aTo->internalNumber() )
  109. {
  110. return -1 ;
  111. }
  112. else
  113. {
  114. return 0 ;
  115. }
  116. }
  117. }
  118. }
  119. }
  120. /**
  121. * 转换为 字符串 格式
  122. *
  123. * @access public
  124. * @return string
  125. */
  126. public function __toString()
  127. {
  128. return $this->toString(true) ;
  129. }
  130. /**
  131. * 转换为 字符串 格式
  132. *
  133. * @access public
  134. * @param $bFull=true booll
  135. * @return void
  136. */
  137. public function toString($bFull=true)
  138. {
  139. $sVersion = "{$this->nPrimaryNum}.{$this->nSecondaryNum}.{$this->nModificatoryNum}" ;
  140. if(!$bFull)
  141. {
  142. return $sVersion ;
  143. }
  144. else
  145. {
  146. $sVersion.= '.'.$this->nInternalNum ;
  147. if($this->sVersionCode)
  148. {
  149. $sVersion.= ' '.$this->sVersionCode ;
  150. }
  151. return $sVersion ;
  152. }
  153. }
  154. /**
  155. * 取得主版本号
  156. *
  157. * @access public
  158. * @return int
  159. */
  160. public function primaryNumber()
  161. {
  162. return $this->nPrimaryNum ;
  163. }
  164. /**
  165. * 取得次版本号
  166. *
  167. * @access public
  168. * @return int
  169. */
  170. public function secondaryNumber()
  171. {
  172. return $this->nSecondaryNum ;
  173. }
  174. /**
  175. * 取得修正版本号
  176. *
  177. * @access public
  178. * @return int
  179. */
  180. public function modificatoryNumber()
  181. {
  182. return $this->nModificatoryNum ;
  183. }
  184. /**
  185. * 取得内部版本号
  186. *
  187. * @access public
  188. * @return int
  189. */
  190. public function internalNumber()
  191. {
  192. return $this->nInternalNum ;
  193. }
  194. /**
  195. * 取得版本代号
  196. *
  197. * @access public
  198. * @return string
  199. */
  200. public function versionCode()
  201. {
  202. return $this->sVersionCode ;
  203. }
  204. /**
  205. * 取得版本号的32位整数格式
  206. * 主版本号 5位 max:32
  207. * 次版本号 5位 max:32
  208. * 修正版本号 7位 max:128
  209. * 内部版本号(svn) 15位 max:32768
  210. *
  211. * @access public
  212. * @return int
  213. */
  214. public function to32Integer()
  215. {
  216. return ($this->primaryNumber()<< (self::INT32_BIT_INTERNAL+self::INT32_BIT_MODIFICTORY+self::INT32_BIT_SECONDARY) )
  217. + ($this->secondaryNumber()<< (self::INT32_BIT_INTERNAL+self::INT32_BIT_MODIFICTORY) )
  218. + ($this->modificatoryNumber()<< self::INT32_BIT_INTERNAL )
  219. + $this->internalNumber() ;
  220. }
  221. /**
  222. * 取得版本号补数的32位整数格式
  223. *
  224. * @access public
  225. * @return int
  226. */
  227. public function toCeil32Integer()
  228. {
  229. // 主版本号
  230. $sPrimaryNumber = $this->primaryNumber() ;
  231. $sSecondaryNumber = $this->secondaryNumber() ;
  232. $sModificatoryNumber = $this->modificatoryNumber() ;
  233. $tsInternalNumber = $this->internalNumber() ;
  234. // 从 内部版本号 开始
  235. if( $tsInternalNumber===0 )
  236. {
  237. $tsInternalNumber = pow(2,self::INT32_BIT_INTERNAL) - 1 ;
  238. // 修正版本号
  239. if( $sModificatoryNumber===0 )
  240. {
  241. $sModificatoryNumber = pow(2,self::INT32_BIT_MODIFICTORY) - 1 ;
  242. // 次版本号
  243. if( $sSecondaryNumber===0 )
  244. {
  245. $sSecondaryNumber = pow(2,self::INT32_BIT_SECONDARY) - 1 ;
  246. // 主版本号
  247. if( $sPrimaryNumber===0 )
  248. {
  249. $sPrimaryNumber = pow(2,self::INT32_BIT_PRIMARY) - 1 ;
  250. }
  251. }
  252. }
  253. }
  254. return ($sPrimaryNumber<< (self::INT32_BIT_INTERNAL+self::INT32_BIT_MODIFICTORY+self::INT32_BIT_SECONDARY) )
  255. + ($sSecondaryNumber<< (self::INT32_BIT_INTERNAL+self::INT32_BIT_MODIFICTORY) )
  256. + ($sModificatoryNumber<< self::INT32_BIT_INTERNAL )
  257. + $tsInternalNumber ;
  258. }
  259. /**
  260. * 通过32位整数格式 返回 一个 版本对象
  261. *
  262. * @access public
  263. * @return Version
  264. */
  265. static public function from32Integer($n32Version,$sVerCode='')
  266. {
  267. // 转换为 二进制
  268. $sDecVersion = decbin($n32Version) ;
  269. // 补齐 32位
  270. $sDecVersion = str_repeat('0',32-strlen($sDecVersion)).$sDecVersion ;
  271. $nPrimaryVer = bindec(substr($sDecVersion,0,self::INT32_BIT_PRIMARY)) ;
  272. $nSecondaryVer = bindec(substr(
  273. $sDecVersion
  274. , self::INT32_BIT_PRIMARY
  275. , self::INT32_BIT_SECONDARY)) ;
  276. $nModificatoryVer = bindec(substr(
  277. $sDecVersion
  278. , self::INT32_BIT_PRIMARY + self::INT32_BIT_SECONDARY
  279. , self::INT32_BIT_MODIFICTORY)) ;
  280. $nInternalVer = bindec(substr(
  281. $sDecVersion
  282. , self::INT32_BIT_PRIMARY + self::INT32_BIT_SECONDARY + self::INT32_BIT_MODIFICTORY
  283. , self::INT32_BIT_INTERNAL)) ;
  284. return new Version($nPrimaryVer,$nSecondaryVer,$nModificatoryVer,$nInternalVer,$sVerCode) ;
  285. }
  286. /**
  287. * 通过字串格式 返回 一个 版本对象
  288. *
  289. * @access public
  290. * @return Version
  291. */
  292. static public function fromString($sVersion)
  293. {
  294. if(!self::VerifyFormat($sVersion))
  295. {
  296. throw new VersionException('无效的版本号格式:%s',$sVersion);
  297. }
  298. //@list($sVersion,$sCode) = explode(' ',$sVersion) ;
  299. $arrVersionSegments = explode(' ',$sVersion) ;
  300. $sVersion = $arrVersionSegments[0] ;
  301. $sCode = isset($arrVersionSegments[1])? $arrVersionSegments[1]: '' ;
  302. //@list($nPrimaryVer,$nSecondaryVer,$nSecondaryVer,$nInternalVer) = explode('.',$sVersion) ;
  303. $arrVersionSegments = explode('.',$sVersion) ;
  304. $nPrimaryVer = isset($arrVersionSegments[0])? $arrVersionSegments[0]: 0 ;
  305. $nSecondaryVer = isset($arrVersionSegments[1])? $arrVersionSegments[1]: 0 ;
  306. $nModificatoryVer = isset($arrVersionSegments[2])? $arrVersionSegments[2]: 0 ;
  307. $nInternalVer = isset($arrVersionSegments[3])? $arrVersionSegments[3]: 0 ;
  308. return new self($nPrimaryVer,$nSecondaryVer,$nModificatoryVer,$nInternalVer,$sCode) ;
  309. }
  310. /**
  311. * 判断是否为合法的 版本号格式 字串
  312. *
  313. * @access public
  314. * @param $sVersion string
  315. * @static
  316. * @return bool
  317. */
  318. static public function verifyFormat($sVersion)
  319. {
  320. return (bool)preg_match('/^\d+(\.\d+){0,3}( [\w_\-]+)?$/',$sVersion) ;
  321. }
  322. // 属性 ///////////////////////////////////////////////////////////////////////////////
  323. /**
  324. * 各个版本号
  325. *
  326. * @access private
  327. * @var int
  328. */
  329. private $nPrimaryNum = 0 ;
  330. private $nSecondaryNum = 0 ;
  331. private $nModificatoryNum = 0 ;
  332. private $nInternalNum = 0 ;
  333. /**
  334. * 各个版本在 32整数 格式中的位宽
  335. *
  336. * 主版本号 5位 max:32
  337. * 次版本号 5位 max:32
  338. * 修正版本号 7位 max:128
  339. * 内部版本号(svn) 15位 max:32768
  340. */
  341. const INT32_BIT_PRIMARY = 5 ;
  342. const INT32_BIT_SECONDARY = 5 ;
  343. const INT32_BIT_MODIFICTORY = 7 ;
  344. const INT32_BIT_INTERNAL = 15 ;
  345. /**
  346. * 版本代号
  347. *
  348. * @access private
  349. * @var string
  350. */
  351. private $sVersionCode ;
  352. }