问题 如何在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 
*/


?>

我在其他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()? 我该如何解决这个问题?


6782
2018-04-30 09:05


起源

使用一次就是你需要的。您的文件将包含一次。请务必阅读require_once(),include()和include_once(); - Andreas
如果andreas的评论没有回答你的问题,你能否详细解释一下你想要实现的目标? - Pekka 웃
main.php文件将包含在其他几个php文件中。我希望main.php文件中的代码(在类defn之后)无论有多少文件包含它都要执行一次。全球一次不在当地。 - Bruce
我认为Pekka的意思是你为什么要阻止它被执行多次?也许还有另一种解决问题的方法? - Rosdi Kasim
你无论如何都不能包括它,因为你试图重新声明这个类会遇到致命的错误。因此,正如andreas所说,require_once就是你所需要的。 - Tom Haigh


答案:


我真的不明白原始问题与接受的答案有什么关系。如果我想确保某些代码不被包含它的第三方脚本多次执行,我只需创建一个标志:

<?php

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

    define('FOO_EXECUTED', TRUE);
}

?>

Singleton模式只强制实例化一个类的所有变量实际指向同一个实例。


11
2018-04-30 09:42



我真的要同意你的意见......在IMO这里开销较少 - the_e
但是这个线程在php + apache上下文中是否安全? - Keshav
@Keshav我不知道你关注的是什么,但PHP脚本彼此独立运行。 - Álvaro González
@ÁlvaroGonzález谢谢。直到最近我才知道php脚本彼此独立运行,没有相互共享的数据! - Keshav


我想你需要的 单身人士模式。它只创建一次类的实例,并在每次请求时返回相同的实例。

在软件工程中,单身人士   模式是一种用于的设计模式   实现数学概念   单身,通过限制   将类实例化为一个   目的。这完全是有用的   需要一个对象来协调   整个系统的行动。这个概念   有时候会推广到系统   在什么时候运作更有效率   只存在一个对象,或者那个   将实例化限制为a   一定数量的物体(比如五个)。   有人认为它是一种反模式,   判断它被过度使用,   引入了不必要的限制   唯一的一个实例的情况   实际上并不需要课程,而且   将全球国家引入   应用。

基于OP评论更新:

请看这个:

PHP的Singleton设计模式


3
2018-04-30 09:08



我如何在PHP中实现它?我得到了理论,但我该如何实现呢? - Bruce
@Jack谷歌搜索PHP单身无济于事? - Your Common Sense
@Jack:请看我更新的答案。谢谢 - Sarfraz
@col。弹片:它绝对应该有帮助:) - Sarfraz
您可能希望添加Singleton模式被越来越多的人视为AntiPattern。朋友不要让朋友使用单身人士。 - Gordon


刚刚为此写了一堂课。

由于它被静态调用,如果包含在应用程序的引导级别中,变量应该贯穿整个应用程序。

您还可以选择执行特定次数的代码。

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

1
2017-08-06 11:43