去过程化

我不知道大多数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;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值