有代码,但这是啥错误?

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-&gt;KEY)。 @alfasin:不,它在 PHP 中不起作用,这是我们现在正在谈论的语言。你没有改变常数。您正在创建一个名为“KEY”的新公共属性,它实际上是一个变量。访问常量就像self::KEYEncryption::KEY 一样,并且总是返回声明中分配的空字符串。 我会留下答案,这样其他人就不会像我一样踩到同一个地雷。更新答案。【参考方案3】:

您不能使用“const”,因为它会在编译时解析,此时函数调用尚不可能。

你可以像这样使用定义函数

define('KEY', md5('somesecretcode'));

这是一个函数,在运行时执行并且可以工作。您必须将其放置在可以执行的地方——例如类构造函数。

但在这种情况下使用define并不是一个很好的设计,因为创建类的实例会将一些内容写入全局(或命名空间)范围。

因此,您需要重新考虑您的解决方案。如果您坚持保持静态方法调用,也许将秘密作为输入参数传递给函数?

【讨论】:

以上是关于有代码,但这是啥错误?的主要内容,如果未能解决你的问题,请参考以下文章

这是啥错误,我该如何解决?进程以退出代码 -1073740791 (0xC0000409) 结束

错误:java:无效的源版本:Intellij 中的 8。这是啥意思?

这是啥意思 x86 汇编代码是啥意思? [复制]

下面的代码有啥问题?

我的 Python 代码关于这个算法有啥问题?

Tomcat正常启动,可以访问tomcat主页,却不能访问webapp中的项目的jsp文件,这是啥原因?