如果尚未运行当前类,请运行方法?

时间:2012-01-11 18:53:46

标签: php oop

我有一个我正在编写的课程,我有一个方法,我想在每次启动课程时运行一次。通常这将在构造方法中进行,但我只需要在调用某些方法时运行它,而不是全部。

你们都建议我做到这一点?

3 个答案:

答案 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);