|
|
|
| Приветствую.
Как разобраться с такой вот проблемой (см. комментарии):
<?php
##################
## index.php ##
##################
define('PATHTOCORE', 'mycms/');
define('USEDB', true);
require(PATHTOCORE.'system/core.php');
$core->loadClass(PATHTOCORE.'system/database.php');
?>
|
<?php
##################
## core.php ##
##################
if(!defined('PATHTOCORE')) {echo "Access denied"; exit;};
class Core{
public $config;
function __construct(){
$this->loadConfig();
}
//loadConfig загружает конфиг-файл и импортирует все переменные в объекты $config
function loadConfig(){
require(PATHTOCORE.'settings/config.php');
$config = get_defined_vars();
foreach($config as $k=>$v){
$this->config->$k = $v;
}
}
//getConfig возвращает $config
function getConfig(){
return $this->config;
}
//loadClass загружает класс и тут же объявляет его как объект в $this с именем класса.
//то есть, загружаем database.php и получаем $core->database (выше) со свойствами класса database.
function loadClass($path){
require($path);
$classname = strtolower(substr(basename($path), 0, -strlen(strrchr($path, '.'))));
//echo basename($path);
$this->$classname = new $classname();
}
}
$core = new Core();
?>
|
<?php
##################
## database.php ##
##################
if(!defined('PATHTOCORE')) {echo "Access denied"; exit;};
class DataBase extends Core{
public $dbhdl;
public $params;
function __construct(){
//вот здесь возникла загвоздка. getConfig возвращает $config, но пустую.
//Почему так происходит, и каким образом сделать так,
//чтобы получать $config такой, какой она становится после объявления класса?
$this->params = Core::getConfig();
$this->connect();
}
function connect(){
if(defined('USEDB')){
$this->dbhdl = mysql_connect(
$this->params->dbhost,
$this->params->dblogin,
$this->params->dbpassword);
if($this->dbhdl)
mysql_select_db($this->params->dbname,$this->dbhdl);
}
}
}
?>
|
В ООП только начинаю разбираться, и сразу на практике. Сложно дается после привычки к процедурному коду... | |
|
|
|
|
|
|
|
для: Sind84bad
(14.03.2010 в 11:58)
| | Если
<? $this->config = Core::getConfig();
| заменить на
<? $core = new Core;
$this->config = $core->getConfig();
|
то все работает, как надо. Но тогда конфиг загружается еще раз, вот в чем проблема... | |
|
|
|
|
|
|
|
для: Sind84bad
(14.03.2010 в 13:16)
| | Проблема в том, что php понятия не имеет какой именно экземпляр класса Core вам нужно использовать в этой строке $this->config = Core::getConfig(); | |
|
|
|
|
|
|
|
для: buldovsky
(14.03.2010 в 14:32)
| | Да, я понял. А как в данном указать на конкретный экземпляр?
Мне посоветовали объявить $config как глобальную переменную, но таким макаром мне придется каждую вторую переменную глобальной делать, и использование ООП потеряет смысл.
Есть еще вариант - передавать параметры загрузки класса через loadClass, но это означает множество хвостов от класса к классу | |
|
|
|
|
|
|
|
для: Sind84bad
(14.03.2010 в 15:02)
| | К сожалению, я не совсем полностью понимаю что вы добиваетесь.
И не уверен что вы сами понимаете что делаете:
Если вы одним из свойств класса указываете экземпляр друго
> $this->$classname = new $classname();
то зачем использовать наследование второго класса?
Другими словами вы в классе A создаете свойство, которое является классом B, причем этот класс B является дочерним для класса A! Зачем?
Что именно вы хотите добиться? Может к черту это наследование? Можно использовать 2 отдельных класса и пусть один будет свойством другого. | |
|
|
|
|
|
|
|
для: buldovsky
(14.03.2010 в 15:39)
| | Он дочерним стал после ряда экспериментов)) Скорее всего, extends я уберу, он ничего не дает.
И если честно, я тут сам немного запутался.
В общем и целом:
1) при инициализации ядра (в любом случае!) создается экземпляр $core;
2) у него есть свойство config ($core->config), и возможно, будут еще не менее важные для остальных классов свойства;
3) все классы, которые будут использовать свойство config, являются "соседями" этого свойства, потому что тоже загружаются в $core.
Как добиться нормального взаимодействия методов с "соседями" по экземпляру? | |
|
|
|
|
|
|
|
для: Sind84bad
(14.03.2010 в 15:48)
| | Как вариант пусть каждый "соседний" класс имеет свойство core в котором будет храниться ссылка на экземпляр ядра. Тогда доступ из любого "соседнего" класса к свойствам ядра можно будет иметь через $this->core->config | |
|
|
|
|
|
|
|
для: buldovsky
(14.03.2010 в 16:03)
| | Сделал так,
<?php
##################
## index.php ##
##################
define('PATHTOCORE', 'mycms/');
define('USEDB', true);
require(PATHTOCORE.'system/core.php');
global $core;
$core->test();
$core->loadClass(PATHTOCORE.'system/database.php');
?>
|
<?php
##################
## database.php ##
##################
if(!defined('PATHTOCORE')) {echo "Access denied"; exit;};
class DataBase{
private $core;
function __construct(){
$this->core =& $GLOBALS['core'];
$this->connect();
}
?>
|
Вроде бы, как раз то, что надо. Всё гениальное просто, огромное спасибо!)) | |
|
|
|
|
|
|
|
для: Sind84bad
(14.03.2010 в 16:07)
| |
<?php
class Core {
...
function loadClass($classname){
$path = "путь/".$classname.".php";
if(file_exists($path)) require_once($path);
$this->$classname = new $classname($this);
}
}
class Abc {
function __construct($core){
$this->core = $core;
}
...
// теперь мы имеем доступ к свойствам Core через $this->core
}
?>
|
| |
|
|
|
|
|
|
|
для: buldovsky
(14.03.2010 в 16:30)
| | Такой метод даже красивее:) еще раз спасибо! | |
|
|
|