php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 2 Stimmen, 4,50 durchschnittlich.
Alt 27.09.2008, 09:31  
Neuer Benutzer
 
Registriert seit: 26.09.2008
Beiträge: 3
theraipper befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Klassen zur Laufzeit erzeugen

Gibt es in PHP 5 eine Möglichkeit, Klassen zur Laufzeit zu Erzeugen?

Ich möchte aus einer DB die Struktur auslesen und entsprechende Klassen mit Attributen und zugehörigen Settern/Gettern erzeugen - zur Laufzeit. Die Methoden sollen wirklich generisch erzeugt werden, also nicht set("name", "Paul") sondern setName("Paul").

Im Manual habe ich nichts entsprechendes gefunden... Geht das? Wenn nicht, könnte ich auch damit leben, nicht schon die Klassen sondern erst die Objekte mit den Attributen und Methoden auszustatten.

Vielen Dank für die Hilfe!
theraipper ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.09.2008, 10:16  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo theraipper,

für Klassen gibt es IMHO so etwas nicht. Ich halte es auch für übertrieben einen asbtrakten Datenhaltungsansatz mit einem konkreten Klassen-Modell _ohne_ Mapping haben zu wollen. Das funktioniert nicht. Schalte an dieser Stelle besser einen DataMapper dazwischen, der für deine konkrete Applikation die Daten aus der generischen Datenhaltung ausliest und für deine Applikation bereitstellt. Siehe hierzu auch DataMapper-Pattern sowie "MasterDataManagement" und DomainObject-Pattern.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 27.09.2008, 12:02  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von theraipper Beitrag anzeigen
Gibt es in PHP 5 eine Möglichkeit, Klassen zur Laufzeit zu Erzeugen?

Ich möchte aus einer DB die Struktur auslesen und entsprechende Klassen mit Attributen und zugehörigen Settern/Gettern erzeugen - zur Laufzeit. Die Methoden sollen wirklich generisch erzeugt werden, also nicht set("name", "Paul") sondern setName("Paul").

Im Manual habe ich nichts entsprechendes gefunden... Geht das? Wenn nicht, könnte ich auch damit leben, nicht schon die Klassen sondern erst die Objekte mit den Attributen und Methoden auszustatten.

Vielen Dank für die Hilfe!
nun, das einzigste was mir dazu einfallen würde, wären __set(), __get() und __call():

PHP-Code:
class runtime
{
       
$this->values=Array('name'=>'blaaah');

        public function 
__get($name)
        {
                 if(isset(
$this->values[$name])) return $this->values[$name];
                        else throw new 
Exception('Unset variable call: runtime->'.$name);
        }

        public function 
__set($name,$value)
        {
                 
$this->values[$name]=$value;
        }

         
// wird bei nicht implementierter funktion aufgerufen
         
public function __call($name)
         {
                  return 
0;
         }
}

$runtime=new runtime;
echo 
$runtime->name;
$runtime->name=1;
$runtime->something_else=2;
echo 
$runtime->random(); 
aber genauer erklären was du machen willst, hilft warscheinlich!
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Alt 27.09.2008, 19:05  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Oder das:
PHP-Code:
$x = new X();
print 
$x->getHelloWorld();


function 
__autoload($classname)
{
    eval(
'class ' $classname ' extends XY { }');
}

class 
XY
{
    public function 
getHelloWorld()
    {
        return 
'Hello world!';
    }

Innerhalb von XY kannst du dann mit __get(), __set() und __call arbeiten.
Aber ob das so das Gelbe vom Ei ist...
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 28.09.2008, 07:35  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 387
MrNiceGuy befindet sich auf einem aufstrebenden Ast
Standard

Ich denke, dass die Überlegung, __call() zu verwenden, die einzige Möglichkeit ist, diese Problemstellung zu bewältigen. Ich würde es jedenfalls so machen:

PHP-Code:
class X
{
  protected 
$stringVar1 'Value1';
  protected 
$stringVar2 'value2';
  function 
__call ($stringMethodName,
                   
$arrayParameter
                   
)
  {
    
$mixedReturnValue FALSE;
    
    if (
preg_match ('°^(set|get)([a-z_][a-z0-9_]*)$i°',
                    
$stringMethodName,
                    
$arrayResult
                    
) == 1
        
)
    {
      if (isset (
$this->$arrayResult[2]) === TRUE)
      {
        switch (
strtoupper ($arrayResult[1]))
        {
          case 
'SET':
          {
            
$mixedReturnValue $this->$arrayResult[2];
            
            
$this->$arrayResult[2] = $arrayParameter[0];
            
            break;
          }
          
          case 
'GET':
          {
            
$mixedReturnValue $this->$arrayResult[2];
            
            break;
          }
        }
      }
    }
    
    return 
$mixedReturnValue;
  }

MrNiceGuy ist offline   Mit Zitat antworten
Alt 28.09.2008, 12:43  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Von JSON zu einem PHP-Objekt geht auch
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline   Mit Zitat antworten
Alt 28.09.2008, 15:27  
Neuer Benutzer
 
Registriert seit: 26.09.2008
Beiträge: 3
theraipper befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für Eure Hilfe!

In der Tat ist alles nicht das Gelbe vom Ei, aber mit einer Kombination aus dem Autoload mit "eval" und der "__call"-Methode lassen sich alle Eigenschaften, die eine Klasse hat (Name, Methoden, Attribute) simulieren. Ich kann mir auch ehrlich gesagt nicht vorstellen, dass das (abgesehen von der DB-Verbindung zum Auslesen der Klassenattribute) messbare Performancedefizite gegenüber einer Menge an vorgeschriebenen Klassen im Filesystem hat.

Ich brauche das für eine DB-Abstraktionsschicht. Ich habe bisher gute Erfahrungen mit Propel gesammelt und möchte für ein neues Projekt etwas ähnliches haben, was eben ohne einen Generator zur Erzeugung des Mappings auskommt.
theraipper ist offline   Mit Zitat antworten
Alt 28.09.2008, 21:09  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Find ich Quatsch. Tabellenobjekte haben doch dann ohnehin immer die gleichen Methoden. Warum nicht einfach von einer abstrakten Klasse ableiten.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 28.09.2008, 22:14  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
[..] messbare Performancedefizite gegenüber einer Menge an vorgeschriebenen Klassen im Filesystem hat.
Das sehe ich anders...
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 29.09.2008, 08:01  
Neuer Benutzer
 
Registriert seit: 26.09.2008
Beiträge: 3
theraipper befindet sich auf einem aufstrebenden Ast
Standard

Warum? Man spart sich das Klasseninclude und hat dafür bei jedem Klassenaufruf einen Regexp zum Erkennen des Attributnamens. Wenn ich sehe, wie lange bei Propel die Includes dauern (> 300kB Sourcecode für unsere größte Tabelle) kann das nicht noch langsamer sein. Außerdem erspart es einem Entwicklerteam die aus dem Mapping resultierenden Umstände. Bei uns gab es deswegen schon öfter Probleme, deshalb mein Bestreben, das zu umgehen.

Mein Bestreben ist ja auch nicht eine 100% dynamische Lösung sondern eher ein Cache, der bei Änderungen in der DB-Struktur manuell gelöscht wird und sich bei Verwendung der Abstraktionsschicht automatisch wieder füllt.

Es ist ja auch noch alles im Versuchsstadium, über die Vorteilhaftigkeit entscheide ich nach der Implementierung.
theraipper ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Klassen zur Laufzeit initialisieren ihrzauberer PHP-Fortgeschrittene 6 01.09.2008 21:53
Tool um (Spiel)Klassen zu erzeugen Martin13 PHP-Fortgeschrittene 6 05.09.2007 02:25
Klassen und externe Funktionen ? ssm PHP-Fortgeschrittene 17 18.07.2007 11:59
SQL Abfrage erzeugen/ string bearbeitung easy PHP Tipps 2007 20 28.03.2007 22:12
Klassen sinnvoll nutzen, Grundlegendes nikosch PHP-Fortgeschrittene 1 30.09.2006 22:08
Fragen zu Klassen Kein Genie PHP Tipps 2006 3 08.05.2006 11:25
Sessions an includete Klassen übergeben Dr_Enquinox PHP Tipps 2006 4 29.04.2006 10:25
mit html klassen definieren und in php ausgeben PHP-Fortgeschrittene 4 16.01.2006 10:31
[Erledigt] PHP 4 - Klassen? patr1k PHP Tipps 2005 10 18.11.2005 10:48
Klassen Fatal Error PHP Tipps 2005-2 3 19.10.2005 15:31
Klassen und OOP Problem PHP-Fortgeschrittene 3 08.09.2005 10:37
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46
Klassen PHP Tipps 2005 5 09.04.2005 18:51
Klassen in Klassen verwenden PHP Tipps 2005 5 23.02.2005 14:08

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php klasse dynamisch erzeugen, php klassen dynamisch erzeugen, php dynamisch klassen erzeugen, php klassen zur laufzeit erzeugen, php objekt dynamisch erzeugen, php klasse dynamisch erstellen, php klasse zur laufzeit erstellen, php klassen dynamisch erstellen, php klasse zur laufzeit erzeugen, php klasse laufzeit, php objekte dynamisch erzeugen, php methoden dynamisch erzeugen, php klassen zur laufzeit, php object dynamisch erzeugen, php methoden zur laufzeit generieren, http://www.php.de/php-fortgeschrittene/47720-erledigt-klassen-zur-laufzeit-erzeugen.html, php klasse zur laufzeit, php dynamisch klassen erstellen, klassen dynamisch erzeugen php, php dynamische klasse erzeugen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum