2012-01-15 97 views
1

可能重复:
Cannot use concatenation when declaring default class properties in PHP?级联类属性

class Db extends PDO { 
      protected $dsn = "mysql:host=".HOST.";dbname=".DB; 
} 

如果我在串联类变量字符串上面的代码不工作。 如何解决这个问题。

+0

它是如何不工作? – 2012-01-15 09:59:02

+1

当你声明一个类的属性并指定初始值时,你不能做任何操作(如连接)。改为在构造函数中执行。 – kapa 2012-01-15 10:01:35

回答

5

PHP在编译时不会执行这样的操作;即使所有操作符本身都是常量,您也不能将计算值分配给缺点。

“类成员变量被称为”属性“,也可以使用其他术语(如”属性“或”字段“)来引用它们,但为了此引用的目的,我们将使用”属性“。通过使用public,protected或private关键字之一来定义,后跟正常的变量声明该声明可能包括一个初始化,但是这个初始化必须是一个常量值 - 也就是说,它必须能够在编译时间,并且不能依赖运行时信息来评估。“ --- php.net documentation

<?php 
class SimpleClass 
{ 
// invalid property declarations: 
public $var1 = 'hello ' . 'world'; 
public $var2 = <<<EOD 
hello world 
EOD; 
public $var3 = 1+2; 
public $var4 = self::myStaticMethod(); 
public $var5 = $myVar; 

// valid property declarations: 
public $var6 = myConstant; 
public $var7 = array(true, false); 

// This is allowed only in PHP 5.3.0 and later. 
public $var8 = <<<'EOD' 
hello world 
EOD; 
} 
?> 

你可以做的是移动初始化而不是构造器..

1

将在构造函数初始化:

class Db extends PDO { 
    protected $dsn; 

    public function __construct() { 
     $this->dsn = "mysql:host=".HOST.";dbname=".DB; 
     parent::__construct($this->dsn); 
    } 
} 

你当然需要用它需要的适当参数实际调用父构造函数。

+0

感谢它的工作 – TPSstar 2012-01-15 10:14:08

0

重写派生DB类的构造函数与DSN初始化PDO:

class DB extends PDO { 

    public function __construct() { 

    // Optional, but cool way to initialize client encoding 
    $options = array(self::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES "utf8"'); 

    parent::__construct('mysql:host='.HOST.';dbname='.DB, $options); 
    } 

} 

// Usage 
$db = new DB();