ebiz-webhosting
- Ad -
php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #16 (permalink)  
Alt 31-10-2007, 14:38
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Ich hätte das eingangs dargestellte Problem so modelliert:
PHP-Code:
class ParentClass {
    public 
$name;
    protected 
$children = array();
    
    public function 
__construct($name) {
        
$this->name $name;
    }
    public function 
giveBirth() {
        
$this->children[] = new ChildClass($this->name);
    }
    public function 
adopt(ChildClass $child) {
        
$child->name $this->name;
        
$this->children[] = $child;
    }
}

class 
ChildClass extends ParentClass {}

$parent = new ParentClass('Meier');
$parent->giveBirth(); 
Parents vererben den Namen an alle Kinder. Nicht nur die Eigenschaft an sich, sondern den aktuellen Wert.
Wie man leicht sieht ist die ChildClass hier völlig überflüssig. Refaktoriert bleibt das übrig:
PHP-Code:
class HumanClass {
    public 
$name;
    protected 
$children = array();
    
    public function 
__construct($name) {
        
$this->name $name;
    }
    public function 
giveBirth() {
        
$this->children[] = new HumanClass($this->name);
    }
    public function 
adopt(HumanClass $child) {
        
$child->name $this->name;
        
$this->children[] = $child;
    }

Und siehe da, das ist eine Implementierung eines Prototype Pattern, giveBirth() ist die clone-Methode.

Dein zuletzt genanntes Szenario 'settings' verlangt eher das Decorator Pattern. Denn die Anforderung "für eine besondere aufgabe gibt es zusätzliche werte" läßt sich nicht sauber mit nur einer Klasse erschlagen.
Mit Zitat antworten
  #17 (permalink)  
Alt 31-10-2007, 16:29
Ichier
 Newbie
Links : Onlinestatus : Ichier ist offline
Registriert seit: Oct 2007
Beiträge: 8
Ichier ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Du verwechselst Dogmatismus mit Disziplin!!
nö, sicher nicht.
Zitat:
Nicht jede Kuh sollte auf dem Performace-Altar geopfert werden..
Dem kann ich nur zu 100% beistimmen!
Zitat:
Wer Fragen nach der Performance solcher Kinkerlitzchen stellt, der programmiert vermutlich noch nicht mal ansatzweise performant. (...) dieses Quentchen entscheidend (...)
so einen schwachsinn habe ich lange nicht mehr gelesen. kleinvieh macht mist. viel kleinvieh macht viel mist. wer nicht programmieren kann soll dennoch wenigstens aufs kleinvieh achten dürfen, vielleicht wird ja nochmal was draus . wenn jemand pedantisch ist, sagt das noch lange nicht aus, daß er das ganze nicht im blick hat.
Zitat:
welche verschiedenste Ausgaben tätigen sollen bzw. DB Inhalt in csv,pdf,jpg,xml,html verwandeln
nein, sorry, das war vielleicht irreführend, nur ein versuch eines einfachen beispiels. es geht um die hierarchie/struktur und die methodik beim vererben/überschreiben der (objekt)werte. das settingsbeispiel ist klarer. ... mit interfaces lässt sich das meines wissens nicht (sinnvoll) bewerkstelligen, oder?
Zitat:
auf Wunsch eine rudimentäre DB Klasse zeigen
ja bitte, wenns die aufgabe besser löst jedenfalls

@ onemorenerd : hm, machst du nicht das gleiche wie ich? und wo kommt adopt zum einsatz?
child ist nicht überflüssig, denn hätte ich keine methoden in basis und kind, würde ich mir die objekte auch gleich sparen...
Außerdem machst du genau das, was ich ja gerne aus der scriptebene heraushaben möchte: du weist die werte selbst zu, im beispiel sogar einzeln, da tut es dann auch das extends mit der schleife. oder hab ichs nicht verstanden?
decorator ebenso: bei class kind { function __construct(elter $parent) { brauche ich ebenso die schleife zum wertezuweisen. außerdem habe ich so aber alle methoden von elter verloren. oder irr ich mich?

vielleicht nochmal so:
PHP-Code:
class elter {
  public 
$a 'a';
  public 
$b 'b';
  function 
kind() {
    
$this->kind = new kind($this);
  }
  function 
abc(){ echo 'abc'; }
}

class 
kind extends elter {
  public 
$b 'y';
  public 
$c 'c';
  public 
$d 'd';
  function 
__construct($parent) {
    foreach (
$parent as $k=>$v) {
      if( !
is_object($v) && !isset($this->$k) ) { $this->$k $v; }
    }
  }
  function 
xyz(){ echo 'xyz'; }
}

// würd ich gern machen
$a = new elter();
$a->'x';
$a->kind();
$a->kind->'z';
$a->kind->abc();

// will ich als ergebnis haben
echo '<pre>'print_r($a); echo '</pre>'
gibt aus: (ich habs eben mal ausgeführt, es lebe die copypaste )
PHP-Code:
elter Object
(
    [
a] => x
    
[b] => b
    
[kind] => kind Object
        
(
            [
b] => y
            
[c] => c
            
[d] => z
            
[a] => a
        
)


__________________
wissen ist macht
nichts wissen macht nichts
Mit Zitat antworten
  #18 (permalink)  
Alt 31-10-2007, 16:46
Ichier
 Newbie
Links : Onlinestatus : Ichier ist offline
Registriert seit: Oct 2007
Beiträge: 8
Ichier ist zur Zeit noch ein unbeschriebenes Blatt
Standard

verdammt! ist ja gar nicht das korrekte verhalten ...
egal..
es sollte natürlich
PHP-Code:
elter Object
(
    [
a] => x
    
[b] => b
    
[kind] => kind Object
        
(
            [
b] => y
            
[c] => c
            
[d] => z
            
[a] => x
        
)


herauskommen...

bäh
__________________
wissen ist macht
nichts wissen macht nichts

Geändert von Ichier (31-10-2007 um 16:51 Uhr)
Mit Zitat antworten
  #19 (permalink)  
Alt 31-10-2007, 19:05
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.104
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Ich wüsste nicht, wann man eine solche Funktionalität bräuchte! Bisher haben mir immer noch allgemein bekannte Pattern geholfen
Am besten findest du dich einfach damit ab, dass du deine Unterklasse so "kompliziert" initialisieren musst. Fertig werden!
__________________
iocstreamscanvas
Mit Zitat antworten
  #20 (permalink)  
Alt 31-10-2007, 20:38
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
so einen schwachsinn habe ich lange nicht mehr gelesen. kleinvieh macht mist. viel kleinvieh macht viel mist. wer nicht programmieren kann soll dennoch wenigstens aufs kleinvieh achten dürfen, ...
Nein, was wahsaga meint ist, dass man, wenn man sich an bestimmten Stellen Sorgen macht, lieber überlegen sollte ob nicht alles was man programmiert wesentlich zu langsam ist. Wenn man an einer Stelle angegelangt ist wo Performance wirklich zählt weil alles andere zum Beispiel sehr viel mehr Geld kostet weiß man entweder was schneller ist oder was nicht, weiß wie man es selber herausfindet oder sollte sich schnellst möglich ein anderes Projekt suchen.
Zitat:
vielleicht nochmal so:
Du hast ein Problem: Du möchtest eine Lösung realisieren die so weder Objektorientiert noch sonstwie sinnvoll ist. Das kannst du auch daran merken, dass dir inzwischen vier Leute andere Vorschläge gemacht haben. Diese Vorschläge gingen nicht in deine Richtung. Combie hat das sehr schön erklärt:
Zitat:
Du willst dort eine Rückbezüglichkeit einbauen, welche fast nur mit PHP überhaupt möglich ist! Meist muß man Klassen VOR der Verwendung deklarieren. PHP öffnet an ettlichen Ecken und Kanten massig Möglichkeiten für Schweinereien. Deinen (meines bescheidenen Erachtens nach falschen) Weg hast du ja jetzt oft genug beschrieben.
Du hast bisher immer noch nicht erklärt was du wirklich machen willst. Du hast für das was du bisher beschrieben hast mehrer Lösungen bekommen. Wenn du dir was überlegt hast, ignoriere einfach alle die Ahnung haben und mach das. Wenn du Hilfe erwartest erklär was du willst, schmeiß deinen Ansatz weg und setz die Vorschläge um.
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | [11000011101110110111011001011110011]
Mit Zitat antworten
  #21 (permalink)  
Alt 01-11-2007, 14:22
combie
 PHP Expert
Links : Onlinestatus : combie ist gerade online
Registriert seit: May 2006
Beiträge: 2.925
combie befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
auf Wunsch eine rudimentäre DB Klasse zeigen
....
ja bitte, wenns die aufgabe besser löst jedenfalls
KA, obs dein Problem löst........

Wie schon gesagt, rudimentär, aber funktionsfähig!!
Das Interface: idb.php
PHP-Code:
interface Idb
{
  public function 
__construct($dburl);
  public function 
query($query);
  public function 
fetch($res);

Eine mysql klasse: db_mysql.php
PHP-Code:
class db_mysql implements Idb
{
  private 
$handle FALSE;
  
  public function 
__construct($dburl)
  {
    
$path   parse_url($dburl);
    
$port   = isset($path['port'])?':'.$path['port']:'';
    
$server $path['host'].$port;
    
    
$this->handle mysql_connect($server,$path['user'] ,$path['pass']);
    if(
FALSE === $this->handle) Throw new Exception(mysql_error());
    
$select mysql_select_db(trim($path['path'],"/"),$this->handle);
    if(
FALSE === $select) Throw new Exception(mysql_error());
  }

  public function 
query($query)
  {
    
$res mysql_query($query,$this->handle);
    if(
FALSE === $res) Throw new Exception(mysql_error());
    return 
$res;
  }
  
  public function 
fetch($res)
  {
    return 
mysql_fetch_assoc($res);
  }

Eine sqlite Klasse: db_sqlite.php
PHP-Code:
 class db_sqlite implements Idb
{
  private 
$handle FALSE;
  
  public function 
__construct($dburl)
  {
    
$path parse_url($dburl);
    
$this->handle sqlite_open(trim($path['path'],"/"));
    if(
FALSE === $this->handle) Throw new Exception('Can not open: '.$dburl);
  }

  public function 
query($query)
  {
    
$res sqlite_query($query,$this->handle);
    if(
sqlite_last_error($this->handle))
      Throw new 
Exception(sqlite_error_string(sqlite_last_error($this->handle)));
    return 
$res;
  }
  
  public function 
fetch($res)
  {
      return 
sqlite_fetch_array($res,SQLITE_ASSOC);
  }

Die Faktory Klasse: db.php
PHP-Code:
 class db
{
  static public function 
factory($dburl)
  {
    
$path parse_url($dburl);
    
$type 'db_'.$path['scheme'];
    return new 
$type($dburl);
  }

Der zugehörige Autoloader und ein kleines Testscript:
PHP-Code:
function __autoload($class_name)
{
     
$class_name =  strtolower($class_name);
     require_once 
$class_name '.php';
}

try
{
  
// $db = db::factory('mysql://test:test@localhost/test');
  // $db = db::factory('mysql://test:test@localhost:3036/test')
  
$db db::factory('sqlite://localhost/test');
  
$res $db->query('SELECT * FROM irgendwas');
  while(
$row $db->fetch($res)) print_r($row);
}
catch (
Exception $e)
{
  echo 
'<pre>';
  echo 
'Ausnahme gefangen: '"\n",  
          
$e->getMessage(), "\n",
          
$e->getTraceAsString(), "\n";
  echo 
'</pre>';

__________________
Wir werden alle sterben

Geändert von combie (01-11-2007 um 14:24 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

MariaDB 5.5 veröffentlicht
MariaDB 5.5 veröffentlichtDie freie MySQL-Alternative MariaDB wurde in der stabilen Version 5.5.23 veröffentlicht und soll einige Verbesserungen gegenüber Oracles Communityversion von MySQL mitbringen.

16.04.2012 | Berni

Deutsche Yii Framework Community
Deutsche Yii Framework CommunitySeit dem 19.03.2012 gibt es für die Yii PHP Framework Community ein deutsches Zuhause.

20.03.2012 | dhcomputer

 

Aktuelle PHP Scripte

Advanced Login ansehen Advanced Login

Login-System und Kundenverwaltung, die sich spielend leicht in bestehende Webseiten einbauen lässt und einen enormen Funktionsumfang bietet. Ihre eigene Webseite muss mit Advanced Login nicht umständlich an ein fertiges System angepasst werden.

25.05.2012 Madden | Kategorie: PHP/ Kundenverwaltung
BROM CMS/BelCal 3 ansehen BROM CMS/BelCal 3

Spezielles CMS für Betreiber von Ferienwohnungen. Komplette Seitenerstellung online, Verwaltung mehrerer Objekte, Reservierungssystem mit sofortigem Abgleich im Belegungskalender und vieles mehr bietet dieses Content Management System.

25.05.2012 belcal2 | Kategorie: PHP/ CMS
belbit LiveSupport Script ansehen belbit LiveSupport Script

Schnellen und unkomplizierten Support im LiveSupport-Chat anbieten. Ohne Datenbank und in wenigen Sekunden installiert.

24.05.2012 EichbaumMedia | Kategorie: PHP/ Chat
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:21 Uhr.