级联类属性
问题描述:
可能重复:
Cannot use concatenation when declaring default class properties in PHP?级联类属性
class Db extends PDO {
protected $dsn = "mysql:host=".HOST.";dbname=".DB;
}
如果我在串联类变量字符串上面的代码不工作。 如何解决这个问题。
答
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;
}
?>
你可以做的是移动初始化而不是构造器..
答
将在构造函数初始化:
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
答
重写派生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();
它是如何不工作? – 2012-01-15 09:59:02
当你声明一个类的属性并指定初始值时,你不能做任何操作(如连接)。改为在构造函数中执行。 – kapa 2012-01-15 10:01:35