我有一个我正在编写的课程,我有一个方法,我想在每次启动课程时运行一次。通常这将在构造方法中进行,但我只需要在调用某些方法时运行它,而不是全部。
你们都建议我做到这一点?
答案 0 :(得分:3)
创建一个私有属性$methodHasBeenRun
,其默认值为FALSE
,并在方法中将其设置为TRUE
。在方法开始时,执行:
if ($this->methodHasBeenRun) return;
$this->methodHasBeenRun = TRUE;
答案 1 :(得分:1)
您没有明确指定在调用某些方法时只想运行给定方法的原因,但我会猜测您正在加载或初始化某些内容(可能是来自数据库的数据) ,每次都不需要浪费周期。
@DaveRandom提供了一个很好的答案,肯定会有效。这是另一种方法:
class foo {
protected function loadOnce() {
// This will be initialied only once to NULL
static $cache = NULL;
// If the data === NULL, load it
if($cache === NULL) {
echo "loading data...\n";
$cache = array(
'key1' => 'key1 data',
'key2' => 'key2 data',
'key3' => 'key3 data'
);
}
// Return the data
return $cache;
}
// Use the data given a key
public function bar($key) {
$data = $this->loadOnce();
echo $data[$key] . "\n";
}
}
$obj = new foo();
// Notice "loading data" only prints one time
$obj->bar('key1');
$obj->bar('key2');
$obj->bar('key3');
这样做的原因是您将缓存变量声明为static
。有几种不同的方法可以做到这一点。你可以把它变成类的成员变量等。
答案 2 :(得分:-1)
我会推荐这个版本
class example {
function __construct($run_magic = false) {
if($run_magic == true) {
//Run your method which you want to call at initializing
}
//Your normale code
}
}
因此,如果您不想运行它,请创建类似
的类new example();
如果你想要
new example(true);