你好,
考虑类方法,每次做一些代码准备,即实例新对象,创建数组或连接长字符串,如下所示:
class Example
{
public function methodWithPreparations($timestamp)
{
// preparations
$date = new DateTime();
$format = implode('-', array('Y', 'm', 'd', 'h', 'i', 's'));
$append = ' some text';
$append .= OtherClass::someText(); // persisten during runtime
// using function arguments
return $date->setTimestamp($timestamp)->format($format).$append;
}
}
为代码准备实现一些缓存机制是好的,还是现代PHP能够自己处理它?我使用PHP 5.6,但我从未深入研究过它的内部工作原理。
如何使用$cache
属性如何:
class Example
{
protected $cache;
public function methodWithPreparations($timestamp)
{
if(empty($cache = &$this->cache('chacheKey'))) {
$cache['dateTime'] = new DateTime();
$cache['format'] = implode('-', array('Y', 'm', 'd', 'h', 'i', 's'));
$cache['append'] = ' some text'.OtherClass::someText();
}
// and then
return $cache['dateTime']->setTimestamp($timestamp)
->format($cache['format']).$cache['append'];
}
}
你的想法是什么?
答案 0 :(得分:1)
PHP不会为您缓存这些变量。在构造函数中将它们作为类变量创建,并在以后需要时重用它们。
public function __construct() {
$this->dateTime = new DateTime();
$this->dateFormat = implode('-', array('Y', 'm', 'd', 'h', 'i', 's'));
$this->append = ' some text'.OtherClass::someText();
}
public function methodWithPreparations($timestamp) {
return $this->dateTime->setTimestamp($timestamp)->format($this->dateFormat).$this->append;
}
您不需要重新创建DateTime,因为您可以重复使用它。您可以为不同的dateFormats创建一个缓存,如果不仅仅是时间戳更改,也会附加。
答案 1 :(得分:1)
您使用PHP - 因此您应该熟悉RFC 2616.您应该了解使用HTTP / 1.1实现的痛苦的复杂性,以及操作网站时缓存管理的问题。缓存函数的输出同样是一个复杂的提议,但PHP不会尝试实现任何机制来执行此操作。作为一种编程语言,它不需要。 (有趣的是,MySQL实现的过程语言的语义确实允许缓存,但它的实现非常非常有限。)
PHP不知道可以缓存一个值多长时间。它不知道使该缓存无效的条件。它无法使用生成数据项的代码维护数据项的关联。
这是你的工作。
出于完全相同的原因,我们无法确定您的方法是否有效。保存CPU周期(或数据库查询或网络数据包......)通常是一个好主意。但是,例如,上面的代码在对象持续存在的时间越来越长。如果它正在处理一个短暂的Web请求,这可能不是问题 - 但是如果您正在为核反应堆编写监控守护程序,那么您可能不希望将缓存用于绑定值(并且时间相关值应该具有TTL)。