У меня есть один файл 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 ()? Как я могу это решить?
Я не могу понять, как исходный вопрос связан с принятым ответом. Если я хочу убедиться, что определенный код не выполняется более одного раза сторонними скриптами, которые включают его, я просто создаю флаг:
<?php if( !defined('FOO_EXECUTED') ){ foo(); define('FOO_EXECUTED', TRUE); } ?>
Шаблоны Singleton просто заставляют все переменные, которые инициируют один класс, фактически указывают на один и тот же единственный экземпляр.
Я думаю, вам нужен шаблон Singleton . Он создает только один экземпляр класса и возвращает вам то же самое каждый раз, когда вы его запрашиваете.
В разработке программного обеспечения одноэлементный шаблон представляет собой шаблон проектирования, используемый для реализации математической концепции одноэлементности, путем ограничения экземпляра класса на один объект. Это полезно, когда необходим один объект для координации действий в системе. Концепция иногда обобщается на системы, которые работают более эффективно, когда существует только один объект, или которые ограничивают экземпляр определенным количеством объектов (например, пять). Некоторые считают, что это анти-шаблон, судя, что он чрезмерен, вводит ненужные ограничения в ситуациях, когда единственный экземпляр класса фактически не требуется, и вводит глобальное состояние в приложение.
Обновление, основанное на комментарии OP:
См. Это:
Шаблон дизайна Singleton для PHP
Просто написал для этого класс.
Поскольку он называется 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