【问题标题】:PHP OOP properity constant usagePHP OOP 属性常量用法
【发布时间】:2010-05-19 15:15:53
【问题描述】:

我对 OOP 真的很陌生。我什至不是新手——我是菜鸟。所以。我想将我的伪 CMS 从“正常”编程转移到 OOP 编程系统。所以:

private static $dsn = DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME;

这里是什么导致问题?约束的使用?我不知道。我的编辑器(aptana studio)在 1 个常量后显示错误。谢谢

编辑:

感谢您的快速反应。我会在构造函数中完成。

编辑2:

但是如果我想使用单例呢?如何将参数传递给构造函数?

【问题讨论】:

    标签: php oop constants


    【解决方案1】:

    所有变量声明都必须是完全静态的。这意味着不使用常量、变量或其他可变项。

    要制作不完全纯文本的任何内容,您应该使用构造函数。

    【讨论】:

    • +1 请注意,在构造函数中设置静态成员可能没有意义,因为这样您就不能假设静态方法等在类被实例化之前会正常运行。但是 php 没有静态初始化器或任何东西,所以很难
    【解决方案2】:

    问题在于,当您将属性放入初始值设定项字段时,它们必须是内联常量。

    你正在做的事情不会起作用,但是,例如,这会:

    private static $dsn = 'mysql:host=localhost;dbname=mydb';

    我知道,这很愚蠢,但你甚至不能使用 PHP 常量。你必须以纯文本的形式真正拥有它。

    解决办法是在类的构造函数中初始化$dsn,像这样:

    class MyClass
    {
        public function __construct()
        {
            self:: $dsn = DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      无论如何,当您切换到 OOP 时,您不应该使用常量。将这些值传递给类的构造函数:

      public function __construct($db_type, $db_host, $db_name) {
          self::$dsn = $db_type.':host='.$db_host.';dbname='.$db_name;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-12
        相关资源
        最近更新 更多