【问题标题】:Concatenation in class property [duplicate]类属性中的连接[重复]
【发布时间】:2012-02-10 17:39:28
【问题描述】:

可能重复:
Cannot use concatenation when declaring default class properties in PHP?

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

如果我在类变量中连接字符串,上面的代码不起作用。 如何解决这个问题。

【问题讨论】:

  • 当你声明一个类的属性,并指定初始值时,你不能做任何操作(比如连接)。而是在构造函数中执行。

标签: php class properties


【解决方案1】:

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;
}
?> 

您可以做的是将初始化移至构造函数。

【讨论】:

    【解决方案2】:

    在构造函数中移动初始化:

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

    当然,您需要使用所需的正确参数实际调用父构造函数。

    【讨论】:

      【解决方案3】:

      覆盖您的派生 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();
      

      【讨论】:

        猜你喜欢
        • 2018-11-03
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 2010-10-15
        相关资源
        最近更新 更多