#8 转载:五种常见的 PHP 设计模式

2020-08-06

注:这是我在很久以前收藏的一篇文章,来自 IBM Developer,整理资料的时候被翻出来,贴出来算了。
设计模式只是为 Java™ 架构师准备的 —— 至少您可能一直这样认为。实际上,设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非常有用?本文解释了这些问题。

#6 PHP 5.2 与 PHP 5.3+ 的几处差异

2018-11-22

修改一个我之前开发的一个 Discuz 插件对于 PHP 5.2 的支持(当时插件开发环境是 PHP 5.6.37),发现以下几处需要注意的地方:

#1 PHP 时间处理

2011-05-02

date/time/strtotime

time()  # 获得当前时间戳
date(fmtStr, timestamp)

strtotime("+1 day")
strtotime("next Thursday")
strtotime("last Thursday")
# 字符串 => 时间戳
php -r 'var_dump(strtotime("today"));' # 零点
php -r 'var_dump(strtotime("2011"));'
php -r 'var_dump(strtotime("2011-12"));'
php -r 'var_dump(strtotime("2011-12-13"));'
php -r 'var_dump(strtotime("2011-12-13 06:00:00"));'

# 时间戳 => 字符串
php -r 'var_dump(date("Y-m-d H:i:s", 0));'

DateTime

  • DateTimeInterface
  • DateTime
  • DateTimeImmutable
  • DateTimeZone
  • DateInterval
  • DatePeriod 实现 Traversable 接口
// DateTimeInterface::ATOM = "Y-m-d\TH:i:sP";
// DateTimeInterface::COOKIE = "l, d-M-Y H:i:s T";
// DateTimeInterface::ISO8601 = "Y-m-d\TH:i:sO";
// DateTimeInterface::RFC822 = "D, d M y H:i:s O";
// DateTimeInterface::RFC850 = "l, d-M-y H:i:s T";
// DateTimeInterface::RFC1036 = "D, d M y H:i:s O";
// DateTimeInterface::RFC1123 = "D, d M Y H:i:s O";
// DateTimeInterface::RFC7231 = "D, d M Y H:i:s \G\M\T";
// DateTimeInterface::RFC2822 = "D, d M Y H:i:s O";
// DateTimeInterface::RFC3339 = "Y-m-d\TH:i:sP";
// DateTimeInterface::RFC3339_EXTENDED = "Y-m-d\TH:i:s.vP";
// DateTimeInterface::RSS = "D, d M Y H:i:s O";
// DateTimeInterface::W3C = "Y-m-d\TH:i:sP";

$dateTime = new DateTime();

foreach ([
    'ATOM',
    'COOKIE',
    'ISO8601',
    'RFC822',
    'RFC850',
    'RFC1036',
    'RFC1123',
    'RFC2822',
    'RFC3339',
    'RFC3339_EXTENDED',
    'RSS',
    'W3C',
] as $format) {
    eval("print 'DateTimeInterface::$format\t'.\$dateTime->format(DateTimeInterface::$format).\"\n\";");
}
  • public static createFromFormat(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTime|false

  • public format(string $format): string

  • public modify(string $modifier): DateTime|false

  • public add(DateInterval $interval): DateTime
  • public sub(DateInterval $interval): DateTime

  • public diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval

  • public getOffset(): int

  • public getTimestamp(): int
  • public setTimestamp(int $timestamp): DateTime
  • public getTimezone(): DateTimeZone|false
  • public setTimezone(DateTimeZone $timezone): DateTime
  • public setDate(int $year, int $month, int $day): DateTime
  • public setISODate(int $year, int $week, int $dayOfWeek = 1): DateTime
  • public setTime(int $hour, int $minute, int $second = 0, int $microsecond = 0): DateTime
$d = new DateTime('2011-01-01T15:03:01.012345Z');
echo $d->format('Y-m-d\TH:i:s.u'); // 2011-01-01T15:03:01.012345

$d->modify('+1 month');
$d->add(new DateInterval("P1M"));

$publishDate = DateTime::createFromFormat('m/d/Y', '1/10/2014');
echo $publishDate->getTimestamp();