有代码,但这是啥错误?
Posted
技术标签:
【中文标题】有代码,但这是啥错误?【英文标题】:have the code, but what's this error?有代码,但这是什么错误? 【发布时间】:2012-09-29 03:24:53 【问题描述】:好的,我正在尝试在文件上传到服务器时对其进行加密。我在 *** 找到了代码 here,但我在植入它时遇到了问题。我收到错误unexpected '(', expecting ',' or ';' in where/the/file/is.php
。它指向const KEY = md5('somesecretcode');
行。我知道它是说它期待md5
之后的行尾,但我不知道为什么?您认为它会接受现在“加密”的字符串作为有效字符串。如果需要,我会上传更多代码。提前感谢您的帮助!我对此有点陌生,所以请不要太粗鲁。
这是代码
<?php
class Encryption
const CYPHER = MCRYPT_RIJNDAEL_256;
const MODE = MCRYPT_MODE_CBC;
const KEY = md5('somesecretcode');
public function encrypt($plaintext)
$td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, self::KEY, $iv);
$crypttext = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
return base64_encode($iv.$crypttext);
public function decrypt($crypttext)
$crypttext = base64_decode($crypttext);
$plaintext = '';
$td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
$ivsize = mcrypt_enc_get_iv_size($td);
$iv = substr($crypttext, 0, $ivsize);
$crypttext = substr($crypttext, $ivsize);
if ($iv)
mcrypt_generic_init($td, self::KEY, $iv);
$plaintext = mdecrypt_generic($td, $crypttext);
return trim($plaintext);
?>
我这样称呼它......
$encrypted_string = Encryption::encrypt('this is a test'); // Åž-\Ž“kcþ1ÿ4gî:Xƒã%
$decrypted_string = Encryption::decrypt($encrypted_string); // this is a test
【问题讨论】:
【参考方案1】:您不能将函数调用或数组与const
一起使用。您将不得不找到另一种设置常量的方法(或者只是硬编码md5('somesecretcode')
的值)。
【讨论】:
好的,我只是想确保我明白你在说什么。const
里面不能有函数调用,所以不管我是使用 md5 加密还是调用我自己的字符串加密函数?正确的?那么,我不需要调用函数,而是需要逐字输入加密代码?例如..const KEY = '9319ca52f60ac20f620a1a3b265ade79';
你是在说这个吗?顺便说一句,我不会将此作为我的密码。那太可笑了。
你不能将函数调用放在一个类中,除非它们在一个方法中(例如,public $var = myfunction()
也不起作用)。
@MichaelHarvey 正确,您可以将 md5 的字符串作为 const。也请注意 deizel 的评论。
我是新手,所以我不太明白 deizel 在说什么。那是什么意思?你能指点我在哪里可以在练习中使用它吗?我是一个动手学习者。
@MichaelHarvey 很简单,如果你有public $varName = md5('something');
你会得到同样的错误。不过,那是在一个班级内。我不确定您是否在课程中使用const
。【参考方案2】:
您不应使用函数在constructor
之外初始化const
变量。
你可以这样做:
class Encryption
const CYPHER = MCRYPT_RIJNDAEL_256;
const MODE = MCRYPT_MODE_CBC;
const KEY = '';
public function __construct()
$this->KEY = md5('somesecretphrase');
...
更新:
这不是真的!
尽管这段代码似乎在工作,但它真正做的是创建另一个名为KEY
的对象成员(即使它没有$
- 这有点令人困惑)并将其分配给md5('somesecretphrase')
。该成员不是常数,可以随时更改。
self::KEY
可以引用的类成员KEY
保持为空!
【讨论】:
我们可以将Encryption
更改为__construct
吗? PHP4 已于 5 年前报废。 :)
@deizel 我是一名 Java 程序员 - 请原谅我...(已修复!):)
抱歉,我删除了我的投票,因为事实证明这并没有按预期工作。您最终会得到一个保持为空的 const (self::KEY
) 和一个具有值但不是常量的属性 ($this->KEY
)。
@alfasin:不,它在 PHP 中不起作用,这是我们现在正在谈论的语言。你没有改变常数。您正在创建一个名为“KEY”的新公共属性,它实际上是一个变量。访问常量就像self::KEY
或Encryption::KEY
一样,并且总是返回声明中分配的空字符串。
我会留下答案,这样其他人就不会像我一样踩到同一个地雷。更新答案。【参考方案3】:
您不能使用“const”,因为它会在编译时解析,此时函数调用尚不可能。
你可以像这样使用定义函数
define('KEY', md5('somesecretcode'));
这是一个函数,在运行时执行并且可以工作。您必须将其放置在可以执行的地方——例如类构造函数。
但在这种情况下使用define并不是一个很好的设计,因为创建类的实例会将一些内容写入全局(或命名空间)范围。
因此,您需要重新考虑您的解决方案。如果您坚持保持静态方法调用,也许将秘密作为输入参数传递给函数?
【讨论】:
以上是关于有代码,但这是啥错误?的主要内容,如果未能解决你的问题,请参考以下文章
这是啥错误,我该如何解决?进程以退出代码 -1073740791 (0xC0000409) 结束