访问另一个文件的全局变量和静态 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')
,$latestExample
和 Example::$examples
将被这个文件填充——我不希望这样。相反,我想做一些事情,将此文件中的所有内容都限制在其他范围内,并且我自己的全局变量和静态 class 属性保持不变。
关于我“包括”的文件的重要细节
- 它们可能包含事物本身——几乎总是使用
require_once
。
- 他们可以通过
$GLOBALS
显式设置全局变量,不一定只是通过在根范围内写入变量。这似乎无法 this answer.
- 这里的安全问题为零。这些是位于服务器上的静态脚本文件,没有任何用户交互。
- 我可以随意修改这些文件,但本练习的重点是限制我必须修改的程度。例如,建议我“简单地”重写所有内容以避免以这种方式使用全局变量和静态 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`);
这是一个令人讨厌、丑陋的黑客攻击。但它确实有效,而且无需重构我编写的所有内容也能正常工作。
有什么方法可以包含 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')
,$latestExample
和 Example::$examples
将被这个文件填充——我不希望这样。相反,我想做一些事情,将此文件中的所有内容都限制在其他范围内,并且我自己的全局变量和静态 class 属性保持不变。
关于我“包括”的文件的重要细节
- 它们可能包含事物本身——几乎总是使用
require_once
。 - 他们可以通过
$GLOBALS
显式设置全局变量,不一定只是通过在根范围内写入变量。这似乎无法 this answer. - 这里的安全问题为零。这些是位于服务器上的静态脚本文件,没有任何用户交互。
- 我可以随意修改这些文件,但本练习的重点是限制我必须修改的程度。例如,建议我“简单地”重写所有内容以避免以这种方式使用全局变量和静态 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`);
这是一个令人讨厌、丑陋的黑客攻击。但它确实有效,而且无需重构我编写的所有内容也能正常工作。