我目前正在使用一个现有的应用程序,该应用程序在用户登录时定义了几个常量。例如,如果Alice登录SOME_CONSTANT
则定义为1
,而如果Bob登录SOME_CONSTANT
则定义为2
。现在我正在努力写一个剧本,它会做一些事情,就像爱丽丝一样,也会做一些事,就像鲍勃一样。所谓"好像是",我的意思是SOME_CONSTANT
是以一种方式定义一次迭代,以另一种方式来定义下一次迭代。不幸的是,常量并不是切换值的最佳方法,此时重构应用程序以将其从常量更改为常量并不是一种选择。
我考虑过的一种方法是使用pcntl_fork()。我会在定义常数之前分叉,并为每个常数运行一个单独的过程。但是,我希望这个脚本能够在Windows和Linux上运行。目前,Windows不直接支持pcntl扩展。如果我能帮忙的话,我会尽量避免通过Cygwin让一切正常工作。
我考虑过的另一种方法是让脚本使用exec("php childscript.php constant_value")
调用子脚本。这个方法会允许一个子脚本以一种方式定义常量,而另一个子脚本则以另一种方式来定义常量吗?我认为应该,但我还没有测试。此外,这个方法还有其他主要问题吗?
还有其他我没有考虑过的方法会是更好的选择吗?谢谢你抽出时间。
正如您已经注意到的,使用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;
使用exec()
调用PHP子脚本的方法似乎运行良好。