php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 20.01.2005, 12:03  
Gast
 
Beiträge: n/a
Standard Klassenmethoden auslagern und includen

Hallo,

ich möchte gerne Methoden einer Klasse in mehrere Dateien auslagern un je nach Bedarf dynamisch includen. Geht das irgendwie? Wäre wirklich toll, wenn mir hier jemand helfen könnte!

Gruss Marc



Datei: class.demo.php
Code:
class demo
{
    function demo()
    {
        // Die Liste der Dateien, in denen sich jeweils eine ausgelagerte Methode befindet
        includefiles = array("methodA.php", "methodB.php", "methodC.php");

        // Funktioniert nicht...da die includeten Methoden nicht als Methoden der Klasse
        // erkannt werden, sondern sich innerhalb der Methode demo() befinden
        foreach($includefiles as $if)
        {
            include($if);
        }
    }
}
Datei: methodA.php

Code:
// ausgelagerte Methode A
function A()
{
    machwas();
}
Datei: methodA.php

Code:
// ausgelagerte Methode B
function B()
{
    machwas();
}
Datei: methodC.php

Code:
// ausgelagerte Methode C
function C()
{
    machwas();
}
[/code]
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 20.01.2005, 12:11  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

tu's nicht. ganz einfach. es hat einen grund, warum es nicht geht.
eine klasse -> eine datei.
wenn die klasse zu gross wird, teile sie in mehrere klassen auf -> refactoring.
axo ist offline   Mit Zitat antworten
Alt 20.01.2005, 12:13  
Gast
 
Beiträge: n/a
Standard

Zitat:
ich möchte gerne Methoden einer Klasse in mehrere Dateien auslagern un je nach Bedarf dynamisch includen. Geht das irgendwie?
Nein
  Mit Zitat antworten
Alt 20.01.2005, 12:17  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ein sinnvolles konstrukt zum derartigen arbeiten nennt man factory und funktioniert so:

du hast eine grund-klasse, die alle klassen 'kennt', die sie zurückgeben soll.

PHP-Code:
class Factory {
    function 
getClassA() {
       require_once(
'class.ClassA.php');
       return new 
ClassA();
   }
    function 
getClassB() {
       require_once(
'class.ClassB.php'); 
       return new 
ClassB();
  }

... hat noch den vorteil, dass man mit der factory die zurückgegebenen klassen beliebig vorkonfigurieren kann, oder evtl. eine unterklasse statt der originalklasse zurückzugeben. oder du kannst die factory nach unten vererben oder durch einen konfigurator zurückgeben, der seinerseits die factories je nach kontext austauschen kann - das lässt sich beliebig dynamisch gestalten, und ist je nach belieben flexibler oder weniger flexibel.

also: das verhalten jeder deiner include-versuch-methoden in eigene klassen auslagern, auch wenn sie nur ca. 1 scrollseite lang sind.
die ursprüngliche klasse als factory verwenden und jeweils ein neues objekt als return zurückgeben.

fertig. die objekte werden nur dann inkludiert wenn sie benötigt werden.
axo ist offline   Mit Zitat antworten
Alt 20.01.2005, 13:04  
Gast
 
Beiträge: n/a
Standard

oh, danke für die schnellen Antworten!

Ich muss zugeben, so ganz hab ich das mit der factory noch nicht verstanden.
Wo taucht an dieser stelle meine Klasse "demo" auf und was passiert mit den zurückgegebenen Klassen der Factory? Ich weiss nicht genau, wie man die Factory in meinem Fall anweden kann.
  Mit Zitat antworten
Alt 20.01.2005, 13:10  
Gast
 
Beiträge: n/a
Standard

Etwas Ergänzung meiner Problematik: Zum Zeitpunkt der Klassendefinition ist noch nicht bekannt, welche Methoden dynamisch hinzugefügt werden sollen.
Die einzelnen Methoden möchte ich separat Datei für Datei in einem Verzeichnis ablegen. Die Hauptklasse soll den Verzeichnisinhalt auslesen und je nach dem welche Dateien vorhanden sind, diese als Methoden übernehmen.

Code:
includefiles = array("methodA.php", "methodB.php", "methodC.php");
wäre also auszutauschen durch so etwas..

Code:
$handle=opendir('methoden/'); 
while ($file = readdir ($handle)) { 
    if ($file != "." && $file != "..") { 
        include($file);    } 
}
closedir($handle);
  Mit Zitat antworten
Alt 20.01.2005, 13:24  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zum Zeitpunkt der Klassendefinition ist noch nicht bekannt, welche Methoden dynamisch hinzugefügt werden sollen.
Die einzelnen Methoden möchte ich separat Datei für Datei in einem Verzeichnis ablegen. Die Hauptklasse soll den Verzeichnisinhalt auslesen und je nach dem welche Dateien vorhanden sind, diese als Methoden übernehmen.
Kein Aas liest meine Texte.

Noch mal: Das geht nicht, weil da der Parser meckert

Innerhalb des Class Konstrukts sind nur Attribut Deklarationen ODER Methoden gestattet.

Sowas geht nicht:
Code:
class test
{
  function test()
  {
     mach_was();
  }
  include './methode1.php';
  include './methode2.php';
}
Wenn Du Klassen erweitern willst, dann nutze extends.

Code:
require_once './masterklasse.php';

class kind extends vater
{
#
}
  Mit Zitat antworten
Alt 20.01.2005, 13:46  
Gast
 
Beiträge: n/a
Standard

ja mensch, und ich dachte immer geht nicht gibts nicht!

hab gerade noch etwas dazu gefunden...
http://www.zend.com/zend/php5/php5-delegation.php

leider geht das wohl erst mit php5, was ich aus kompatibilitätsgründen noch nicht einsetzen kann...tja, da muss wohl wieder mal eine dreckige provisorische lösung her..mhhhh
  Mit Zitat antworten
Alt 20.01.2005, 13:52  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von 10mabo
Wo taucht an dieser stelle meine Klasse "demo" auf und was passiert mit den zurückgegebenen Klassen der Factory? Ich weiss nicht genau, wie man die Factory in meinem Fall anweden kann.
demo ist die factory, und jede methode, die du ursprünglich "hinzuladen" wolltest, ist eine klasse.
du definierst für jede klasse, die du zurückgeben willst, in demo eine methode, oder du definierst halt eine generische methode, der du den klassennamen der klasse sagst, die du zurückbekommen willst.

PHP-Code:
# deine demo-klasse. hier ist sie noch erweitert
<?php
class demo {
   function 
demoMethode() {
       
machWasAnderes();
   }
   function 
erzeuge($klassenName) {
      require_once(
'class.'.$klassenName.'.php');
      return new 
$klassenName($this);
  }
}
# klasse classA mit verhalten.
class classA {
   var 
$_parent;
    
/** 
      * bekommt ein objekt der klasse 'demo' mitgeliefert.
   */
    
function classA(&$p) {
           
$this -> _parent = &$p;
    }
    function 
main() {
        
machwas();
        
$this -> _parent -> demoMethode(); // methode aus demo aufgerufen.
   
}
}
### verwendung:
$factory = new demo();
$classA = & $factory -> erzeuge('classA');
echo 
$classA -> main();
?>
axo ist offline   Mit Zitat antworten
Alt 20.01.2005, 13:58  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von 10mabo
hab gerade noch etwas dazu gefunden...
http://www.zend.com/zend/php5/php5-delegation.php
das ist doch komplett was anderes! das strategy-pattern hat doch nichts mit dem hinzufügen von funktionalität zu tun, sondern ist nur eine weitere stufe der indirektion bei der abarbeitung von anfragen!
das strategy-pattern beschreibt einzig und allein das definieren von möglichen kandidaten zur abarbeitung einer arbeit, und die strategie arbeitet simpel bei einem anfragebefehl in einer for-schleife alle kandidaten ab, bis einer die arbeit erledigt.

das hat rein >gar nichts< mit deiner ursprünglichen frage zu tun.
axo 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
In Tabellenblöcken includen JPO2005 PHP Tipps 2008 1 15.07.2008 17:55
includen Lern_HEIKO PHP Tipps 2008 38 16.11.2007 15:55
GD-lib Grafik includen! PHP Tipps 2007 2 02.01.2007 12:33
[Erledigt] [S] Includen für Dummies [Für euch bestimmt 0 Problemo] PHP Tipps 2006 4 27.01.2006 00:21
[Erledigt] includen Fremder Seiten PHP-Fortgeschrittene 5 24.12.2005 17:26
Includen aller Dateien in einem Verzeichnis d-jango PHP Tipps 2005-2 6 09.10.2005 04:32
Includen macht immer wieder Probleme! PHP Tipps 2005-2 7 22.07.2005 21:40
Includen eines Externes Linkes PHP Tipps 2005 10 25.05.2005 21:17
Richtig includen PHP Tipps 2005 4 26.03.2005 14:04
Programmteile auslagern juhuwoorps PHP Tipps 2005 16 14.03.2005 10:13
Suche PHP Forumscript zum includen Beitragsarchiv 3 19.02.2005 16:06
Includen mit absolutem Pfad PHP-Fortgeschrittene 6 20.01.2005 09:28
Kompletten Ordner Includen, wie mache ich das? 'progman' PHP Tipps 2004-2 2 19.11.2004 23:21
includen PHP Tipps 2004 1 17.10.2004 02:05
Suche Template Parser - Muss PHP Datein includen können Schaelle PHP Tipps 2004 0 01.07.2004 20:48

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php klassen auslagern, c# methoden auslagern, php methoden inkludieren, php methoden auslagern, c# klasse auslagern, php methoden include, c methoden auslagern, php klasse auslagern, php class auslagern, include innerhalb einer klasse php, http://www.php.de/php-fortgeschrittene/16341-klassenmethoden-auslagern-und-includen.html, php methode auslagern, php methoden einer klasse auslagern, php include methode, php klasse zurückgeben, c# methode in datei auslagern, c# methode auslagern, php include innerhalb klasse, php include innerhalb von klasse, php methoden in klassen übernehmen

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