如何在PHP中执行一段代码块仅一次?

13

我有一个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()的语句?如何解决这个问题?


5
使用 require_once 是你需要的。你的文件只会被包含一次。确保阅读 require_once()、include() 和 include_once() 的手册。 - Andreas
如果Andreas的评论没有回答你的问题,你能否更详细地解释一下你想要实现什么? - Pekka
main.php文件将被多个其他php文件包含。我希望在类定义之后的main.php文件中的代码只执行一次,无论有多少文件包含它。全局执行一次而不是局部执行一次。 - Bruce
我认为Pekka的意思是为什么你想要防止它被执行多次?也许有其他解决问题的方法? - Rosdi Kasim
无论如何,您都不能将其包含多次,因为尝试重新声明该类将导致致命错误。 因此,就像安德烈亚斯所说的那样,您需要使用 require_once。 - Tom Haigh
3个回答

14

为确保某些代码不被第三方脚本重复执行,一种方法是创建一个标志:

if (!defined('FOO_EXECUTED')) {
    foo();
    define('FOO_EXECUTED', true);
}

在其他地方提到的Singleton模式只是强制所有实例化一个类的变量实际上指向同一个唯一实例。


我非常同意你的观点...在我看来,这里的开销更少。 - erik
1
@Keshav 我不知道你的关注点在哪里,但 PHP 脚本是独立运行的。 - Álvaro González
@ÁlvaroGonzález 非常感谢。直到最近我才知道php脚本是相互独立运行的,彼此之间不共享数据! - Keshav

3
我认为你需要使用单例模式。它只创建类的一个实例并在每次请求时返回相同的实例。
在软件工程中,单例模式是一种设计模式,用于通过限制类的实例化来实现数学概念的单例。当需要精确地协调系统中的操作时,这非常有用。该概念有时被推广到仅存在一个对象时更有效的系统,或将实例化限制为某些对象的数量(例如五个)。有些人认为它是一种反模式,认为它被过度使用,在不需要类的唯一实例的情况下引入了不必要的限制,并将全局状态引入应用程序中。 根据 OP 评论更新: 请查看此内容: PHP 的单例设计模式

我该如何在PHP中实现它?我已经了解了理论,但是我该如何实施它? - Bruce
1
@Jack 查询 PHP 单例模式的资料没找到吗? - Your Common Sense
@Shrapnel上校:这肯定会有所帮助 :) - Sarfraz
你可能想要补充说明,越来越多的人认为单例模式是一种反模式。朋友们不要使用单例模式。 - Gordon
@Gordon:是的,我现在已经添加了整个段落,而且是很重要的,也需要展示出来 :) - Sarfraz

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接