2013-07-04 3 views
0

Я изучаю ориентированный объект PHP, и я думаю, что я делаю что-то глупое.php abstract class property from another abstract class

У меня есть абстрактный класс userManager, и я хочу присвоить ему свойство $ db, которое будет экземпляром моего абстрактного класса базы данных.

Класс базы данных:

abstract class Bdd{   
     private static $instance = null; 

     public static function getInstance() { 
      return self::$instance; 
     } 

А класс userManager является:

abstract class usersManager{ 
     public $db = Bdd::getInstance(); 

У меня есть ошибка в этой строке: public $db = Bdd::getInstance();

(Parse ошибка: синтаксическая ошибка, неожиданный '(', ожидающий ',' или ';')

Это не так?

Я думаю, что я неправильно понял абстрактные классы, в одном случае лучше в одном случае?

ответ

2

Вы не можете вызвать метод, когда вы объявляете переменный класс, вам нужно будет сделать

public $db = null 
public function __construct() { 
    $this->db = Bdd::getInstance(); 
} 

Единственным глюк с этим, когда вы расширить этот класс, и вам необходимо создать конструктор вам нужно будет вызвать этот конструктор, а делая parent::__construct();

+0

Это кажется законным, но мой класс является абстрактным и метод __construct не называется ... – FLX

+0

Не имеет значения, что он абстрактный, будет вызвана функция __construct, если только в моем ответе не указано, что в вашем дочернем классе вы уже объявляя метод __construct, в этом случае вам нужно будет вызвать parent :: ___ construct() – Kris

+0

Я проверил документ и ваше право, но даже если я выполняю публичную функцию __construct() { \t \t \t echo 'CONSTRUCT'; \t \t} Функция построения не вызывается, и я не понимаю, почему. Вызывается другой метод этого класса. – FLX

0
public $db = Bdd::getInstance(); 

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

0

Параметры класса должны быть оценены во время компиляции, а не во время выполнения. В принципе, вы можете только предопределять простые значения, такие как строки, null, int e.c.t.

Поскольку результат Bdd:getInstance() не может быть известен до его запуска (т. Е. Время выполнения), его нельзя использовать в качестве предопределенного значения.

Необходимо установить параметр равным null, а затем настроить экземпляр БД в методе конструктора классов.