我不知道大多数PHP程序员对PHP的感受如何,就我而言,一开始觉得很酷,灵活快速的开发,随意的数据类型,等等都给我们程序员带来便利。但渐渐的,随着担负起系统的维护性开发工作就发现,之前的各种便利条件都变成一场噩梦。PHP的天生特点决定了它只能是一门披着面向对象外皮的面向过程语言。程序里充斥着大量的面向过程片段。对于重构和代码重用来说,糟透了。
之前的某次培训里,公司的一高级经理说,什么是好的代码,好的代码就是没有重复的代码片段。姑且不论对错,单就内容而言,无重复代码片段可以带来很多好处,最显而易见的就是减少重复工作和代码更容易阅读。更深层的好处是代码更易维护和修改。
这就要求我们写代码时更多的考虑如何把代码拎出来,拎出来作为方法,亦或是类。
大学时候某专业课老师也说过,过度的模块化也会带来灾难,但对于过度过程化的PHP程序而言,我觉得我们只需要关注于去过程化。
从前一段时间开始,我在做需求的同时将功能性的内容整理出来,便于代码重用。以下是我所做的一个时间工具类。
<?php
require_once WEB_PATH.'include/FuncBase.cls.php';
/**
* 时间公用方法
*
* @package include
* @author jixiaolong
*/
class TimeFunc extends FuncBase{
private $week_map;
const ONE_SECOND = 1;
const ONE_MINUTE = 60;
const ONE_HOUR = 3600;
const ONE_DAY =86400; //一天的秒钟数24*60*60
function __construct(){
parent::__construct();
$this->doWeekMap();
}
/*
* 初始化week_map
*/
private function doWeekMap(){
$this->week_map = array(
1=>'星期一',
2=>'星期二',
3=>'星期三',
4=>'星期四',
5=>'星期五',
6=>'星期六',
7=>'星期日',
);
}
/*
* 获取某天所在的那一周的日期
* @param string $date 日期
* @return array $days 日期
*/
public function getWeekDays($date){
$days = array();
$timestamp = strtotime($date);
$w = date('w',$timestamp); //周几
$w = $w==0 ? 7 : $w;
$mondayTime = $timestamp-($w-1)*TimeFunc::ONE_DAY; //该周周一的时间戳
$n = 1;
$time = $mondayTime;
do{
$cur_date = date('Y-m-d',$time);
$days[$n] = array(
'date'=>$cur_date, //日期
'n'=>$n, //星期几(1-7)
'nweek'=>$this->week_map[$n], //星期几
);
$time += TimeFunc::ONE_DAY;
$n++;
}
while ($n<8);
return $days;
}
/**
* @todo 获取指定时间点之后N年N月N天N小时之后的时间
* @param string $time
* @param int $years
* @param int $months
* @param int $days
* @param int $hours
* @param int $minutes
* @param int $seconde
*/
public function getTimeAfterTime($time,$years=0,$months=0,$days=0,$hours=0,$minutes=0,$secondes=0){
$time = $this->changeToStamp($time);
if ($time===false){
return false;
}
//计算应该返回的时间戳
$time += $days*TimeFunc::ONE_DAY+$hours*TimeFunc::ONE_HOUR+$minutes*TimeFunc::ONE_MINUTE+$secondes*TimeFunc::ONE_SECOND;
if ($years!=0 || $months!=0){
$year = date('Y',$time);
$month = date('n',$time);
$day = date('j',$time);
$hour = date('G',$time);
$minute = date('i',$time);
$seconde = date('s',$time);
$m = $month+$months;
if ($m>=12){
$month = $m%12;
$month = $month==0 ? 12 : $month;
$year += intval($m/12);
}
else{
$month += $m;
}
$year += $years;
$time = mktime($hour,$minute,$seconde,$month,$day,$year);
}
return $time;
}
public function getHalfHourTime($time){
$time = $this->changeToStamp($time);
if($time===false){
return false;
}
$minute = date('i',$time);
$i = intval($minute);
if ($i<=30){
$time += (30-$i)*TimeFunc::ONE_MINUTE;
}
else {
$time += (60-$i)*TimeFunc::ONE_MINUTE;
}
return $time;
}
/**
* @todo 将时间转化为时间戳
* 时间戳变,非时间戳转化为时间戳,失败返回false
* @param int/string $time 字符串时间或时间戳
* @return int $time 时间戳
*/
private function changeToStamp($time){
if (is_numeric($time)===false){
//非时间戳形式的参数转化为时间戳
$time = strtotime($time);
if ($time<0 ||$time===false){
return false;
}
}
return $time;
}
/**
* @todo 比较2个时间的大小
* @param int/string $time1 时间1(字符串或时间戳)
* @param unknown_type $time2 时间2(字符串或时间戳)
* @return 1/-1/0 时间1比2大,返回1,小,返回-1,相等,返回0
*/
public function timeAccurateCompare($time1,$time2){
$time1 = $this->changeToStamp($time1);
$time2 = $this->changeToStamp($time2);
if ($time1>$time2){
return 1;
}
else if ($time1<$time2){
return -1;
}
else if ($time1==$time2){
return 0;
}
}
}