Portal > Foren > PHP > PHP-Programmierung > Session - Projekt Kommunikation
Antwort
 
Themen-Optionen
Alt 19.08.2005, 12:01 Nach oben    #1
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 227
Standard Session - Projekt Kommunikation

Hallo zusammen,

bin mir mit einigem nicht ganz im klaren, auch wenn es wunderbar
Funktionieren würde aber meine frage geht eher dahin ist das schlau,
egal oder völlig verkehrt.

Ich bastel aus langeweile und selbstversuchszwecken ein ganz kleines
Artikel Projekt dazu habe ich auch eine eigene Classe-template
beigefügt. Nun habe ich die ersten schritte so behalten alles in der
Session abzulegen alle classen und natürlich Variablen welche ich zu
anderer Zeit brauche. (Missbrauch als temp sozusagen)

Meine Frage ist nun ist es Sinnvoll alles auf die Session abzuwälzen
was man kommunikativ zwischen den einzelnen classen oder modulen
benötigt.

Beipsiel:
Im Template kann man Variablen (ähnlich smarty) definieren diese
schreibe ich in zb. eine session['vars'] als array. somit habe ich diese in
jedem teil so zur Verfügung bis ich nach der Ausgabe das array wieder
verwerfe.

Bin ich da auf einem Holzweg, eure Meinungen oder umsätze würden
mich mal Interessieren. Hat ja jeder seinen eigenen weg der Dinge...

Dank
Mööp
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.08.2005, 12:14 Nach oben    #2
Patrick Freitag
 
Registriert seit: 17.08.2005
Beiträge: 118
Standard Session - Projekt Kommunikation

Wenn du Daten für jeden Teil frei zugänglich brauchst, wirst du wohl nur auf Sessions zurückgreifen können oder? Dafür wurden Sessions gemacht.
__________________
ProDuc - Mein bescheidender Blog über JavaScript und Co.
Neq' ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.08.2005, 12:57 Nach oben    #3
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.471
Standard Re: Session - Projekt Kommunikation

Zitat:
Zitat von DasMööp
ist es Sinnvoll alles auf die Session abzuwälzen
was man kommunikativ zwischen den einzelnen classen oder modulen
benötigt.
Also meiner Ansicht nach arbeiten doch Klassen innerhalb eines Scriptaufrust zusammen ... wozu genau brauchst Du dann Sessions?

Wenn Du eine andere Seite aufrufst, dann wird ein anderes Script abgearbeitet bzw. anderen Methodenaufrufe getätigt und Du kannst die Sachen aus der Session eh nicht gebrauchen.


Zitat:
Zitat von DasMööp
Im Template kann man Variablen (ähnlich smarty) definieren
Ich kenn jetzt Smarty nicht, demnach sei die folgende Aussage etwas mit Vorsicht zu genießen.

Zitat:
Zitat von DasMööp
diese schreibe ich in zb. eine session['vars'] als array. somit habe ich diese in jedem teil so zur Verfügung bis ich nach der Ausgabe das array wieder verwerfe.
Sehe ich das richtig, dass Du so etwas hier machst:

PHP-Code:
<?php

    
class {
          
           public function 
setFoo($foo) {
                 
$_SESSION['foo'] = $foo;
           }

    }


    class 
{
          
           public function 
doSomething() {
                 echo 
'Variable $_SESSION['foo'] = ' $_SESSION['foo'] . ' verwenden.' ;
           }

    }

    
session_start();

    
$objA = new A();
    
$objB = new B();

    
$objA->setFoo('bar');
    
$objB->doSomething();

?>
Wenn ja ... so ist das nicht gedacht. Du würdest dann z.B. so etwas machen.

PHP-Code:
<?php

    
class {
          
           private 
$foo '';

           public function 
setFoo($foo) {
                 
$this->foo $foo;
           }

           public function 
getFoo() {
                 return 
$this->foo;
           }

    }


    class 
{
          
           private 
$objA null;

           public function 
__construct($objA) {
                 
$this->objA $objA;
           }

           public function 
doSomething() {
                 echo 
'Variable A::$foo = ' $this->objA->getFoo() . ' verwenden.' ;
           }

    }


    
$objA = new A();
    
$objB = new B($objA);

    
$objA->setFoo('bar');
    
$objB->doSomething();

?>
Prinzip der Datenkapselung.

Hoffe, dass ich es richtig verstanden habe.

Script lauffähig mit PHP 5


Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.08.2005, 13:12 Nach oben    #4
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 227
Standard Session - Projekt Kommunikation

Hi,

jap so in der art liegt wohl mein Problem mit der Kommunikation werde
mich mal mit den Beispielen noch weiter befassen und nach lesen.

Bisher habe ich sowas auch nicht in dem Umfang gebraucht und daher
war mein Ansatz so das ich eine Classe in ne session geschoben habe.

Jede classe (class) hat ihre eigene Datei ... mein Dateiaufbau
class.name.php oder modul.name.php wobei modul zB. ein forum ist
und eine class.name.php zB. eine user classe mit allen möglichen
methoden für user funktionen beinhaltet.

PHP-Code:
<?php

   
class 
           
           private 
$foo ''

           public function 
setFoo($foo) { 
                 
$this->foo $foo
           } 

           public function 
getFoo() { 
                 return 
$this->foo
           } 

    } 

// das ist meine verwirrung
$_session['class_a'] = new A(); 

?>
denn habe dann in den Modulen auf die verschiedenen klassen
zugegriffen die ich gebraucht habe.

zb.

PHP-Code:
<?php

$_session
['class_a'] ->setFoo($foo);

?>
Ich denke ich habe da noch nen wurm im verständnis drin ... voll der
Knoten im Kopf meine ich ... nun werde da nochmal drüber brüten müssen (anhand deines Beispiels).

Danke schonmal
Mööp
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.08.2005, 13:35 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.471
Standard Session - Projekt Kommunikation

Zitat:
Zitat von DasMööp
PHP-Code:
<?php

$_session
['class_a'] ->setFoo($foo);

?>
Das ist meiner Ansicht nach absolut nicht zu empfehlen.
Du speicherst ein Objekt in einer Session, heißt, dass Du das Objekt auch bei der Übergabe an eine andere Seite de-/serialisieren musst.
Das ist nicht so der beste Weg

Außerdem wiederspricht das irgendwie der objektorientierten Technik. Es ist ja gerade der Sinn, dass man einer Klasse B eine Referenz auf ein Objekt der Klasse A übergibt, damit man in Klasse B auf Daten und Funktionalitäten der Klasse A zugreifen kann.


Ganz kleines Beispiel, welches nicht so ganz abstrakt ist:
PHP-Code:
<?php

    
class Content {
          
           private 
$content '';
           private 
$step;

 
           public function 
__construct($step 1) {

               if(!
is_numeric($step)) {
                   
$step 1;
               }
               
               
$this->step $step;
               
               
$this->setContent('Seite ' $this->step);
           }

           
           public function 
setContent($content) {
                
$this->content $content;
           }


           public function 
getContent() {
                 return 
$this->content;
           }
           
           
           public function 
getStep() {
                 return 
$this->step;
           }

    }


    class 
Template {
          
           private 
$objContent null;
           private 
$parsed false;
           
           private 
$tplString '';
           private 
$parsedCode   '';


           public function 
__construct($tplString) {
                 
$this->tplString $tplString;
           }
           


           public function 
setContentObject($objContent) {
                 
$this->objContent $objContent;
           }


           public function 
parse() {
                 
$this->parsedCode str_replace('{$test}'
                                                 
$this->objContent->getContent(), 
                                                 
$this->tplString);
                                                 
                 
$this->parsedCode str_replace('{$self}'
                                                 
$_SERVER['PHP_SELF'], 
                                                 
$this->parsedCode);                                  
                 
$this->parsedCode str_replace('{$step}'
                                                 
$this->objContent->getStep()+1
                                                 
$this->parsedCode);
                 
$this->parsed true;
           }
           
           
           public function 
display() {
                 if(!
$this->parsed) {
                      
$this->parse();
                 }

                 print(
$this->parsedCode);
                 
$this->reset();
           }
           
           
           public function 
reset() {
                 
$this->parsedCode '';
                 
$this->tplString  '';
                 
$this->parsed     false;
           }

    }

    
$tplString '<p style="color:red;">{$test}</p>
                  <a href="{$self}?step={$step}">neuladen</a>'
;

    
$tpl = new Template($tplString);

    
$step array_key_exists('step'$_GET) ? $_GET['step'] : 1;
    
$ctnt = new Content($step);
    
    
$tpl->setContentObject($ctnt);    
    
$tpl->display();

?>
Ist jetzt natürlich total simpel und bei weitem nicht "tutorialreif", aber man kann doch schon etwas damit arbeiten

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.08.2005, 16:33 Nach oben    #6
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 227
Standard Session - Projekt Kommunikation

Zwischenfrage -> Habe jetzt mal Testweise als Beispiel etwas zusammen
gestellt und wollte Wissen ob ich damit schon mal in die Richtige Richtung
Arbeite:

index.php

PHP-Code:
<?php

/* Error Reporting Parser */
error_reporting(E_ALL);
ini_set('display_errors',true);
 

/* Include - class - system */
include ('./system/class.system.php');
 

//echo class_exists('cms');
echo $cms->cms1();
echo 
'<br>';
echo 
$cms->cms3();
echo 
'<br>';
echo 
$cms->cms2();

?>

class.system.php

PHP-Code:
<?php

class cms {

    function 
_autoload($class) {
        include_once (
$class.'.php');
    }

    public function 
cms1() {

        
cms::_autoload('mysql');

        
$query 'SELECT info FROM e_boxe WHERE id="10"';
        
$res mysql::Dbquery($query);

        
$itm mysql_fetch_array($res);
        echo 
$itm['info'];
    }

    public function 
cms2() {

//        cms::_autoload('mysql');

        
$query 'SELECT info FROM e_boxe WHERE id="10"';
        
$res mysql::Dbquery($query);

        
$itm mysql_fetch_array($res);
        echo 
$itm['info'];
    }

    public function 
cms3() {
        
cms::_autoload('test');
        
test::test();
    }

}

$cms = new cms;

?>

mysql.php

PHP-Code:
<?php

CLASS mysql
{
    
/* var string Rechnername zB. localhost */
    
var $dbhost 'localhost';
    
/* @var string Datenk Username */
    
var $dbuser 'root';
    
/* @var string Datenbank Passwort */
    
var $dbpass '';
    
/* @var string Datenbankname */
    
var $dbname 'c_ejma';
    
    FUNCTION 
__construct() {
        
$this->dbconnect($this->dbhost,$this->dbuser,$this->dbpass,$this->dbname);
    }

    private FUNCTION 
dbconnect($dbhost,$dbuser,$dbpass,$dbname) {
        
$this->verbindung mysql_connect($dbhost,$dbuser,$dbpass) OR DIE ('MySQL Verbindung nicht möglich!');
        
$this->dbselect($dbname);
    }
    
    private FUNCTION 
dbselect($dbname) {
        
mysql_select_db($dbname) OR DIE ('Datenbank konnte nicht ausgewählt werden!');
    }
    
    public FUNCTION 
dbquery($sql) {
        
$res mysql_query($sql) OR DIE ('Die Abfrage ist Fehlerhaft! <br>'.$sql.'<br>'mysql_error());
        return 
$res;
    }
    
}
        
$mysql = new mysql;

?>

test.php

PHP-Code:
<?php

class test{

    public function 
test() {
        echo 
'???';
        
$query 'SELECT info FROM e_boxe WHERE id="10"';
        
$res mysql::Dbquery($query);

        
$itm mysql_fetch_array($res);
        echo 
$itm['info'];
    }

}

?>
Es funktioniert alles, nur wenn mal eben jemand drüber schauen könnte
ob das bislang auch so passt.

Dank
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.08.2005, 17:16 Nach oben    #7
Neuer Benutzer
 
Registriert seit: 20.12.2004
Beiträge: 8
Standard Session - Projekt Kommunikation

1. __autoload() wird mit zwei Unterstrichen geschrieben
2. __autoload() muß als Funktion und nicht als Methode deklariert werden.

siehe Handbuch
PHP-Code:
<?php
function __autoload($class_name) {
   require_once 
$class_name '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>
PHP ruft beim new vor dem new __autoload('Klassenbezeichner') auf, welche dann bei Bedarf das File mit der Klasse einfügt. Eventuelle Fehlerbehandlungen "File nich da, was soll ich tun?" müssen dann in der Funktion stattfinden. require_once() ist da die beste Lösung:
- Script wird nur einmal eingefügt;
- Fehlermeldung, wenn File nicht eingefügt werden kann
meikel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.08.2005, 18:47 Nach oben    #8
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.471
Standard Session - Projekt Kommunikation

Bzgl. __autoload() ist diese User-Anmerkung ganz nett:
http://www.php.net/manual/en/languag...load.php#54333

Weiterhin verstehe ich nicht so ganz, warum du statisch auf die Methoden der Klasse mysql zugreifst.

Speichere die Instanz doch als Membervariable und ruf dann die Methoden mittels
Code:
$this->dbInstance->method();
auf.

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.08.2005, 22:30 Nach oben    #9
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 227
Standard Session - Projekt Kommunikation

Hi,

viel Gelesen aber noch nicht ganz ausgereift, habe das Beispiel mal anhand
des Zieles schon mal umgebaut. Bislang schaut es jetzt so aus :

index.php
PHP-Code:
<?php

/* Error Reporting Parser */
error_reporting(E_ALL);
ini_set('display_errors',true);
 
/* Session Start */
session_start();

/* Include - class - system */
include ('./system/class.system.php');
 
/* test für Template */
tpl::setvar('head''Die Überschrift');
tpl::setvar('text''Kein File oder Direktory gefunden !');

?>

class.system.php

PHP-Code:
<?php

/* Autoload Class */
function __autoload($class) {
    
$_class false;

    
/* Include Class */
    
if (file_exists('./system/'.$class.'.php') == 1) {
        require_once (
$class.'.php');
        
$_class true;
    }

    
// catch error
    
if ($_class === false) {
        echo 
'Failed to include class/interface "'.$class.'.php"';
    }

}

class 
cms {

    public function 
__construct() {

        
/* Modul */
        //cms::get_modul();
        
        /* Template from Modul - Test */
        
$_body '01.tpl.php';

        
/* Template */
        
cms::pars_content($_body);

    }

    
/* Parse Template */
    
public function pars_content($_body) {

        
__autoload('tpl');
        
tpl::parse($_body);

    }

}

$cms = new cms;

?>

tpl.php

PHP-Code:
<?php

class tpl {

    var 
$tpl_vars;

    
/* ORDER ALL TPL CLASSES */
    
public function __construct() {
        
__autoload('tpl_var');
        echo 
class_exists('tpl_var');
    }

    
/* SET TPL VAR */
    
public function setvar($tpl_var$value null) {
        
/* Set Array with Var-names and Var-values */
        
if (is_array($tpl_var)){
            foreach (
$tpl_var as $key => $val) {
                if (
$key != '') {
                    
$_SESSION['tpl_vars'][$key] = $val;
                }
            }
        } else {
            if (
$tpl_var != '')
               
$_SESSION['tpl_vars'][$tpl_var] = $value;
        }
    }

    
/* GET PARSE CONTENT */
    
public function parse($parse_file) {

        
/* GET - Content from tpl main File */
        
ob_start();
        include (
'./html/main.tpl.php');
        
$_parse ob_get_contents();
        
ob_end_clean();

        
/* GET - Content from tpl File */
        
ob_start();
        include (
'./html/'.$parse_file);
        
$_fill ob_get_contents();
        
ob_end_clean();

        
/* Add Body Template */
        
$_fill = array("body_tpl"=>$_fill);
        
$_parse tpl_var::parse_var($_parse,$_fill);

        
/* Parse Variablen */
        
$_parse tpl_var::parse_var($_parse,$_SESSION['tpl_vars']);

        echo 
$_parse;
    }

}

?>

tpl_var.php
PHP-Code:
<?php

class tpl_var
{

    function 
parse_var($_parse,$_vars)
    {
        
/* All Special Vars */
        
$count substr_count($_parse,'{$G ');
        
$count $count substr_count($_parse,'{$P ');
        
$count $count substr_count($_parse,'{$S ');

        for (
$i $count$i 0$i--)
        {
            
$suche "/[\{][\$]([.VGPS])(.*)[\}]/";
            
preg_match($suche,$_parse,$preg);

            
/* Var 'GET' in Template */
            
if ($preg[1] == 'G'){
                foreach (
$_GET as $key => $unit){
                    if (
$key == ltrim($preg[2]))
                        
$var_new $unit;
                    }
                }
            
/* Var 'POST' in Template */
            
if ($preg[1] == 'P'){
                foreach (
$_POST as $key => $unit){
                    if (
$key == ltrim($preg[2]))
                        
$var_new $unit;
                    }
                }
            
/* Var 'SESSION' in Template */
            
if ($preg[1] == 'S'){
                foreach (
$_SESSION as $key => $unit){
                    if (
$key == ltrim($preg[2]))
                        
$var_new $unit;
                    }
                }



            
$_parse str_replace($preg[0],$var_new,$_parse);
            unset (
$var_new);
            unset (
$preg);
            }

        
/* VARS - DEFAULT - DEFIN */
        
if (!empty($_vars)) {
            foreach (
$_vars as $key => $unit){
                
$suche "/[\{](".$key.")[\}]/";
                
preg_match($suche,$_parse,$preg);

                if (
in_array($key,$preg))
                    
$_parse str_replace($preg[0],$unit,$_parse);
            }
        }
        
        return 
$_parse;
        }

    }

?>
Ich denke das ich da noch einiges machen muss lesen feinarbeiten
überdenken aber erstmal funktioniert das so.

Meikel danke habe das dann noch mal auf zwei anderen Seiten
angeschaut und auch Bens Link angeschaut und mal abgespeckt nach
gebastellt.

Ben mit dem
PHP-Code:
<?php
$this
->dbInstance->method();
?>
meine ich zu verstehen was Du damit willst aber ist das nicht egal.
Ist mir grad noch nicht klar ... hmm

Sowei der Status ... denke es wird langsam aber sicher
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
DasMööp ist offline