SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Fortgeschrittene CSS-Techniken

Fortgeschrittene CSS-Techniken zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 20.02.2007, 23:53:15
cyan.ide cyan.ide ist offline
Anfänger
 
Registriert seit: Feb 2007
Beiträge: 32
$plugins["myplugin"] = function() { echo "hello world"; }

Hallo Leute! Ich bin neu in diesem Forum.
Naja, und bevor ich etwas ueber mich erzaehle, was eh keinen Interessiert, komme ich gleich mit einem Anliegen:

[einleitung]
Ich bin derzeit dabei, ein kleines CMS zu stricken.
Was vielleicht nicht mehr ganz neu ist:
Ich versuche, dass der Benutzer sich auf jeder Seite seinen Content anhand von primitiven Controls zusammenstricken kann. Kann man sich einfach so vorstellen: Jeder Absatz ist ein neues Controlelement. Jedes Controlelement soll dynamisch als .php - Datei innerhalb einer moeglichst sicheren Umgebung hinzugefuegt werden koennen (...nein, ich will nicht dem PHP-Script Aufrufe verbieten, sondern dafuer sorgen, dass der Anwender moeglichst wenig kaputt machen kann, wenn er selber ein Plugin schreiben will). In dem von mir genannten Anwendungsfall mit Absaetzen waer das dann ein fckEditor-basiertes "text-control"-Element.
[/einleitung]

[hauptteil]
Fuer den genannten Anwendungsfall benoetige ich eine Idee, wie ich dynamisch Funktionen in mein Konstrukt einbinden kann. Diese Funktionen, die im Plugin jeweils benoetigt werden, sind typische CRUD*-Funktionen fuer den Adminbereich und eine Display-Funktion fuer das Besucher-Frontend. Wichtig dabei ist, dass 2 Leute durch Zufall ihrem Plugin bzw. den im Plugin definitionspflichtigen Funktionen den gleichen Namen geben koennen... aeh, und dies nicht sein darf...

Mit einer solchen Art sollte das ganze voellig Problemlos funktionieren:

Code:
$plugins["myplugin"]["create"] = function( $params )
{
    global $mysql;
    $i["image_src"] = $params["src"];
    $mysql->insert( "mytable", $i, __FILE__, __LINE__ );
}
So. Die ersten werden es schon wissen. Fuer alle anderen: Das geht so nicht. :-(
[/hauptteil]

[abschluss]
Das $mysql-Objekt ist weniger Interessant. Geht so etwas, oder soetwas aehnliches in PHP? Fuer Hinweise, die den Taeter oder die Taeterin identifizieren waer ich aesserst dankbar! (Ich poste dann was nettes oder so)
[/abschluss]

*CRUD = Create, Read, Update, Delete

Gruss
Mit Zitat antworten
  #2  
Alt 21.02.2007, 00:05:24
Opendix Opendix ist offline
Senior Member
 
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 35
Beiträge: 1.476
AW: $plugins["myplugin"] = function() { echo "hello world"; }

Nun öhm... plugins würde ich als Klassen dfinieren...

z.B.

PHP-Code:

class Plugin
{


wenn du für jedes Plugin dann die selben Funktionen (CRUD wie du das nennst...) haben willst, kannst du ja die Klasse ein Interface implementieren lassen

PHP-Code:

class Plugin implements IPlugin
{


das Interface IPlugin definiert dann welche Methoden ein Plugin implementieren muss(Create, Update, ...)

Laden der ganzen Sache ist ganz einfach... du machst einen Ordner plugins... da legst du diese Dateien irgendwie so ab:

plugin1.class.php
pluginkAIrgendwas.class.php
usw.

dann definierst du die autoload-Funktion:

PHP-Code:

function __autoload($classname)
{

    include_once 
$classname '.class.php';


Somit lädt dir PHP das Plugin sobald du versucht die Klasse des Plugins zu verwenden.
Dies wäre mein Ansatz wie ich das machen würde... gibt vielelicht bessere aber fällt mir gradnichts ein *g*

Im übrigen, das benutzen von "global" ist nicht schön! Macht dein Code nur unübersichtlich, und bei einem CMS (was dann doch einige Code-Zeilen umfassen wird) denke ich ist das keine gute Idee!
Wenn du z.B. nur eine Instanz der Mysql-klasse haben willst, benutz doch ein Singleton-Pattern (--> Google)
__________________
Opendix lehnt jegliche Haftung für evtl. vorhandene Fehler in der Grammatik sowie der Satzstellung ab! Bitte wenden Sie sich an die Tastatur!

Betatester gesucht:
Skiclub Gams / CEVI Grabs
Mit Zitat antworten
  #3  
Alt 21.02.2007, 00:22:50
cyan.ide cyan.ide ist offline
Anfänger
 
Registriert seit: Feb 2007
Beiträge: 32
AW: $plugins["myplugin"] = function() { echo "hello world"; }

@Opendix:
Hallo, erstmal vielen Dank fuer deine Antwort.
Das mit der Klasse ist - denke ich - der einzige sinnvolle Anhaltspunkt.

Dann koennte man das auch so machen:

PHP-Code:
function factory( &$plugins$plugin_name$params 
{
    if( 
is_string$plugin_name ) ) 
    {
        @include_once( 
"plugins/".$plugin_name."/class.".$plugin_name.".php" );
        
        
$plugins[$plugin_name] = &new $plugin_name($params);

        if( 
is_object$plugins[$plugin_name] ) ) 
        {
            return 
$plugins[$plugin_name];
        } else 
        {
            return 
$type." ist kein gueltiges Objekt!";
        }
        } else 
        
        {
        return 
$type." ist kein String!";
    }

__autoload ist an sich ne tolle Erfindung. Aber damit werden dann nur Plugins, die schoneinmal bekannt waren. Das wuerde meinem Vorhaben Plug&Play-Faehig zu sein grundsaetzlich Widersprechen.

Zum Globals:
Fuer die $mysql-Klasse geht das in dem Fall in Ordnung. Grundsaetzlich hast du aber natuerlich recht.

Gruss

Geändert von cyan.ide (21.02.2007 um 00:25:47 Uhr)
Mit Zitat antworten
  #4  
Alt 21.02.2007, 00:34:02
Opendix Opendix ist offline
Senior Member
 
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 35
Beiträge: 1.476
AW: $plugins["myplugin"] = function() { echo "hello world"; }

Zitat:
__autoload ist an sich ne tolle Erfindung. Aber damit werden dann nur Plugins, die schoneinmal bekannt waren. Das wuerde meinem Vorhaben Plug&Play-Faehig zu sein grundsaetzlich Widersprechen.
nun du haust die Datei mit der Plugin-Klasse in den Ordner und ab da an steht dir das Plugin zur Verfügung. Was ist daran nicht Plug&Play? :)


für was gibst du da immer als Referenz die Liste der Plugins mit?
kannst du die nicht als Klassenvariabel irgendwo speichern?

Wenn du das ganze soo plug&play mäsig machen willst, würdeich den User auch dazu zwingen, dass jedes Plugin, welches er erstellt von einem Interface abgeleitet sein muss... du kannst dann da in deiner factory-Methode prüfen, ob das Objekt dieses Interface implementiert, ansonsten kannst du das ja da gleich abbrechen.
So kannst du auch sicherstellen, dass das Plugin-Objekt, welches von der Methode zurückgegeben wird sicherlich alle die benötigten Methoden hat die das Plugin vorweisen muss.

Allgemein denke ich nützt es nicht viel, ein Plugin mehrmals zu erstellen (oder sehe ich das falsch) also würde ich da noch abfragen, ob nicht bereits ein Objekt mit diesem Plugin-Namen existiert bevor du ein neues erstellst...

Zitat:
PHP-Code:
return $type." ist kein String!"
Was ist den $type?
__________________
Opendix lehnt jegliche Haftung für evtl. vorhandene Fehler in der Grammatik sowie der Satzstellung ab! Bitte wenden Sie sich an die Tastatur!

Betatester gesucht:
Skiclub Gams / CEVI Grabs
Mit Zitat antworten
  #5  
Alt 21.02.2007, 01:01:58
cyan.ide cyan.ide ist offline
Anfänger
 
Registriert seit: Feb 2007
Beiträge: 32
AW: $plugins["myplugin"] = function() { echo "hello world"; }

Grundsaetzlich geht das. Nur eben...

Zitat:
Zitat von Opendix Beitrag anzeigen
Allgemein denke ich nützt es nicht viel, ein Plugin mehrmals zu erstellen (oder sehe ich das falsch) also würde ich da noch abfragen, ob nicht bereits ein Objekt mit diesem Plugin-Namen existiert bevor du ein neues erstellst...
...koennte diese Konvention die Entwicklung von Plugins gegenueber weniger erfahrenden PHP-Nutzern uninteressant machen. Eben kleine Entwickler, die noch kein Dach ueber dem Kopf haben und selber noch nicht grosse Seiten from Scratch schreiben koennen.

Ich gehe den meisten warscheinlich schon mit einer starken Neigung zu PHP5 zu weit. Ich meine, selbst 1und1-SharedHosting setzt noch auf PHP4, oder ist das mittlererweile schon gegessen?

Zitat:
Zitat von Opendix Beitrag anzeigen
Was ist den $type?
Den $type gehoert da eigentlich garnicht hin %)
Ich habe fuer dieses Beispiel eine Funktion etwas umgeschrieben.

Geändert von cyan.ide (21.02.2007 um 01:02:55 Uhr)
Mit Zitat antworten
  #6  
Alt 21.02.2007, 23:14:36
Opendix Opendix ist offline
Senior Member
 
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 35
Beiträge: 1.476
AW: $plugins["myplugin"] = function() { echo "hello world"; }

Zitat:
koennte diese Konvention die Entwicklung von Plugins gegenueber weniger erfahrenden PHP-Nutzern uninteressant machen
nun irgendwo musst du das einschränken sonst wird das zwangsweise ein Durcheinander geben!

Nun von mir aus gesehen ist PHP5 heute standard. Wenn dieser Hoster das nicht unterstützt dann ist er definitiv im Rückstand! (oder sehe ich das falsch!?
__________________
Opendix lehnt jegliche Haftung für evtl. vorhandene Fehler in der Grammatik sowie der Satzstellung ab! Bitte wenden Sie sich an die Tastatur!

Betatester gesucht:
Skiclub Gams / CEVI Grabs
Mit Zitat antworten
  #7  
Alt 21.02.2007, 23:27:03
cyan.ide cyan.ide ist offline
Anfänger
 
Registriert seit: Feb 2007
Beiträge: 32
AW: $plugins["myplugin"] = function() { echo "hello world"; }

Zitat:
Zitat von Opendix Beitrag anzeigen
nun irgendwo musst du das einschränken sonst wird das zwangsweise ein Durcheinander geben!

Nun von mir aus gesehen ist PHP5 heute standard. Wenn dieser Hoster das nicht unterstützt dann ist er definitiv im Rückstand! (oder sehe ich das falsch!?
_Du_ siehst das vollkommen richtig. MySQL 5 sehe ich auch schon als Standard an. Und gerade MySQL 5 ist noch keine selbstverstaendlichkeit.

Was das Pluginhandling angeht...
Ich mache es jetzt auch so aehnlich, wie du es vorgeschlagen hast. Die ganze Idee wurde nur etwas erweitert, damit die Pluginklassen nur onDemand geladen werden und nicht jedesmal alles geladen wird. Der letzte Schrei ist diese Loesung jedoch nicht, und ich sehe da noch Handlungsbedarf fuer die PHP-Gemeinde. :-)

Gruss
Mit Zitat antworten
  #8  
Alt 22.02.2007, 09:06:48
Opendix Opendix ist offline
Senior Member
 
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 35
Beiträge: 1.476
AW: $plugins["myplugin"] = function() { echo "hello world"; }

Zitat:
Ich mache es jetzt auch so aehnlich, wie du es vorgeschlagen hast. Die ganze Idee wurde nur etwas erweitert, damit die Pluginklassen nur onDemand geladen werden und nicht jedesmal alles geladen wird. Der letzte Schrei ist diese Loesung jedoch nicht, und ich sehe da noch Handlungsbedarf fuer die PHP-Gemeinde. :-)
nun, wenn du ja die autoload-Funktion verwendest wird die Klasse nur dann verwendet wenn diese wirklich auch gebraucht wird? :S
__________________
Opendix lehnt jegliche Haftung für evtl. vorhandene Fehler in der Grammatik sowie der Satzstellung ab! Bitte wenden Sie sich an die Tastatur!

Betatester gesucht:
Skiclub Gams / CEVI Grabs
Mit Zitat antworten
  #9  
Alt 22.02.2007, 10:38:24
cyan.ide cyan.ide ist offline
Anfänger
 
Registriert seit: Feb 2007
Beiträge: 32
AW: $plugins["myplugin"] = function() { echo "hello world"; }

Zitat:
Zitat von Opendix Beitrag anzeigen
nun, wenn du ja die autoload-Funktion verwendest wird die Klasse nur dann verwendet wenn diese wirklich auch gebraucht wird? :S
Klar. Ich verwende aber auch das xajax*-framework, welches Zugriff auf Funktionen will, die sich ausserhalb der eigentlichen Pluginklasse bewegen (z.B.: Setze Inhaltsbereich auf offline). Kommt also kein Aufruf der Klasse zustande, wird PHP die für xajax definierten Funktionen nicht kennenlernen.

Gerade fuer xajax ist diese onDemand-Regelung aber sehr wichtig, da sonst ein durch xajax entstandener ajax-Request zu keinem Zeitnahen Ergebnis fuehrt.

Warscheinlich haette ich mir das alles wirklich viel einfacher machen können, jedoch habe ich irgendwie dieses undefinierbare Gefuehl, dass ich das so richtig mache... %)


Gruss,
c

*Das xajax-Framework: http://www.xajaxproject.org/
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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 aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Warum kann ich keine Dateien auf dem Server löschen? UncleKracker PHP Grundlagen 2 23.10.2006 11:55:45
Kann ich so Dateien löschen? UncleKracker PHP Grundlagen 2 19.10.2006 16:39:46
Wie kann ich ein Bild hochladen und gleichzeitig Beschreibungstext einlesen? UncleKracker PHP Grundlagen 20 11.10.2006 20:20:24
Verschiedene abfragen in einem html.doc ausgeben stoppel66 PHP Grundlagen 4 22.11.2005 16:02:26
wohin mit dem "move_uploaded_file" schnipsel sodiummd PHP Grundlagen 65 22.02.2005 14:13:09


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:01:16 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt