 |
19.08.2005, 12:01
| Nach oben
#1 | | Verplanter Benutzer
Registriert seit: 14.12.2004
Beiträge: 227
| 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!
|
| |
19.08.2005, 12:14
| Nach oben
#2 | | Patrick Freitag
Registriert seit: 17.08.2005
Beiträge: 118
| 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.
|
| |
19.08.2005, 12:57
| Nach oben
#3 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.481
| 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 A { public function setFoo($foo) { $_SESSION['foo'] = $foo; }
}
class B { 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 A { private $foo = '';
public function setFoo($foo) { $this->foo = $foo; }
public function getFoo() { return $this->foo; }
}
class B { 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.
|
| |
19.08.2005, 13:12
| Nach oben
#4 | | Verplanter Benutzer
Registriert seit: 14.12.2004
Beiträge: 227
| 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 A { 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!
|
| |
19.08.2005, 13:35
| Nach oben
#5 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.481
| 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.
|
| |
20.08.2005, 16:33
| Nach oben
#6 | | Verplanter Benutzer
Registriert seit: 14.12.2004
Beiträge: 227
| 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!
|
| |
20.08.2005, 17:16
| Nach oben
#7 | | Neuer Benutzer
Registriert seit: 20.12.2004
Beiträge: 8
| 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
|
| |
21.08.2005, 18:47
| Nach oben
#8 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.481
| 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.
|
| |
21.08.2005, 22:30
| Nach oben
#9 | | Verplanter Benutzer
Registriert seit: 14.12.2004
Beiträge: 227
| 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!
|
| | |