global loswerden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • global loswerden

    guten abend an die gemeinde,

    ich hab ein kleines problem ... ich entwickle mir derzeit eine page in OOP soweit ichs kann ^^ aber hab jetzt ein anliegen

    hier eine beispiel function:

    PHP-Code:
    public function footer() 
    {
    global 
    $temp;
        
    $temp->assign(array(
                
    'DEBUG'        =>    $db->debug()
                        ));
            
    $temp->display('footer.tpl');

    das global $temp; stört mich ich kann auf die smarty class aber nicht ohne das global zugreifen:

    Fatal error: Call to a member function display() on a non-object in blablabla..
    die classen werden mit folgendem script geladen:

    start.php
    PHP-Code:
    $workpath $_SERVER["DOCUMENT_ROOT"];
    require_once(
    "$workpath/lib/Factory.php");
    define'_CLASS_PATH_''/home/mpl/www/lib/' ); 

    try { 
    $conf     Factory::get'config::Config' );
    $db     Factory::get'database::MysqlDB' ); 
    $temp    Factory::get'smarty::Smarty' ); 
    $user     Factory::get'user::userhandler' ); 
    $page     Factory::get'mainpage::Mainpage' ); 
    $bbcode Factory::get'mainpage::BBcode' ); 
    }catch( 
    Exception $e ) { 
        echo 
    $e->getMessage(); 

    und das is der teil aus der factory.php

    PHP-Code:
    class Factory 
      
      public static function 
    get($class_name$params null) { 
      
      if( !
    is_string($class_name) || ! trim($class_name) ) { 
        throw new 
    Exception'kein gültiger Klassenname' ); 
      } 
      
      
    // gibt es die Klasse überhaupt  
      
    $file _CLASS_PATH_.strtolowerstr_replace'::'DIRECTORY_SEPARATOR$class_name ).'.class.php' ); 
      if( !
    file_exists$file ) ) { 
        throw new 
    Exception'Datei nicht gefunden' ); 
      } 
      
      require_once 
    $file
      try{ 
      
    $tmp explode'::'$class_name ); 
      
    $name array_pop$tmp ); 
      
    $obj = new $name$params ); 
      }catch( 
    Exception $e ) { 

      throw new 
    Exception'Fehler beim Konstruieren des Objektes: '.$e->getMessage() ); } 
      return 
    $obj
      } 

    hab die abstract factory aus nem forum über google gefunden um das global problem zu lösen aber klappt leider nicht


    würde mich freuen wenn mir jemand weiter hilft


    danke

  • #2
    Wenn dich global stört (völlig zurecht), dann brauchst du halt einen Scope drumherum. Was läge da näher als um die Deklaration von $temp eine Klasse zu schreiben?

    Kommentar


    • #3
      öhmm okay verstehe ich nicht sry bin anfänger kann mir das jemand genauer erklären? vllt mit beispielen am obrigen code

      Kommentar


      • #4
        PHP-Code:
        /**
         * Class Registry
         * globaler Behaelter fuer die Variablen und objecten, der statt global verwendet wird
         * Singelton
         * @autor Slava
         * @example 
         * //instanzieren
         * $r=Registry::getInstance();
         * $r->ding=new stdClass();
         * $r->ding->test='hallo wellt';
         *  
         * //und dann irgendwo in einer funktion oder anderer stelle
         * $a=Registry::getInstance();
         * if(isset($a->ding->test)) 
         * echo $a->ding->test;
         *
         */
        class Registry
        {
            
        /**
             * behaelter fuer die objecte und variablen
             * @staticvar registry
             * @access protected
             */
            
        protected static $registry;

            
        /**
             * factory singelton methode zum aufrufen von Registry instance
             *
             * @return Registry
             */
            
        public static function getInstance()
            {
                if(!isset(
        self::$registry))
                
        self::$registry=new self();

                return 
        self::$registry;
            }

            
        /**
             * konstructor
             * @access private
             */
            
        private function __construct()
            {
                
        self::$registry=new stdClass();
            }

            
        /**
             * magische methode __get
             *
             * @param string $was
             * @return mixed
             */
            
        public final function __get($was)
            {
                return 
        self::$registry->$was;
            }

            
        /**
             * magische methode __set
             *
             * @param string $was
             * @param mixed $wert
             */
            
        public final function __set($was,$wert)
            {
                
        self::$registry->$was=$wert;
            }

            
        /**
             * magische methode __isset
             *
             * @param string $was
             * @return bool
             */
            
        public final function __isset($was)
            {
                return isset(
        self::$registry->$was);
            }
        }
        #end class Registry 
        Slava
        bituniverse.com

        Kommentar


        • #5
          hmm also per registry.. so hab ichs bereits aber hab auf ne andere lösung gehofft :/

          danke

          Kommentar


          • #6
            Zitat von coty Beitrag anzeigen
            hmm also per registry.. so hab ichs bereits aber hab auf ne andere lösung gehofft :/
            andere lösung wäre
            $GLOBALS['temp'];
            unterscheidet sich aber in grunde kaum von
            global $temp;
            Slava
            bituniverse.com

            Kommentar


            • #7
              ja gut ne dann bleib ich doch lieber beim registry

              vielen dank

              Kommentar


              • #8
                Von config:: bis user:: würde ich das in eine Bootstrap-Klasse packen, BBCode als Modul laden und Mainpage über einen Controller ansteuern.
                Schau dir mal an wie das z.B. mit dem Zend Framework laufen würde: Zend Framework

                Kommentar


                • #9
                  werde ich machen zuvor aber noch ne frage... wie übergebe ich jetzt parameter?

                  z.b. hier:
                  PHP-Code:
                  //so war es zuvor
                  $array['author']    = $user->getnamebyid($row->author);
                  //und jetzt
                  $array['author']    = $user->userhandler->getnamebyid=$row->author;
                  //die function

                  public function getnamebyid($id)
                  {
                      
                  $username $db->MysqlDB->querySingleItem("SELECT username FROM user WHERE uid = $id"__FILE____LINE__);

                    if (
                  $db->MysqlDB->querySingleItem("SELECT status FROM user WHERE uid = $id"__FILE____LINE__) != 'activ') {
                        
                  $userdata "<a href=\"index.php?site=user?id=$id\">".htmlspecialchars($username)."</a> (Inaktiv)";
                        } else {
                        
                  $userdata "<a href=\"index.php?site=user?id=$id\">".htmlspecialchars($username)."</a>";
                        }

                  return 
                  $userdata;

                  als output erhalte ich nicht den usernamen sondern nur die ID sprich $row->author

                  was mache ich falsch?

                  Kommentar


                  • #10
                    PHP-Code:
                    $array['author']    = $user->userhandler->getnamebyid=$row->author
                    Das ist doch totaler Käse. getnamebyid ist eine Funktion und seit wann kann man Funktionen mit = einen Wert zuweisen?

                    Kommentar


                    • #11
                      ja ka hab iwas falsch aufgeschnappt

                      [COLOR=#000000][COLOR=#FF9900]
                      [/COLOR][/COLOR]
                      PHP-Code:
                      $array['author']    = $user->userhandler->getnamebyid($row->author); 
                      geht auch net ... Oo

                      Kommentar


                      • #12
                        Sicherlich scheitert es bereits beim Zugriff auf $user->userhandler. Mach mal ein var_dump() davon, dann wirst du es sehen.

                        Kommentar


                        • #13
                          jetzt erstmal kurz ne frage um fehler zu vermeiden:

                          es reicht ja wenn ich foldene code in den constructor einer class lege
                          PHP-Code:
                            $db    =Registry::getInstance();
                            
                          $temp    =Registry::getInstance();
                            
                          $conf    =Registry::getInstance();
                            
                          $user    =Registry::getInstance();
                            
                          $page    =Registry::getInstance(); 
                          oder muss ich die insanzen die ich in einer function benötige da ablegen?

                          den in der MainPage class funktioniert es.... aber wenn ich jetzt das gleiche in die UserHandler class ablege kann ich die getnamebyid function nicht aufrufen...

                          Code:
                          Fatal error:  Call to a member function querySingleItem() on a non-object in /home/mpl/workspace/PIP/lib/user/userhandler.class.php on line 136
                          line 136 ist

                          PHP-Code:
                              $username $db->MysqlDB->querySingleItem("SELECT username FROM user WHERE uid = $id"__FILE____LINE__); 

                          Kommentar


                          • #14
                            Ich habe dein Problem nicht wirklich verstanden, aber glaube, dass fehlermeldung davon abhängen könnte:

                            Registry::getInstance() liefert immer das gleiche statischer Object zurück.
                            Im klar text sind deine variablen $db, $temp , $conf $user und $page das gleiche Object.
                            Wenn du jetzt $db->ding='blum' machst und danach $temp->ding='blj', dann wird $db->ding=='blj' sein.
                            Ich vermute, dass gerade das eine Ursache für ein verlorenen Object sein könnte (Call to a member function ....)

                            Schafe dir erst mal die Namensräume um Problem zu vermeiden
                            $db=Registry::getInstance()->db=new DBclassInsantce(..);
                            jetzt kannst du $db->MysqlDB->..
                            als auch $db=Registry::getInstance()->db->MysqlDB->..
                            nutzen.
                            Hoffentlich habe ich dein Problem richtig verstanden.
                            Slava
                            bituniverse.com

                            Kommentar


                            • #15
                              ich versuchs mal anhand eines beispieles zu erklären:


                              index.php

                              PHP-Code:
                              <?
                              require "lib/start.php";

                              $page->Mainpage->title(Index);
                              $page->Mainpage->header();

                                 $news = $db->MysqlDB->queryObjectArray("SELECT * 
                                                FROM news 
                                                ORDER BY added DESC LIMIT 10
                                               ", __FILE__, __LINE__);

                                  $inhalt =    array();

                                 foreach($news as $row) {

                                     
                                      $numcomments  = $db->MysqlDB->querysingleitem("SELECT COUNT(*) FROM newscomments where newsid=$row->id", __FILE__, __LINE__);
                                    

                                  $array['id']         = $row->id;
                                      $array['added']      = $row->added;
                                      $array['title']      = $bbcode->BBcode->BBCode2Html($row->title);
                                      $array['body']       = $bbcode->BBcode->BBCode2Html($row->body);
                                  $array['numcomments']    = $numcomments;
                                  $array['author']    = $user->UserHandler->getnamebyid($row->author);
                                      $inhalt[] = $array;  

                                          $temp->Smarty->assign(array(
                                            'NEWS_ARR'        =>    $inhalt
                                                  ));
                                  }


                              $temp->Smarty->display('index.tpl');
                              lib/start.php

                              PHP-Code:
                              $workpath $_SERVER["DOCUMENT_ROOT"];
                              require_once(
                              "$workpath/lib/registry.php");
                              require_once(
                              "$workpath/lib/config/config.class.php");
                              require_once(
                              "$workpath/lib/database/mysqldb.class.php");
                              require_once(
                              "$workpath/lib/smarty/smarty.class.php");
                              require_once(
                              "$workpath/lib/user/userhandler.class.php");
                              require_once(
                              "$workpath/lib/mainpage/mainpage.class.php");
                              require_once(
                              "$workpath/lib/mainpage/bbcode.class.php");

                              $conf     Registry::getInstance();
                              $db     Registry::getInstance();
                              $temp    Registry::getInstance();
                              $user    Registry::getInstance();
                              $page    Registry::getInstance();
                              $bbcode    Registry::getInstance();

                              $conf->Config       = new Config();
                              $db->MysqlDB       = new MysqlDB();
                              $temp->Smarty       = new Smarty();
                              $user->UserHandler = new UserHandler();
                              $page->Mainpage       = new Mainpage();
                              $bbcode->BBcode       = new BBcode();

                              $user->UserHandler->start_session(); 
                              lib/user/userhandler.class.php
                              PHP-Code:
                              class UserHandler 
                              {
                              //restliche funktionen entfernt
                              public function getnamebyid($id)
                              {
                                  
                              $username $db->MysqlDB->querySingleItem("SELECT username FROM user WHERE uid =$id"__FILE____LINE__);

                                if (
                              $db->MysqlDB->querySingleItem("SELECT status FROM user WHERE uid =$id"__FILE____LINE__) != 'activ') {
                                    
                              $userdata "<a href=\"index.php?site=user?id=$id\">".htmlspecialchars($username)."</a> (death)";
                                    } else {
                                    
                              $userdata "<a href=\"index.php?site=user?id=$id\">".htmlspecialchars($username)."</a>";
                                    }

                              return 
                              $userdata;
                              }
                              ?> 
                              lib/mainpage/mainpage.class.php

                              PHP-Code:
                              class MainPage {
                              function 
                              __construct()
                              {
                                
                              $db    =Registry::getInstance();
                                
                              $temp    =Registry::getInstance();
                                
                              $conf    =Registry::getInstance();
                                
                              $user    =Registry::getInstance();
                                
                              $page    =Registry::getInstance();
                              }
                              public function 
                              header() 
                              {
                              //entfernt
                              }
                              public function 
                              footer() 
                              {
                              //etnfernt
                              }


                              und wie gesagt wenn ich jetzt die function $user->UserHandler->getnamebyid($row->author); auf der index.php aufrufe erscheint der fehler...

                              Kommentar

                              Lädt...
                              X