【问题标题】:Split PHP code of a module into separated include files将模块的 PHP 代码拆分为单独的包含文件
【发布时间】:2026-02-02 02:40:01
【问题描述】:

我有一段代码需要在我的应用程序的很多地方使用。

例子:

$count_device = VSE::count_device($cpe_mac);
$c_devices   = $count_device['Count_of_devices'];
$c_active    = $count_device['Count_of_active'];
$c_inactive  = $count_device['Count_of_inactive'];
$c_offline   = $count_device['Count_of_offline'];

现在,他们是我的控制器中的10。 如果我需要修复任何东西,我需要在10 的地方进行修复。

我正在寻找一种更好的方法来控制它。


我想写一个函数

public static function get_device_info($cpe_mac){

    $count_device = VSE::count_device($cpe_mac);
    $c_devices   = $count_device['Count_of_devices'];
    $c_active    = $count_device['Count_of_active'];
    $c_inactive  = $count_device['Count_of_inactive'];
    $c_offline   = $count_device['Count_of_offline'];

}

当我调用该函数时:$devices = get_device_info($cpe_mac);

我只能访问 1 个变量,即 $devices

我将无法访问该函数中的所有 5 变量。

  • $count_device
  • $c_devices
  • $c_active
  • $c_inactive
  • $c_offline

我找到了get_defined_vars,但这并不是我真正想要的。


问题

如何进行和实施?

如何移动一段代码并将其包含回来?

我应该开始研究 PHP 的 require/include 吗?

【问题讨论】:

  • 为什么要设置所有这些变量,不能只使用数组吗?似乎容易多了。

标签: php dry require-once


【解决方案1】:

我一直这样做,尤其是在整个网站上使用相同的页眉/页脚。只需将此行放在您想要要求代码的文档中。

<?php require_once('php/code_block_one.php'); ?>

如果您想在一个页面中多次调用同一代码块,请将require_once 更改为require

【讨论】:

  • 这只会运行一次代码。如果您调用它两次,它将不再运行。不要使用require_once。请改用require
  • 如果你把每个sn-p放在一个单独的文件中,代码结构也很差。文件很容易弄乱。
  • 您在我发布我的编辑之前发表了评论,虽然我想不出在文档中需要两次函数或重复变量声明的实例,但我已经更新了答案考虑到这一点。
  • 其实很有可能。例如,您可以循环运行此代码。
【解决方案2】:

如果您不想更改页面上的任何变量并且您可能正在考虑使用全局函数,您可以:

function get_device_info($cpe_mac)
{
    $count_device = VSE::count_device($cpe_mac);

    return [
        'c_devices'  => $count_device['Count_of_devices'],
        'c_active'   => $count_device['Count_of_active'],
        'c_inactive' => $count_device['Count_of_inactive'],
        'c_offline'  => $count_device['Count_of_offline'],
    ];

}

然后你会调用:

extract(get_device_info($someVar));

您将可以访问:

$c_devices;
$c_active;
$c_inactive;
$c_offline;

就像你一直做的那样

请注意,我并不是说这比其他提供的答案更好,我只是说这是一个替代方案。

希望这会有所帮助!

【讨论】:

  • 我想补充一点,如果他愿意改变他的变量,他需要改变的只是用$info = get_device_info($someVar); 替换extract(get_device_info($someVar)); 并使用$info['c_devices'], $info['c_active'] (.. .) 而不是$c_devices, $c_active (...)
  • 如果您不想更改太多现有代码,这是一个很好的解决方案。
【解决方案3】:

您可以将所有内容包装在 DeviceInfo 类中,然后只使用该类的属性。

class DeviceInfo 
{
    public $c_devices;
    public $c_active;
    public $c_inactive;
    public $c_offline;

    public function __construct($cpe_mac) {

        $count_device = VSE::count_device($cpe_mac);

        $this->c_devices   = $count_device['Count_of_devices'];
        $this->c_active    = $count_device['Count_of_active'];
        $this->c_inactive  = $count_device['Count_of_inactive'];
        $this->c_offline   = $count_device['Count_of_offline'];
    }
}

将类放在自己的名为 DeviceInfo.php 的文件中,然后在需要的地方就可以了

include_once("DeviceInfo.php");

在文件顶部并创建该类的新实例。 (我使用 include_once 来确保 DeviceInfo 类在已经定义的情况下不会被重新定义)

$deviceInfo = new DeviceInfo($cpe_mac);

您可以通过访问这样的属性来访问这些值。

$deviceInfo->c_devices;

通过这种方式,您可以获得值的代码完成(取决于您的 IDE),并且当您真正想在代码中使用该信息时,不必依赖记住数组键名。

如果您想更进一步,您甚至可以向此类添加 getter 函数,因此如果将来您需要更改这些值的计算或获取方式而不更改 API,它会简单得多。看起来像这样:

class DeviceInfo 
{
    protected $c_devices;
    protected $c_active;
    protected $c_inactive;
    protected $c_offline;

    public function get_c_devices() {
        return $this->c_devices;
    }

    public function get_c_active() {
        return $this->c_active;
    }

    public function get_c_inactive() {
        return $this->c_inactive;
    }

    public function get_c_offline() {
        return $this->c_offline;
    }

    public function __construct($cpe_mac) {

        $count_device = VSE::count_device($cpe_mac);

        $this->c_devices   = $count_device['Count_of_devices'];
        $this->c_active    = $count_device['Count_of_active'];
        $this->c_inactive  = $count_device['Count_of_inactive'];
        $this->c_offline   = $count_device['Count_of_offline'];
    }
}

这里唯一的区别是,现在要获取值,您将调用函数,而不是像这样直接访问属性:

$deviceInfo = new DeviceInfo($cpe_mac);
$deviceInfo->get_c_devices(); // returns devices

对于这么简单的示例,额外的代码可能不值得,但这确实使以后更容易更新此代码,而不会破坏应用程序其余部分中调用这些函数的所有要点。

【讨论】:

    【解决方案4】:

    使用传递引用。

    public static function 
    get_device_info($cpe_mac, &$count_device, &$c_devices, &$c_active, &$c_inactive, &$c_offline){
    
        $count_device = VSE::count_device($cpe_mac);
        $c_devices   = $count_device['Count_of_devices'];
        $c_active    = $count_device['Count_of_active'];
        $c_inactive  = $count_device['Count_of_inactive'];
        $c_offline   = $count_device['Count_of_offline'];
    
    }
    
    // now to call this function...
    Clazz::get_device_info("cpe_mac", $count_device, $c_devices, $c_active, $c_inactive, $c_offline);
    var_dump($count_device, $c_devices, $c_active, $c_inactive, $c_offline);
    // they output useful data!
    

    另外,根据您的用例,如果您的 PHP 代码没有直接从源代码部署到服务器(例如,如果您发布打包的 phars 等),您可能需要使用 cpp(C 预处理器)预处理您的文件。

    【讨论】:

      【解决方案5】:
      //METHOD 1
      public static $c_devices = null;
      public static $c_active = null;
      public static $c_inactive = null;
      public static $c_offline = null;
      
      public static function get_device_info($cpe_mac){
      
          $count_device = VSE::count_device($cpe_mac);
          self::$c_devices   = $count_device['Count_of_devices'];
          self::$c_active    = $count_device['Count_of_active'];
          self::$c_inactive  = $count_device['Count_of_inactive'];
          self::$c_offline   = $count_device['Count_of_offline'];
      
      }
      
      ClassName::$c_devices;
      ClassName::$c_active;
      ClassName::$c_inactive;
      ClassName::$c_offline;
      
      
      
      
      //METHOD 2
      public static $cpe_mac = null;
      
      public static function get_device_info($key){
          $count_device = VSE::count_device(self::$cpe_mac);
          return $count_device[$key];
      
      }
      
      ClassName::$cpe_mac = $cpe_mac;
      ClassName::get_device_info('Count_of_devices');
      ClassName::get_device_info('Count_of_active');
      ClassName::get_device_info('Count_of_inactive');
      ClassName::get_device_info('Count_of_offline');
      

      【讨论】:

        最近更新 更多