php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.10.2007, 20:38  
Benutzer
 
Registriert seit: 01.07.2007
Beiträge: 47
PHP-Kenntnisse:
Fortgeschritten
ecomeback
Standard Objekte aus Klassenbibliothek zur Verfügung stellen

Hallo zusammen,

ich bin mir derzeit nicht sicher, ob das was ich vorhabe eine gute Idee ist oder ob man das ggf. auch anders lösen kann. Ich möchte Objekte aus einer frei erweiterbaren Klassenbibliothek zur Verfügung stellen und dann in meinen Skripten verwalten. Der erste Ansatz sieht so aus:

PHP-Code:
<?php
class Helper extends Object
{
    
/**
     * constructor
     *
         * @access public
     */
    
function __construct()
    {
        
$args func_get_args();
        foreach(
$args as $arg)
        {
            
$this->_register_class($arg);
        }
    }

    
/**
     *
         * @access private
     */
    
function _register_class($class,$clone=false)
    {
        if (
load($class) && (!is_object($this->$class) || $clone))
        {
            
$this->$class = new $class;
        }        
    }
}
?>
Die Frage ist ob das sinnvoll ist so etwas zu tun oder was man ggf. besser oder anders machen kann. Im Prinzip bin ich für alles offen, allerdings möchte ich in dem Helper Objekt bestimmen können, welche Klassen zur Verfügung stehen und die Klassenbibliothek sehr einfach erweitern können. Alles was in Richtung Factory geht legt mich ja auf bestimmte Klassen fest, so dass diese nicht so einfach erweitern werden können. Also kann man das so wie oben machen oder gibt es bessere Wege?
ecomeback ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 11.10.2007, 11:19  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Was soll denn der eigentliche Zweck dieser Funktionalität sein?

Zitat:
allerdings möchte ich in dem Helper Objekt bestimmen können, welche Klassen zur Verfügung stehen
Üblicherweise die, die gebraucht werden ..

Zitat:
und die Klassenbibliothek sehr einfach erweitern können
Reicht __autoload() nicht aus?
Zergling-new ist offline  
Alt 11.10.2007, 12:40  
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:
Alles was in Richtung Factory geht legt mich ja auf bestimmte Klassen fest, so dass diese nicht so einfach erweitern werden können. Also kann man das so wie oben machen oder gibt es bessere Wege?
Einspruch. Eine Abstract-Factory legt dich überhaupt nicht fest. Wichtig ist hierbei nur, dass die in der Factory erzeugten Objekte einem gemeinsamen Interface genügen und z.B. eine init()-Methode unterstützen oder dergleichen.
__________________
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  
Alt 11.10.2007, 18:57  
Benutzer
 
Registriert seit: 01.07.2007
Beiträge: 47
PHP-Kenntnisse:
Fortgeschritten
ecomeback
Standard

Nun ja, wenn ich richtig informiert bin kann man die __autoload Funktion aber nur einmal innerhalb eines Systems nutzen. Ist das so richtig?

Mein Ziel ist es eine Funktionsbiliothek in Klassen zu unterteilen, so dass diese leichter zu verwalten und zu übersehen sind. D.h. einige nützliche Funktionen möchte ich intern klassifizieren. Dabei geht es um validatoren, string funktionen, array functionen etc.
also lauter keine Helferlein, die man immer wieder nutzt.

Meine Idee ist, alle Klassen irgendwie innerhalb des Programmablaufs entsprechend zu laden. Nicht immer werden alle Klassen benötigt.

Die Frage ist nun, wie man so etwas am einfachsten und unkompliziertesten verarbeitet? Was spricht denn gegen das, was ich oben versucht habe.

@dr.e.: Ehrlich gesagt habe ich nur in Teilen verstanden was das genau bedeutet. Kannst du das etwas genauer erklären?
ecomeback ist offline  
Alt 11.10.2007, 20:49  
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 ecomeback,

an sich würde ich das so wie Zergling gesagt hat umsetzen. Dann kannst du einfach auf eine Klasse zugreifen, ohne dich um das Laden derselbigen kümmern zu müssen. Sollten das Helper im Sinn von "CakePHP" oder dem "Zend Framework" sein, so schickt es sich, das Laden der Helper nach einem gewissen Schema zu organisieren, sprich eine Config vorzuhalten, in denen man diese automatisch erzeugen lassen und anschließend verwenden kann.
Lange Rede kurzer Sinn: lege deine Klassen in einem Ordner ab und generiere mit der __autoload()-Funktion eine Möglichkeit die KLassen dynamisch hinzuzuziehen.


Zitat:
@dr.e.: Ehrlich gesagt habe ich nur in Teilen verstanden was das genau bedeutet. Kannst du das etwas genauer erklären?
Stell dir eine Methode vor, die dir eine Referenz auf eine Klasse zurück gibt. Diese erzeugt die geforderte Klasse immer nach einer entsprechenden Mimik. Für Service-Schichten (z.B. einer Business-Komponente) macht es oft Sinn diesen Prozess so anzupassen, dass man die Komponente entsprechend initialisiert. Für mein Framework habe ich das so umgesetzt, dass dir die __getServiceObject()-Methode ein Interface auf so eine Klassenerzeugungs-Methode ist. Diese erstellt eine Singleton-Instanz des geforderten Objektes und gibt es zurück. Die Methode __getAndInitServiceObject() erzeugt ebenfalls ein Singleton-Objekt, initialisiert dieses aber nach einem vorgegebenen Muster. Wenn du das Verhalten nachahmen möchtest, bietet sich folgendes an (Pseudocode):

PHP-Code:
<?php
class AbstractFactory
{

   static function 
createObject($Namespace,$ClassName,$InitParams){
      require_once(
CLASSES_ROOT_FOLDER.'/'.str_replace('.','/').'/'.$ClassName.'.php');
      
$Object = new $ClassName;
      
$Object->init($InitParams);
   }

}
?>
Jede Klasse, die du mit der AbstractFactory erzeugst muss eine Methode init() unterstützen und kann den dort übergebenen Parameter nutzen, die Klasse zu initialisieren. Das war jedoch nur ein Beispiel, wie man das machen kann. Jede andere Form von Initialisierung ist ebenso möglich. Bei mir wird z.B. noch der Context und die Sprache des Objekts gesetzt. Anwendung findet das dann wie folgt:

PHP-Code:
<?php
   define
('CLASSES_ROOT_FOLDER','/path/to/my/classes/folder');

   require_once(
'CLASSES_ROOT_FOLDER/core/factory/AbstractFactory.php');

   
$MyClass AbstractFactory::createObject('core.frontcontroller','FrontController','my.context');
?>
Any Questions? Falls ja, schau dir mal die Seite http://www.adventure-php-framework.o.../Configuration an. Des Weiteren kannst du dir auch mal die API-Dokumentation unter http://www.adventure-php-framework.o...ore/index.html ansehen.
__________________
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  
Alt 11.10.2007, 23:38  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von ecomeback
Mein Ziel ist es eine Funktionsbiliothek in Klassen zu unterteilen, so dass diese leichter zu verwalten und zu übersehen sind.
[..]
Meine Idee ist, alle Klassen irgendwie innerhalb des Programmablaufs entsprechend zu laden. Nicht immer werden alle Klassen benötigt.
Hast du denn verstanden was __autoload macht?
http://de.php.net/__autoload

Wenn ja reden wir aneinander vorbei, dann musst du vielleicht nochmal erklären, wie du den zitierten Block genau meinst.
Zergling-new ist offline  
Alt 14.10.2007, 13:12  
Benutzer
 
Registriert seit: 01.07.2007
Beiträge: 47
PHP-Kenntnisse:
Fortgeschritten
ecomeback
Standard

Ja, verstanden habe ich das schon, nur was mich nicht glücklich macht ist, dass ich dann zig Objekte "verwalten" muss. Sie werden zwar automatisch geladen, aber um das Instanzieren komme ich dann nicht rum. Sagen wir so, wenn man der Übersichtlichkeit halber ca. 15 - 20 Klassen vorhält, so ist es doch eher unpraktisch die benötigte Klasse in jeder Funktion zu instanzieren. Wenn das dem __autoload Gedanken widerspricht, dann habe ich wirklich einen Denkfehler.

Es soll ja in gewisser Weise userfreundlich und einfach sein. Am liebsten wäre mir natürlich etwas nach Singleton Prinzip, so dass ich die Klasse nicht initalisiere, sondern jeweils, eine bereits erzeugte Instanz verwende und die Klasse nur unter bestimmten Bedingungen neu lade.

Ich werde mir die Vorschlage noch einmal genauer ansehen und dann versuchen etwas Sinnvolles zu schreiben. Was ich allerdings noch nicht verstanden habe: Warum ist das, was ich oben versucht habe nicht zu empfehlen? Sind Objekte "in" Objekten nicht sinvoll oder führt es zu einem overload oder was ist unschön an dieser Lösung? Die Helper Instanz könnte man ja immer noch in einem "Factory Pattern" unterbringen. Was ich damit erzeuge ich aber im Prinzip auch nicht mehr als der Ersatz eines globalen Objektes, wobei mir da zu 100% der Unterschied bzw. der Sinn dieser Trennung - es wird oft davon gesprochen, dass das nicht in gleicher Weise verwendet werden soll - nicht klar ist.
ecomeback ist offline  
Alt 14.10.2007, 13:21  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
__autoload läd wirklich nur die Klassendatei anhand ihres Namens. Ich glaube ich habe jetzt auch verstanden was du machen möchtest.
Einfach ein Umfeld, aus dem die Standard-Objekte gezogen werden, Datenbank-Objekt etc. nehme ich an. Sozusagen als Container.
Ja das kannst du natürlich machen, nur erhöhst du damit die Abhängigkeiten deiner Klassen, aus einer losen Klassenbibliothek wird jetzt ein Framework, das raubt dir ein bißchen die Flexibilität. Ich persönlich mag das nicht so, aber wenn es dir die tägliche Arbeit erleichtert, warum nicht?
Zergling-new ist offline  
Alt 14.10.2007, 16:11  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

es gibt auch noch die SPL autoload functionen. villt sind die was fuer dich.

spl_autoload_register
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline  
 


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] Referenzen auf Objekte innerhalb eines Arrays PHP-Fortgeschrittene 6 31.08.2009 17:06
[Erledigt] objekte mit bilddaten serialisieren lumo PHP Tipps 2008 1 17.07.2008 12:25
[Erledigt] Objekte übergeben Felix PHP Tipps 2008 23 18.06.2008 12:21
Objekte zur Laufzeit Vererbung anhängen Zergling-new PHP-Fortgeschrittene 8 17.11.2007 17:31
2 AJAX Objekte GSJLink HTML, Usability und Barrierefreiheit 6 15.08.2007 16:05
PHP 5 Objekte in Session philomat PHP-Fortgeschrittene 1 17.02.2007 17:47
Objekte moose PHP Tipps 2006 13 29.07.2006 16:18
Objekte sortieren Fatal Error PHP Tipps 2006 4 13.04.2006 14:24
[Erledigt] Objekte vergleichen PHP-Fortgeschrittene 4 08.12.2005 16:20
objekte und klassen notyyy PHP Tipps 2005-2 2 24.10.2005 17:44
Objekte PHP Tipps 2005-2 12 09.10.2005 18:20
[Erledigt] Verständnisfrage OOP - Objekte in MySQL Datenbank schreiben? PHP Tipps 2005 2 19.05.2005 21:40
Ganze Objekte an Script weitergeben dreamingof8a PHP Tipps 2004-2 6 23.11.2004 12:17
[Erledigt] Referenzen auf Objekte PHP-Fortgeschrittene 2 17.08.2004 11:08
Anonyme Objekte? PHP-Fortgeschrittene 18 25.07.2004 22:19

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php klassen bibliothek, klassenbibliothek php, php klassenbibliothek erstellen, klassenbibliothek für html in php, access klassenbibliotheken, php instanzen in funktion zur verfügung stellen, php klassenbibliothek, php klassenbliothek, cakephp helper vererben, tipps zur klassenbibliothek, php class in class objekt laden, php gemeinsame klassenbibliothek, php formulare klassenbibliothek

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:09 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.