我目前正在使用现有的应用程序,该应用程序在用户登录时定义了几个常量。例如,如果Alice登录SOME_CONSTANT
定义为1
,而Bob登录SOME_CONSTANT
定义为2
。现在,我正在尝试编写一个脚本,它将执行一些事情,好像它是Alice和一些事情,好像它是Bob。通过“好像它是”,我的意思是SOME_CONSTANT
被定义为一次迭代的一种方式和下一次迭代的另一种方式。不幸的是,常量不是切换值的最佳选择,重构应用程序以将这些变为常量不是一种选择。
我考虑过的一种方法是使用pcntl_fork()。我会在定义常量之前进行分叉,并为每个常量运行一个单独的进程。但是,我希望这个脚本能够在Windows和Linux上运行。目前,Windows不直接支持pcntl扩展。如果我能帮助它的话,我会尽量避免让所有事情都通过Cygwin。
我考虑的另一种方法是让脚本使用exec("php childscript.php constant_value")
调用子脚本。此方法是否允许一个子脚本定义一个常量的单向,另一个子脚本另一种方式定义它?我认为应该,但我还没有测试过。此外,有没有人可以通过这种方法看到任何其他主要问题?
还有其他方法我没想过会是更好的选择吗?谢谢你的时间。
答案 0 :(得分:0)
正如您已经注意到的,使用const
变量并不是处理任务的可行方法。此外,即使您不需要编写脚本来对多个用户执行某些操作,单个实例也不起作用 - 您需要在用户登录时“设置常量”,这是不可能的做。
如果您正在寻找伪 - readonly
实现,并且您使用的是OOP风格,则可以添加private
变量并覆盖__get
魔术方法。因此,当外部请求SOME_CONSTANT
时,您的班级将返回_someFakeConstant
的值。然后,在课程内的login()
或switchUser()
方法中,您可以安全地更改该值。
示例:
class User {
private $_someFakeConstant = -1;
public function __get($name) {
if ($name == 'SOME_CONSTANT') {
return $this->_someFakeConstant;
}
// handle undefined variables; trigger_error() will work (see example on php.net)
}
public function login() {
// logic to "identify" the user
$this->_someFakeConstant = 1;
}
}
$user = new User();
$user->login();
echo $user->SOME_CONSTANT;
答案 1 :(得分:0)
使用exec()
调用PHP子脚本的方法似乎工作正常。