Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с переменной класса
 
 автор: Sind84bad   (14.03.2010 в 11:58)   письмо автору
 
 

Приветствую.
Как разобраться с такой вот проблемой (см. комментарии):
<?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 в 13:16)   письмо автору
 
   для: Sind84bad   (14.03.2010 в 11:58)
 

Если
<? $this->config Core::getConfig();
заменить на
<? $core = new Core;
$this->config $core->getConfig();

то все работает, как надо. Но тогда конфиг загружается еще раз, вот в чем проблема...

  Ответить  
 
 автор: buldovsky   (14.03.2010 в 14:32)   письмо автору
 
   для: Sind84bad   (14.03.2010 в 13:16)
 

Проблема в том, что php понятия не имеет какой именно экземпляр класса Core вам нужно использовать в этой строке $this->config = Core::getConfig();

  Ответить  
 
 автор: Sind84bad   (14.03.2010 в 15:02)   письмо автору
 
   для: buldovsky   (14.03.2010 в 14:32)
 

Да, я понял. А как в данном указать на конкретный экземпляр?
Мне посоветовали объявить $config как глобальную переменную, но таким макаром мне придется каждую вторую переменную глобальной делать, и использование ООП потеряет смысл.
Есть еще вариант - передавать параметры загрузки класса через loadClass, но это означает множество хвостов от класса к классу

  Ответить  
 
 автор: buldovsky   (14.03.2010 в 15:39)   письмо автору
 
   для: Sind84bad   (14.03.2010 в 15:02)
 

К сожалению, я не совсем полностью понимаю что вы добиваетесь.
И не уверен что вы сами понимаете что делаете:

Если вы одним из свойств класса указываете экземпляр друго
> $this->$classname = new $classname();
то зачем использовать наследование второго класса?

Другими словами вы в классе A создаете свойство, которое является классом B, причем этот класс B является дочерним для класса A! Зачем?

Что именно вы хотите добиться? Может к черту это наследование? Можно использовать 2 отдельных класса и пусть один будет свойством другого.

  Ответить  
 
 автор: Sind84bad   (14.03.2010 в 15:48)   письмо автору
 
   для: buldovsky   (14.03.2010 в 15:39)
 

Он дочерним стал после ряда экспериментов)) Скорее всего, extends я уберу, он ничего не дает.
И если честно, я тут сам немного запутался.
В общем и целом:
1) при инициализации ядра (в любом случае!) создается экземпляр $core;
2) у него есть свойство config ($core->config), и возможно, будут еще не менее важные для остальных классов свойства;
3) все классы, которые будут использовать свойство config, являются "соседями" этого свойства, потому что тоже загружаются в $core.

Как добиться нормального взаимодействия методов с "соседями" по экземпляру?

  Ответить  
 
 автор: buldovsky   (14.03.2010 в 16:03)   письмо автору
 
   для: Sind84bad   (14.03.2010 в 15:48)
 

Как вариант пусть каждый "соседний" класс имеет свойство core в котором будет храниться ссылка на экземпляр ядра. Тогда доступ из любого "соседнего" класса к свойствам ядра можно будет иметь через $this->core->config

  Ответить  
 
 автор: Sind84bad   (14.03.2010 в 16:07)   письмо автору
 
   для: 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();
    }
?>


Вроде бы, как раз то, что надо. Всё гениальное просто, огромное спасибо!))

  Ответить  
 
 автор: buldovsky   (14.03.2010 в 16:30)   письмо автору
 
   для: 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
}

?>

  Ответить  
 
 автор: Sind84bad   (14.03.2010 в 16:35)   письмо автору
 
   для: buldovsky   (14.03.2010 в 16:30)
 

Такой метод даже красивее:) еще раз спасибо!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования