我有一个带有类定义的main.php文件。其他php文件使用此main.php文件
//main.php
<?php
class A{
}
//I want to execute the following statements exactly once
$a = new A();
/*
Some code
*/
?>
我在其他php文件中使用main.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()? 我该如何解决这个问题?
答案 0 :(得分:11)
我无法真正看到原始问题与接受的答案有何关联。如果我想确保某些代码不会被包含它的第三方脚本多次执行,我只需创建一个标志:
<?php
if( !defined('FOO_EXECUTED') ){
foo();
define('FOO_EXECUTED', TRUE);
}
?>
Singleton模式只强制实例化一个类的所有变量实际指向同一个实例。
答案 1 :(得分:3)
我认为您需要 Singleton pattern 。它只创建一次类的实例,并在每次请求时返回相同的内容。
在软件工程中,单身人士 模式是一种用于的设计模式 实现数学概念 单身,通过限制 将类实例化为一个 宾语。这完全有用 需要一个对象来协调 整个系统的行动。这个概念 有时会推广到系统 那时运作效率更高 只存在一个对象,或者那个 将实例化限制为a 一定数量的物体(比如说五个)。 有人认为它是一种反模式, 判断它被过度使用, 引入了不必要的限制 唯一的一个实例的情况 实际上并不需要课程,而且 将全球国家引入 应用
根据OP评论进行更新:
请看这个:
答案 2 :(得分:1)
刚刚为此写了一个课程。
由于它被静态调用,如果包含在应用程序的引导级别中,变量应该贯穿整个应用程序。
您也可以选择执行特定次数的代码。
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