cakePHP -意外的全局,期望类中的字符串


cakePHP - Unexpected Global, expecting String in class

在我的类(这实际上是一个CakePHP模型)我试图简单地设置一个变量,然后从函数内部访问它,但我得到以下错误:

解析错误:语法错误,意想不到的T_GLOBAL,期望T_FUNCTION在/path/to/file/file.php的第120行

从我的文件开始的第120行如下:

global $accessid = 'accessid';
global $secret = "secret";
global $b = 0;
global $m = 0;
function generateCredentials() {    
    global $accessid;
    return $accessid;
}

你知道我哪里做错了吗?谢谢!

我猜这是在类定义中,如:

class Foo {
    global $var;
}

你不能在那里使用这个关键字。惟一可以在类属性前面加上可见性声明varpublicprotectedprivate的关键字。类属性始终是定义它们的类的属性,它们不能是全局变量。

如果你坚持,你可以在一个函数中从global中获取它们,并将它们设置为属性:

class Foo {
    public $var;
    public function foo() {
        global $var;
        $this->var = $var;
    }
}

这些都是非常丑陋的,特别是因为Cake提供了更好的工具来处理这些事情,比如Configure类来全局注册值。

或者你可能只想创建简单的类属性:

class Foo {
    public $accessid = 'accessid';
    public $secret = "secret";
    public $b = 0;
    public $m = 0;
    function generateCredentials() {    
        $this->accessid;
    }
}

你的问题不完全清楚上下文是什么。

自由代码 (如果此代码是独立的)

不使用global关键字来定义全局变量。只需在全局作用域中声明它们。

$accessid = 'accessid';
$secret = "secret";
$b = 0;
$m = 0;
function generateCredentials() {    
    global $accessid;
    return $accessid;
}

类成员(如果您的代码在类定义中找到)

如果您希望能够从类内部访问全局变量:

$accessid = 'accessid';
$secret = "secret";
$b = 0;
$m = 0;
class X {
   function generateCredentials() {    
       global $accessid;
       return $accessid;
   }
}

或者如果你想要类成员,而不是全局变量:

class X {
   public $accessid = 'accessid';
   public $secret = "secret";
   public $b = 0;
   public $m = 0;
   function generateCredentials() {
       return $accessid;
   }
}
请注意,在后一个示例中需要指定成员可见性。看一下说明书

仅在类/函数内部没有global

PHP中的常量是全局的,例如:

define('ACCESSID', '123456');
// inside the function ACCESSID is now available
function generateCredentials() {    
    echo ACCESSID;
}

我建议这样做

private $accessid;
private $secret;
private $b;
private $m;
function generateCredentials() {    
    global $accessid;
    global $secret;
    global $b;
    global $m;
    $this->accessid = $accessid;
    $this->secret = $secret;
    $this->b = $b;
    $this->m = $m;
    return $accessid;
}