連結

2012-01-15 6 views
1

可能性の重複:私はクラス変数に文字列を連結する場合は、上記のコードが動作していない
Cannot use concatenation when declaring default class properties in PHP?連結

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

。 これを修正する方法。

+0

それは動作しませんどのように? –

+1

クラスのプロパティを宣言して初期値を指定すると、操作(連結など)を行うことはできません。代わりにコンストラクタで行います。 – kapa

答えて

5

PHPはコンパイル時にこのような操作を行いません。たとえすべての演算子が定数であっても、演算値をコンマに割り当てることはできません。

"クラスメンバ変数は"属性 "と呼ばれ、"属性 "や"フィールド "などの他の用語を使用して参照することもできますが、この参照の目的では「プロパティ」を使用します。 この宣言には初期化が含まれている可能性がありますが、この初期化は定数値でなければなりません。つまり、次のときに評価できる必要があります。時間をコンパイルし、評価するためにランタイム情報に依存してはいけません。 ---あなたは何ができるか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

0
あなたのDSNでPDOを初期化するために、あなたの派生DBクラスのコンストラクタをオーバーライド

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();