gpt4 book ai didi

PHP 包含 2 个使用相同函数名称的文件会导致重新声明错误?

转载 作者:可可西里 更新时间:2023-11-01 00:03:47 25 4
gpt4 key购买 nike

我遇到了重新声明错误的问题。我还没有找到解决办法,但基本上:

  • 我有 2 个文件是模块,它们使用系统使用的相同函数名称,如 install()、uninstall() 等。
  • 当我同时包含这两个文件以收集数据时,出现重新声明错误。我想要它,以便我可以同时包含这两个文件,并且在加载下一个文件时,它只是重写之前的函数。

或者有什么方法可以取消设置或清除该功能?我试过包括、要求、要求一次等......没有工作:(

最佳答案

在 PHP 中,无法覆盖您之前定义的函数。

因此模块相互阻碍,一个模块阻止另一个模块工作。

实际上,模块需要使用相同的命名函数,同时它们必须能够彼此相邻共存。

这可以通过将模块代码移动到它们自己的类中来完成。一个模块就是一个类。

然后您可以定义一个接口(interface),其中包含您的模块类必须提供的功能。因此模块必须有一个流线型的接口(interface) - 例如每个模块都有一个 install()uninstall() 函数 - 只需定义一个 object interface首先指定那些需要的模块功能:

模块定义.php

interface Module {
public function install();
public function uninstall();
}

mod_Module1.php:

class Module1 implements Module {
public function install() {...}
public function uninstall() {...}
}

mod_Module2.php:

class Module2 implements Module {
public function install() {...}
public function uninstall() {...}
}

这样做之后,每当您的例程之一需要处理任何模块时,您可以使该函数需要一个模块:

function module_install(Module $module) {
$module->install();
}

此函数将只接受现有模块作为参数。因此,您不能为此使用标准要求/包含,但需要在使用前实例化模块。您也可以将其放入模块加载器函数中:

function module_require($moduleName) {
$class = $moduleName;
if (!class_exists($class) {
$file = sprintf('mod_%s.php', $moduleName);
require $file;
if (!class_exists($class)) {
throw new DomainException(sprintf('Invalid Module File %s for Module %s.', $file, $moduleName));
}
}
}

那么如何访问模块功能呢?

现在唯一剩下的就是访问实际的模块。

您可以创建一个包含所有模块的全局数组变量:

// Define existing modules
$modules = array('Module1', 'Module2');

// Require the modules
array_map('module_require', $modules);

// instantiate each module:
$moduleInstances = array_map(function($module){return new $module;}, $modules);

// map modules name (key) to it's module instance:
$modules = array_combine($modules, $moduleInstances);

// access module by name:
$modules['Module1]->install();

但是这有一些问题。例如,所有模块都需要一次加载,但您可能不需要使用所有模块。或者假设您将覆盖全局 $modules 数组,所有模块都将丢失。

为了防止所有这些并允许更多控制和更容易地访问模块,可以将其放入一个它自己的类中,该类将处理所有细节。就像知道哪些模块已加载或未加载的寄存器一样,根据需要进行注册。

对于以下内容,我假设一个模块只能存在一次。如果一个对象只能存在一次,这通常称为 Singleton。因此,我们将通过模块的名称将加载和提供模块的管理包装到它自己的处理细节的类中:

class Modules {
private $modules = array();
private static $instance;

// singleton implementation for Modules manager
private static function getInstance() {
if (null === Modules::$instance) {
Modules::$instance = new Modules;
}
return Modules::$instance;
}

// singleton-like implementation for each Module
public function get($moduleName) {
if (!isset($this->modules[$moduleName]) {
module_require($moduleName);
$newModule = new $moduleName();
if (! $newModule instanceof Module) {
throw new DomainException(sprintf('Not a Module: %s', $moduleName));
}
$this->modules[$moduleName] = $newModule;
}
return $this->modules[$moduleName];
}

// get a module by name
public static function get($moduleName) {
return Modules::getInstance()->get($moduleName);
}
}

将此类也放入 module_definitions.php 中,它应该始终包含在您的应用程序中。

因此,无论何时您需要访问模块,您现在都可以通过使用带有模块名称的静态 get 函数来完成:

Modules::get('Module1')->install();
Modules::get('Module2')->install();

关于PHP 包含 2 个使用相同函数名称的文件会导致重新声明错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6422394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com