访问另一个文件的全局变量和静态 class 属性,而不将它们纳入范围

Access global variables and static class properties of another file, without bringing those into scope

有什么方法可以包含 PHP 文件,并能够读取全局变量 and/or class 静态属性在该文件范围内的值,没有在调用范围内污染那些相同的全局变量和静态class属性?

假设我有 example.php:

$latestExample = null;

class Example {
  public $name;
  public static examples = [];

  public function __construct($name) {
    $this->name = $name;
    self::$examples[] = $this;
    $latestExample = $this;
  }
}

如果我使用 include('example.php')$latestExampleExample::$examples 将被这个文件填充——我不希望这样。相反,我想做一些事情,将此文件中的所有内容都限制在其他范围内,并且我自己的全局变量和静态 class 属性保持不变。

关于我“包括”的文件的重要细节

这里的解释是我有一个广泛的、极其复杂的、自定义编写的系统,它广泛地利用了全局变量和静态 class 属性。隐含地,全局 space 被视为页面所代表的它自己的“对象”。几年前,当我第一次做出这个选择时,这是一个值得怀疑的选择,但它对我来说非常有用,因为每一页都真正致力于所有细节以及特定主题的细节。我创建的所有变量和对象都是该主题拥有的东西。

当然,除了现在,我有一个主题可以有子主题的情况,我想将我拥有的所有用于子主题的个别主题重新使用,因为它们已经足够复杂了。问题是,运行 创建子主题的脚本会污染主要主题的全局变量和静态 class 属性,使脚本认为所有这些属性也是主要主题的属性.

我曾尝试研究 PHP 的“沙盒”选项,但我能找到的大部分内容要么已失效,要么是在线工具或环境。这与安全无关;我不需要单独的流程或类似的东西。我所看到的一些东西似乎可以完成这项工作,但由于它们不适合这样做,我找不到关于如何使用它们的指导。

出于好奇,系统为龙与地下城“v.3.5 修订版”角色生成了一个角色 sheet。每个页面都是给定角色的 sheet,因此全局变量和静态 class 属性应该是该角色的统计数据、能力和特征。现在我只想在与主角相同的页面中包含另一个角色(一个仆从)的统计数据和属性。过去我只是手动创建这样的部分,但现在我有一个像完整角色一样复杂的小黄人,我想重新使用我所有的东西来创建一个角色的 sheet为了这个奴才关于主角的部分 sheet.

我的解决方案是创建一个版本的“子主题”代码,而不是 echo'ing HTML,echo'ed a JSON 我感兴趣的变量 json_encode.

然后使用了另一个文件json_decode(`php sub-subject-json.php`);backtick operator 执行 shell 命令,在本例中,php 本身用我要查看的文件调用。

所以,例如,我以前可能吃过的地方

minion.php

<?php
  $name = 'Steve';
  $attack = 3;
  $damage = '1d6+3';
?><!DOCTYPE html>
<html>
<head><title><?php echo $name; ?></title></head>
<body>
  <h1><?php echo $name; ?></h1>
  <p><?php echo formatBonus($attack) . " $damage"; ?>
</body>
</html>

现在我有

minion-core.php

<?php
  $name = 'Steve';
  $attack = 3;
  $damage = '1d6+3';
?>

minion.php

<?php require_once('minion-core.php'); ?><!DOCTYPE html>
<html>
<head><title><?php echo $name; ?></title></head>
<body>
  <h1><?php echo $name; ?></h1>
  <p><?php echo formatBonus($attack) . " $damage"; ?>
</body>
</html>

minion-json.php

<?php
  require_once('minion-core.php');
  header('Content-Type: application/json; charset=utf-8');
  echo json_encode([
    'name' => $name,
    'attack' => $attack,
    'damage' => $damage,
  ]);
?>

然后我的主文件可以包含

leader.php

$steve = json_decode(`php minion-json.php`);

这是一个令人讨厌、丑陋的黑客攻击。但它确实有效,而且无需重构我编写的所有内容也能正常工作。