我为了自己的目的创建了这个小家伙来获取大型会话ID:
// returns a 1024-byte hash for session IDs
class sha512_session {
private $IDvalue = '';
private $IDMAX_SALT = mt_getrandmax();
for ($i = 0; $i < 8; $i++) {
$seed = mt_rand(100, $IDMAX_SALT);
$IDvalue .= strtoupper(hash('sha512', $seed, false));
}
public function getID() {
return $IDvalue;
}
}
在类上下文之外,for()
循环的工作方式应该如此。当我把这个(工作)代码放在上面的类中时,PHP会返回以下内容:
Parse error: syntax error, unexpected '(', expecting ',' or ';' in ../sha-iterator.php on line ... ( line # for "private $IDMAX_SALT = mt_getrandmax()" )
所以,它在一个类之外工作正常并在类中打破。我在哪里陷入困境?
答案 0 :(得分:0)
For循环必须放在函数中。我认为你应该把它放在一个构造函数中。
class sha512_session {
private $IDvalue = '';
private $IDMAX_SALT;
function __construct() {
$this->IDMAX_SALT = mt_getrandmax();
for ($i = 0; $i < 8; $i++) {
$this->seed = mt_rand(100, $this->IDMAX_SALT);
$this->IDvalue .= strtoupper(hash('sha512', $this->seed, false));
}
}
public function getID() {
return $this->IDvalue;
}
}
答案 1 :(得分:0)
好的评论在这里回答了我的问题。声明期间的类属性初始化在编译时必须是常量,但mt_getrandmax()是运行时信息,因此它失败。这里正确的方法是声明变量,然后单独初始化它:
class sha512_session {
private $IDvalue = '';
private $IDMAX_SALT;
private function getRandomMax() {
$this->IDMAX_SALT = mt_getrandmax();
return $this->IDMAX_SALT;
}
function __construct() {
for ($i = 0; $i < 8; $i++) {
$this->seed = mt_rand(100, $this->getRandomMax());
$this->IDvalue .= strtoupper(hash('sha512', $this->seed, false));
}
}
public function getID() {
return $this->IDvalue;
}
}
$sessionID = new sha512_session();
echo $sessionID->getID();
或该主题的任何变体。