php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.07.2007, 00:14  
ssm
Benutzer
 
Registriert seit: 21.03.2006
Beiträge: 65
ssm
Standard Klassen und externe Funktionen ?

Hallo zusammen,

habe in einer Anwendung mehrere Klassen, die eine Reihe gleicher Funktionen nutzen. So verwenden z.B. die Klassen a,b,c alle die Funktion calc().

Anstatt die geliche Funktion in jeder Klasse als Methode zu definieren möchte ich sie gerne auslaugern.

Tja - nur wie ? Die Datei mit den Funktionen 'functions.php' in einer Methode der Klasse mit include aufzurufen funktioniert nicht wirklich, dass das Variable-Scope der includierten Funktionen dann ja trotzdem jenseits der Klasse liegt.

Auf ein unschönes Strickmuster wie z.B. das Inkludieren im Constructor und Aufrufen mittels eines internen Wrappers habe ich auch keine Lust.

Natürlich habe ich überlegt, ob der Design-Ansatz der Anwendung nicht grundsätzlich apassbar wäre, leider jedoch kein Pattern (strategy, factory etc.) liefert mir da einen brauchbaren Ansatz.

Es bleibt bei der simplen Anforderung, dass meine Klassen die gleichen externen Funktionen einbinden müssten.

Ich hoffe mein Problem ist verständlich geschildert.
Vielleicht hat ja jemand von Euch einen Tipp für mich !

Vielen Dank !!
__________________
IP-Popularität und Linkpopularität
ssm ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 18.07.2007, 00:26  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.248
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

bliebe noch die Ableitung aus einer gemeinsamen Oberklasse, welche die calc Funktion definiert - wenn ich Deine Ausführungen richtig verstanden habe. Da php nach wie vor keine echte Mehrfachvererbung bietet, können die entspr. Klassen dann aber nicht bereits aus einer anderen abgeleitet sein.
nikosch ist gerade online   Mit Zitat antworten
Alt 18.07.2007, 00:34  
ssm
Benutzer
 
Registriert seit: 21.03.2006
Beiträge: 65
ssm
Standard

Danke für Deine Antwort.

Ja, daran hatte ich auch schon gedacht - würde nur ein paar Anpassungen erfordern - schmeckt mir aber noch nicht so ganz - vor allem weil die Funktionen vielleicht noch wonaders gebraucht werden !
Ein weiterer Ansatz wäre vielleicht auch gut alte "globals" zu definieren - nur da zuckt´s bei mir immer.
Lese grade etwas über Dekoratoren - vielleicht versteh ich das Prinzip ja demnächst und es hilft mir weiter !
__________________
IP-Popularität und Linkpopularität
ssm ist offline   Mit Zitat antworten
Alt 18.07.2007, 00:35  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Wollts grad sagen: Die eigentliche Lösung is genau eben das Konzept OOP. Du hast eine Papa-Klasse, die die Methode definiert und alle andere erben davon. Oder aber (Java-Style) du bastelst eine (Pseudo-)statische Klasse (PHP direkt erlaubt keine statischen Klassen), die dir Methode bereit stellt.
PHP-Code:
class Math // Anlehnung an Java ^^
  
public static function calc ($param1$param2) {
    
// do something useful with param1 and param2
  
}


Edit:
Was spricht gegen Vererbung? Oo Genau dafür wurde OOP doch "erfunden"?
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline   Mit Zitat antworten
Alt 18.07.2007, 01:36  
ssm
Benutzer
 
Registriert seit: 21.03.2006
Beiträge: 65
ssm
Standard

Ja, mann könnte sicherlich entweder:
eine Singleton-Klasse mit statischen Funktionen erstellen, die von überall auf Wunsch mmit $obj::func() abrufbar wären.
oder
die Funktionen in der Parent-Klasse definieren und von jeder Child-Klasse aus abrufen.

Grundsätzlich verstehe ich das Prinzip. Nur gäbe es ja noch zusätzlich die Möglichkeit, die Funktion als statische Funktion in der Basis-Klasse zu definieren und aus der Child-Klasse mit parent::myFunc() aufzurufen.

Macht dieser Fall überhaupt Sinn, wenn die Basis-Klasse eh nur einmal vorkommt ?
__________________
IP-Popularität und Linkpopularität
ssm ist offline   Mit Zitat antworten
Alt 18.07.2007, 01:44  
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

Möglich wäre auch mit Interfaces zu arbeiten. In diesem Fall würde ich aber auch mit einer
statischen Methode arbeiten, ist auch irgendwie einfacher. Dazu noch eine Helper Klasse und
ein wenig Factory Pattern, fertig ist der Brei:

index.php
PHP-Code:
<?php

// Helper-Class
require_once('helper.class.php');

// static functions
require_once('static_functions.class.php');

class 
xyz
    
{
    private 
$helper# Helper-Object

    
function __construct()
        {
            
$this->helper = new Helper();
            
$this->helper->load('mathFunctions');
        }

    public function 
getSum($aData)
        {
            return 
mathFunctions::calc($aData'sum');
        }
    }

$xyz = new xyz;

echo 
$xyz->getSum(array('2''3'));
?>
helper.class.php
PHP-Code:
<?php

class Helper {

    public function 
load($sName)
        {
            return new 
$sName.'class.php';
        }        
}

?>
static_functions.class.php
PHP-Code:
<?php

class mathFunctions
    
{

    public static function 
calc($aData$sMethod)
        {
            switch (
strtolower($sMethod))
            {
                case 
'sum':
                    return 
self::calcSum($aData);
                break;
                
                default: throw new 
Exception('Function does not exist!');
            }
        }
    
    public static function 
calcSum($aData)
        {
            
$result $aData[0] + $aData[1];
            return 
$result;
        }
        
    }

?>
Funktioniert sogar
phpdummi ist offline   Mit Zitat antworten
Alt 18.07.2007, 01:50  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Also erstmal: Ich hoffe, du hast nen paar Bier drin (ich übrigens auch) ansonsten: Arbeite an deinem Deutsch ^^ Jetzt zu konstruktiven Teil

Zitat:
eine Singleton-Klasse mit statischen Funktionen erstellen, die von überall auf Wunsch mmit $obj::func() abrufbar wären.
Äh .. Hä? Nein ^^ Also da haste womöglich das Singleton-Pattern falsch verstanden. Dieses sollte eigentlich nur eine (statische) Methode bereit stellen, das beim ersten Aufruf eine Instanz eines Objekts erstellt und bei jeden weiteren Aufruf eben dieses Objekt immer wieder zurück gibt. Beispiel:
PHP-Code:
class SingletonOfItself {
  protected 
$_instance null;
  private function 
__construct ()
  {
    
// disallow direct instanciation
  
}
  private function 
__clone ()
  {
    
// disallow cloning 
  
}
  public static function 
getInstance ()
  {
    if (
self::_instance === null) {
      
self::_instance = new self ();
    }
    return 
self::_instance;
  }

Diese (kurze) Klasse erlaubt es nicht direkt instanziert zu werden (private) evenfalls erlaubt sie nicht bereits existierende Objekte dieser Klasse zu kopieren (clone). Beim ersten Aufruf von getInstance allerdings erstellt sie eine Instanz von sich selbst (darf sie, weil sie im private-Scope rumhängt) und gibt sie zurück. Bei jeden anderen gibt sie immer nur eben diese eine Instanz zurück. Das ist Singleton

[quote]die Funktionen in der Parent-Klasse definieren und von jeder Child-Klasse aus abrufen. [/qoute]Is ja nun mal nicht ungewöhnlich
Zitat:
Grundsätzlich verstehe ich das Prinzip. Nur gäbe es ja noch zusätzlich die Möglichkeit, die Funktion als statische Funktion in der Basis-Klasse zu definieren und aus der Child-Klasse mit parent::myFunc() aufzurufen.
Sicherlich. Das wäre auch die bevorzugte Variante, falls die Methode nicht vom Zustand (sprich: vom Inhalt aller Objekt-Attributen) abhängt.
Zitat:
Macht dieser Fall überhaupt Sinn, wenn die Basis-Klasse eh nur einmal vorkommt ?
Das verstehe ich ehrlich gesagt nicht ^^ Eine Klasse kommt eh immer nur einmal vor.
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline   Mit Zitat antworten
Alt 18.07.2007, 01:56  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

@phpdummi: Ich schätze dich ja echt hoch ein, aber ... Hä?
1. In einer Klasse auf die Existenz einer Methode zu prüfen, die die Klasse selbst definiert ist ... paradox ^^ Das wäre so, als wenn ich sage "Ich bin ein Mann und kippe tot um, wenn ichs nicht bin". Ich werde niemals umfallen
2. Der Helper ist etwas sinnleer ^^ Warum nicht gleich laden, anstatt über Umweg per Helper? Zumal dieser nur einen String liefert, sonst aber nichts macht und der zurück gelieferte String ebenfalls nirgendswo verwendet wird ^^
3. Factory-Pattern seh ich nirgends
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline   Mit Zitat antworten
Alt 18.07.2007, 01:57  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Tja - nur wie ? Die Datei mit den Funktionen 'functions.php' in einer Methode der Klasse mit include aufzurufen funktioniert nicht wirklich, dass das Variable-Scope der includierten Funktionen dann ja trotzdem jenseits der Klasse liegt.
Die Aussage verstehe ich nicht so ganz, was meinst du mit "Variable-Scope der includierten Funktionen"? Eine Funktion bekommt Parameter und liefert dafür ein Ergebnis, da interessiert der Variablen-"Scope" (Gültigkeitsbereich) ja nicht, da mich nur Eingabe- und Ausgabe interessieren, nicht aber Zwischenergebnisse (zumindest üblicherweise). Abgesehen davon kann ich sowieso nicht von außen zugreifen, selbst wenn die Funktion innerhalb einer Klasse deklariert ist (ist ja nicht so, dass die Funktion dann plötzlich als Methode fungieren kann).

Das Grundprinzip von Vererbung und ich denke das weißt du auch, ist, dass die Eltern-Klasse eine abstrahierte Form der Kind-Klasse ist. Sprich Klasse Csv erbt von File-Klasse, als Beispiel. Nimmst du das ernst, musst du dir überlegen, ob deine Klassen wirklich eine Spezialisierung von Math wären (in dem dann vielleicht deine calc() Funktion Platz fände), oder ob sie sie einfach nur einmalig benötigen.
Für letzteren Fall würde ich einen include() nehmen (jedoch nur aus rein konzeptueller Hinsicht). Denn ob du nun extends oder include verwendest, die Abhängigkeit ist da und die bekommst du auch nicht weg, wenn du den Algorithmus nicht vervielfachen und in mehreren Dateien eigenständig einbinden möchtest.

Allerdings ist Abhängigkeit natürlich ein nicht zu leugnender Nachteil, mit der Zeit hast du immer mehr und plötzlich hast du ein Framework, wo keine Klasse mehr ohne eine andere die wieder eine andere benötigt funktioniert. Ist der Code für die calc() Funktion also nicht allzukomplex UND wird er sich vermutlich nicht mehr ändern UND möchtest du die Klassen, die diesen verwenden auch mal einzeln ohne "Framework" verwenden, dann kopier die 15 Zeilen einfach in jede Klasse.

Aber ohne Angabe, worum es grob geht ist ein fairer Tipp schwer möglich.
Zergling-new ist offline   Mit Zitat antworten
Alt 18.07.2007, 02:00  
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

Is ja gut, ich nehme alles zurück und behaupte das Gegenteil.
Is halt a bisel spät...

Helper Klassen sind immer nützlich, dachte ich jedenfalls. Dient ja auch nur als Anregung
weiter zu schreiben. Das Paradoxe Abfragen von Funktionsaufrufen ist hier sicherlich fehl
am Platz, bei Projekten in Teams siehts da schon anders aus, oder?

Und Factory hat sich blos versteckt, kommt bestimmt noch raus
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi 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
Templatesystem mit Funktionen und Variablen drin? BartTheDevil89 PHP Tipps 2008 6 01.07.2008 09:32
[Erledigt] Klassen und Funktionen wetteronkel PHP Tipps 2008 11 11.06.2008 13:32
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
Klassen, Funktionen und Session Fatal Error PHP Tipps 2006 1 15.03.2006 19:05
mit html klassen definieren und in php ausgeben PHP-Fortgeschrittene 4 16.01.2006 10:31
[Erledigt] PHP und Klassen Erweitern PHP-Fortgeschrittene 1 25.07.2005 17:57
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46
[Erledigt] Klassen auf externem Server PHP-Fortgeschrittene 5 21.04.2005 16:59
Klassen PHP Tipps 2005 5 09.04.2005 18:51
Klassen in Klassen verwenden PHP Tipps 2005 5 23.02.2005 14:08
Externe Referenzen in Klassen nutzen PHP Tipps 2004 3 16.08.2004 21:10
Klassen?! PHP Tipps 2004 14 03.06.2004 17:33

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php externe funktion aufrufen, php klassen funktionen, php externe funktionen, php externe funktion, php funktion in klasse, externe php funktion aufrufen, http://www.php.de/php-fortgeschrittene/44378-klassen-und-externe-funktionen.html, php funktion aus klasse, php funktion ohne klasse, php klasse funktion, php klassen in funktionen nutzen, php funktionen in klassen, klassen und funktionen php, php klassen und funktionen, php funktionen und klassen, php funktionen klassen, php externe funktionen aufrufen, externe funktionen php, externe funktion in klasse, php klasse in funktion

Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 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.