Как я могу выполнить блок кода ровно один раз в PHP?

У меня есть один файл main.php с определением класса. Другие файлы php используют этот файл main.php

//main.php

<?php

class A{


}

//I want to execute the following statements exactly once    

$a = new A();
/*
Some code 
*/


?>

Я использую main.php в других php файлах, например

//php1.php
<?php
require_once("main.php");

$b = new A();

/* 
Some code
*/

?>

//php2.php
<?php
require_once("main.php");

$b = new A();

/* 
Some code
*/

?>

Есть ли какой-либо оператор в PHP, например execute_once()? Как это решить?

Ответ 1

Я не могу понять, как исходный вопрос связан с принятым ответом. Если я хочу убедиться, что определенный код не выполняется более одного раза сторонними скриптами, которые включают его, я просто создаю флаг:

<?php

if( !defined('FOO_EXECUTED') ){
    foo();

    define('FOO_EXECUTED', TRUE);
}

?>

Шаблоны Singleton просто заставляют все переменные, которые управляют одним классом, фактически указывают на один и тот же единственный экземпляр.

Ответ 2

Мне кажется, вам нужен шаблон Singleton. Он создает только один экземпляр класса и возвращает вам то же самое каждый раз, когда вы его запрашиваете.

В разработке программного обеспечения синглтон шаблон - это шаблон проектирования, используемый для реализовать математическую концепцию синглтон, ограничивая создание экземпляра класса для одного объект. Это полезно, когда точно необходим один объект для координации действия по всей системе. Концепт иногда обобщается на системы которые работают более эффективно, когда существует только один объект или ограничить экземпляр определенное количество объектов (скажем, пять). Некоторые считают, что это анти-шаблон, судя по тому, что это злоупотребление, вводит ненужные ограничения в ситуаций, когда единственный экземпляр класс на самом деле не требуется, и вводит глобальное состояние в приложение.

Обновление на основе комментария OP:

Пожалуйста, смотрите следующее:

Шаблон проектирования Singleton для PHP

Ответ 3

Просто написал для этого класс.

Поскольку он называется staticly, переменная должна охватывать все приложение, если оно включено в уровень начальной загрузки вашего приложения.

Вы также можете выбрать выполнение кода определенное количество раз.

class exec{    
  public static $ids = array();
  public static function once($id){
    if(isset(static::$ids[$id])){
      return false;
    } else {
      if(isset(static::$ids[$id])){
        static::$ids[$id]++;
      } else {
        static::$ids[$id] = 1;
      }
      return true;
    }
  }
  public static function times($id, $count=1){
    if(isset(static::$ids[$id])){
      if($count == static::$ids[$id]){
        return false;
      } else {
        static::$ids[$id]++;
        return true;
      }
    } else {
      static::$ids[$id] = 1;
      return true;
    }
  }
}

//usage

foreach(array('x', 'y', 'z') as $value){
  if(exec::once('tag')){
    echo $value;
  }
}

//outputs x

foreach(array('x', 'y', 'z') as $value){
  if(exec::times('tag2', 2)){
    echo $value;
  }
}

//outputs xy