2012-01-11 3 views
0

У меня есть класс, который я пишу, и у меня есть метод, который я хотел бы запустить один раз за начало класса. Обычно это будет идти в методе построения, но мне нужно только запустить его, когда я вызываю определенные методы, а не все.Запустить метод, если он еще не запущен с текущим классом?

Как бы вы все это посоветовали?

ответ

3

Создайте приватную недвижимость $methodHasBeenRun, которая имеет значение defualt FALSE, и установите ее в TRUE в методе. В начале метода, сделайте следующее:

if ($this->methodHasBeenRun) return; 
$this->methodHasBeenRun = TRUE; 
+0

Благодарим за отзыв! – ATLChris

-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); 
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. Существует несколько способов сделать это. Вы можете сделать эту переменную-член класса и т. Д.

Смежные вопросы