Постоянное использование правильности ООП PHP - PullRequest
2 голосов
/ 19 мая 2010

Я действительно новичок в ООП. Я даже не новичок - я нуб. Так. Я хочу перенести свою псевдо-CMS из «обычного» программирования в систему программирования ООП. И так:

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

Что здесь вызывает проблемы? Использование ограничений? Я не знаю. Мой редактор (студия aptana) показывает ошибку после 1 константы. Спасибо

Edit:

Спасибо за быструю реакцию. Я сделаю это в конструкторе.

Edit2:

Но что, если я хочу использовать синглтон? Как передать аргументы в конструктор?

Ответы [ 3 ]

3 голосов
/ 19 мая 2010

Все объявления переменных должны быть полностью статическими. Это означает, что нельзя использовать константы, переменные или другие изменяемые элементы.

Чтобы сделать что-либо, что не является полностью простым текстом, вы должны использовать конструктор.

2 голосов
/ 19 мая 2010

Проблема в том, что свойства должны быть встроенными константами, когда вы помещаете их в поля инициализатора.

То, что вы делаете, не сработает, но это, например, будет:

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;
    }
}
1 голос
/ 19 мая 2010

См. Документацию :

Это объявление может включать в себя инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть в состоянии быть оцененной во время компиляции и не должна зависеть от информации времени выполнения для оценки.

Вы не можете объединять строки при определении свойств класса.

Пример из документации (для полноты):

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

?>

Поскольку вы все равно переключаетесь на ООП, вы не должны использовать константы. Передайте эти значения конструктору вашего класса:

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