Переключение на разные базы данных...

Предположим таблица User определена в базе данных, отличной от базы данных

специфицированной в конфигурационном файле.

Вот модель таблицы:

class User extends CActiveRecord

{

// opendd(…) мы используем эту функцию для переключения на базу данных отличную от заданной в конфигурации

 public static function opendb($connectionString,$username,$password)


 {


   //$connectionString='sqlite:'.'.......htdocs\blog\protected/data/blog.db'


   self::$db=new CDbConnection($connectionString,$username,$password);


   self::$db->active=true;


   self::$db->tablePrefix='tbl_';


 }

//

public static function model($className=__CLASS__)


{


    return parent::model($className);


}

//

public function tableName()


{


    return '{{user}}';


}

}


Здесь функция opendb() как раз и обеспечивает переключение на базу данных,

содержащую таблицу User. Переменная $db, определяется в классе CActiveRecord таким вот образом:

public static $db;

Все здесь работает как надо.

Вопрос заключается в следующем. Если переопределить $db в классе User, то функция opendb()

перестает работать. То есть, если написать вот так:

class User extends CActiveRecord

{

 [b]public static $db;[/b]

// opendd(…) //мы используем эту функцию для переключения на базу данных отличную от заданной в конфигурации

 public static function opendb($connectionString,$username,$password)


 {


   //$connectionString='sqlite:'.'.......htdocs\blog\protected/data/blog.db'


   self::$db=new CDbConnection($connectionString,$username,$password);


   self::$db->active=true;


   self::$db->tablePrefix='tbl_';


 }

//

public static function model($className=__CLASS__)


{


    return parent::model($className);


}

//

public function tableName()


{


    return '{{user}}';


}

}


то функция не работает…Чего тут я не понимаю, видимо, в наследование свойств в PHP…

Нужно переопределить метод getDbConnection().

Странное дело, просто копирую функцию getDbConnectin() из CActivRecord класса в класс User,

при этом не меняю в ней ни одной буквы, и все работает:

class User extends CActiveRecord

{

public static $db;

// opendd(…) //мы используем эту функцию для переключения на базу данных отличную от заданной в конфигурации

public static function opendb($connectionString,$username,$password)

{

//$connectionString=‘sqlite:’.’…htdocs\blog\protected/data/blog.db’

self::$db=new CDbConnection($connectionString,$username,$password);

self::$db->active=true;

self::$db->tablePrefix=‘tbl_’;

}

//

public static function model($className=CLASS)

{

return parent::model($className);

}

//

public function tableName()

{

return ‘{{user}}’;

}

//

[b]public function getDbConnection() // тупо копирую из CActiveRecord…

{

}[/b]

//

}


Разумеется, эта функция переопределилась, но ведь только чисто формально…

В составе родителя, получается, она работала не так как надо…

Такое ощущение, что в составе родителя эта функция использовала родительскую же

переменную public static $db, а не переопределенную в классе User…

Ну вообще-то я имел в виде не её копирование, а помещение своего кода внутрь неё :)

Функция getDbConnection() родительского класса обращается к своему public static $db, т.е. переопределить это поле не удастся.

Иными словами, PHP не допускает переопределения переменных в наследуемых классах,

а при появлении переменных с идентичными родительским именами трактует их как новые переменные…

Спасибо.

Это касается статических переменных и методов до версии 5.3. Собственно, это почти ответ на вопрос, почему используется Post::model()->find(), а не просто Post::find().

Большое вам спасибо.