Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ładowanie singleton w __autoload()
Forum PHP.pl > Forum > PHP
tomek_swat
witam,
najpierw przedstawię sytuację kiedy wszystko mi działa
w katalogu /classes mam plik Config.php
  1. <?php
  2.    
  3.        class Config {
  4.        
  5.        private $data = array();
  6.        private static $instance;
  7.        
  8.        private function __construct() {}
  9.        
  10.        public static function getInstance(){
  11.            if(empty(self::$instance)){
  12.                self::$instance = new Config();
  13.            }
  14.            return self::$instance;
  15.        }
  16.        /*
  17.         public function setProperty($name, $val){
  18.             $this->data[$name] = $val;            
  19.         }
  20.         */
  21.        public function getProperty($name){
  22.            
  23.            $this->data = parse_ini_file('settings.php',true);
  24.            
  25.            if(!isset($this->data[$name])){
  26.                throw new Exception('Nie istniejąca dyrektywa: '.$name);
  27.            }
  28.            
  29.            return $this->data[$name];
  30.            
  31.        }
  32.        
  33.    }
  34.    
  35. ?>


kiedy ją dołączam do pliku znajdującego się w tym samym folderze index.php
  1. <?php
  2. require_once('Config.php');
  3.  
  4. $dane = Config::getInstance();
  5.        
  6.    echo $dane = Config::getInstance()->getProperty("login");
  7.    
  8. ?>

działa mi prawidłowo, ale jeśli chce to wywołać w innym pliku z innego folderu
  1. <?php
  2.    
  3.    define('DIR_MAIN', '../');
  4.    require(DIR_MAIN.'common.php');
  5.    
  6.    try {
  7.        
  8.    echo $dane = Config::getInstance()->getProperty("login");
  9.    
  10. } catch (MyException $error){
  11.    echo $error;
  12. }
  13.  
  14. ?>

to już niestety nic nie wypisuję? plik common.php dołącza plik /libs/classes.php
  1. <?php
  2.    
  3.    define('DIR_LIBS', '../libs/');
  4.    define('DIR_CLASS', 'classes/');
  5.    
  6.    function __autoload($className){
  7.        
  8.        $path = DIR_CLASS."$className.php";
  9.        
  10.        if(file_exists(DIR_LIBS.$path)){
  11.            
  12.        $ok = true;
  13.        require_once("$path");    
  14.        
  15.        }
  16.        
  17.        if($ok == false){
  18.            eval("class $className{};");
  19.            throw new MyException("Klasa: $className nie istnieje w ".DIR_LIBS.DIR_CLASS);
  20.        }
  21.    
  22.            
  23.    }
  24.    
  25. ?>

czy to pojawia się ze względu jakiegoś błędu odnośnie ładowania klasy, która jest singletonem poprzez funkcję __autoload()?
pzdr
wookieb
Da się
Kod
$klasa=call_user_func(array($className,'instance'));
tomek_swat
hmm jakoś nie mogę sobie z tym poradzić, ale z tego co przeczytałem w manualu wywnioskowałem, że __autoload() powinien mi działać statycznych konstruktorów(tutaj singleton) i dla zwykłych klas, których będę tworzył obiekty, zmodyfikowałem więc przedefiniowaną przeze mnie funkcję __autoload()
  1. <?php
  2. function __autoload($className){
  3.        
  4.        $path = DIR_CLASS."$className.php";
  5.        
  6.        if(file_exists(DIR_LIBS.$path)){
  7.            
  8.        $ok = true;
  9.        
  10.        if(method_exists($className,'getInstance'))
  11.        call_user_func(array($className,'getInstance'));
  12.        
  13.        require_once("$path");    
  14.        
  15.        }
  16.        
  17.        if($ok == false){
  18.            eval("class $className{};");
  19.            throw new MyException("Klasa: $className nie istnieje w ".DIR_LIBS.DIR_CLASS);
  20.        }
  21.    
  22.            
  23.    }
  24. ?>


ale gdy go wywołuję poprzez
  1. <?php
  2. echo $dane = Config::getInstance()->getProperty("login");
  3. ?>

czy też w ten sposób
  1. <?php
  2. $class = "Config";
  3. $do = call_user_func(array($class, 'getInstance'));
  4. echo $do->getProperty("login");
  5. ?>

nadal nic się nie wyświetla! co robię źle?
pzdr
wookieb
Kod
if(file_exists(DIR_LIBS.$path))
{
    require_once(DIR_LIBS.$path);  
    if(method_exists($className,'getInstance'))
    $klasa=call_user_func(array($className,'getInstance'));
}
else
{
    eval("class $className{};");
    throw new MyException("Klasa: $className nie istnieje w ".DIR_LIBS.DIR_CLASS);
}
tomek_swat
a jak to wywołać w głównym pliku, bo obecnie mi nie działa ani powyływanie obiektów z zwykłych klas ani z singletona,
jakby całe to __autoload() przestało działać, załącze może układ jeszcze:
http://img72.imageshack.us/my.php?image=screenzx0.gif

  1. <?php
  2.    
  3.    define('DIR_MAIN', '../');
  4.    require_once(DIR_MAIN.'common.php');
  5. /*    require_once(DIR_MAIN.'libs/classes/Config.php'); */
  6.    
  7.    try {
  8.        
  9.    echo $dane = Config::getInstance()->getProperty("login");
  10.    
  11. } catch (MyException $error){
  12.    echo $error;
  13. }
  14.  
  15.    try {
  16.        $pies = new Pies;
  17.        $pies->szczekSzczek();
  18.        
  19.    }catch (MyException $error){
  20.    echo $error;
  21. }
  22.  
  23. ?>

proszę jeszcze o chwilę cierpliwości, gdyż mi bardzo na tym zależy
pzdr

okazało się, że problemy generował plik settings.php który posiadał strukturę pliku *.ini
  1. ; <?php die(); ?>

i był niepotrzebnie dołączony w pliku common.php i wszystko kasował die();
pzdr i dzięki za pomoc
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.