[PHP] Aus Klasse eine Funktion aufrufen die sich außerhalb befindet

M3Y3R

Well-known member
ID: 336361
L
8 Mai 2006
1.608
60
Hallo,

folgendes Problem habe ich zur Zeit.

Ich habe 3 Dateien:
- index.php
- functions.php
- class.sla.php

In der class.sla.php möchte ich innerhalb einer Methode eine Funktion aufrufen, welche sich in der functions.php befindet. Genau die selbe Funktion muss ich aber auch in der index direkt auf rufen...

Wie schaffe ich es, dass ich die normale Funktion meiner Klasse hinzu fügen kanne?

Aufbau der Dateien
Index.php
PHP:
...
$returncode = readData("Name", "names.txt");
...
$sla->readCustomFile();
...

functions.php
PHP:
function readData($name=NULL; $file=NULL){
...
}

class.sla.php
PHP:
Class Sla(){
...
     function readCustomFile(){
     ...
          //Hier soll die Funktion aus der functions.php aufgerufen werden!
     ...
}

...
}


Kann mir da wer helfen wie ich das am besten und am performantesten lösen kann ohne die Funktion neu zu schreiben?

Danke!


MFG
Papenburger
 
Funktionen sind im globalen Kontext, d.h. du kannst die Funktion einfach ganz normal aufrufen.

Allerdings solltest du dir Gedanken machen, ob du das Konzept einer Klasse verstanden hast. Diese sollte nämlich gekapselt und somit völlig unabhängig von globalen Variablen und Funktionen arbeiten.
 
Danke theHacker!

Mir war schon klar dass die Klassen eigentlich gekapselt und somit völlig unabhängig von den globalen Sachen arbeiten. Jedoch gibt es hier keine andere Lösung als dies so zu realisieren...
Nochmal danke für die schnelle hilfe...

Kann man diese Funktion auch der Klasse ganz plump hinzufügen?
Also so als wenn ich sie direkt in der Klasse geschrieben hätte?


MFG
Papenburger
 
Kann man diese Funktion auch der Klasse ganz plump hinzufügen?
Also so als wenn ich sie direkt in der Klasse geschrieben hätte?
Ähh... include? :evil: Das vergiss aber schnell wieder.

Wenn du die Funktion in der Klasse brauchst, dann kannst du sie auch dort nochmal reinschreiben.

So wie ich den Funktionsnamen deute, wird das quasi eine basic I/O-Funktion, die jeder brauchen kann.
Ich würde diese vielleicht statisch in eine Utils-Klasse packen. Dann kann sie jede Klasse aufrufen und auch sonst von außerhalb erreichbar.
PHP:
class Utils
{
  public static function readData($file)
  {
    return $foo;
  }
}
Aufruf dann über
PHP:
$foo = Utils::readData("blub.txt");
 
Um das mal aufzugreifen wegen der Kapselung, in gewisser Weise versteh ich das ja, aber irgendwo seh ich dann auch Grenzen. Und wo tH das grad angesprochen hat - wenn ich beispielsweise die Funktion db_query (aus dem Snippets-Thread) nutze, und ich mehrere Klasse habe die diese Funktion brauchen, soll ich die dann wirklich jedes mal in der Klasse implementieren, oder reicht es nicht die einmal global zu deklarieren?

So mach ich das nämlich aktuell, wobei auch jede Klasse noch alle benötigten externen Funktionen mit einem if(!function_exists('')) {function .. } mit sich schleppt, so dass mehr oder weniger gesichert ist, dass das funktioniert..
 
In diesem Beispiel wäre es sinnvoll die db_query Funktion in eine Datenbankklasse zu packen und ein Objekt dieser Klasse dem Konstrukt der Klasse übergeben von dem du ein Objekt haben möchtest.
 
Und wo tH das grad angesprochen hat - wenn ich beispielsweise die Funktion db_query (aus dem Snippets-Thread) nutze, und ich mehrere Klasse habe die diese Funktion brauchen, soll ich die dann wirklich jedes mal in der Klasse implementieren, oder reicht es nicht die einmal global zu deklarieren?
Ein guter Diskussionsansatz ;)

Es gibt halt die beiden Extreme:

  • C ("Es gibt keine Klassen.")
  • Java ("Alles ist ein Objekt.")
Und irgendwo muss man jetzt halt n Mittelweg finden.

Um auf das Beispiel db_query() zu kommen: Ich z.B. hab diese Funktion auch in einer Klasse drin.

Mein Ding is immer: Alles, was ich immer wieder brauch und von Projekt zu Projekt kopier, is in Klassen. Sachen, die ich nur für ein Projekt spezifisch brauch, ist in Funktionen.
 
In diesem Beispiel wäre es sinnvoll die db_query Funktion in eine Datenbankklasse zu packen und ein Objekt dieser Klasse dem Konstrukt der Klasse übergeben von dem du ein Objekt haben möchtest.
Das wäre der komplett objektorientierte Ansatz.. Datenbankklasse hab ich auch vor, aber ne schöne ist nichts was man mal eben so runterschreibt.. (*zwei ansätze hinter sich hat*)

Mein Ding is immer: Alles, was ich immer wieder brauch und von Projekt zu Projekt kopier, is in Klassen. Sachen, die ich nur für ein Projekt spezifisch brauch, ist in Funktionen.

Das klingt nach ner brauchbaren Methode.. da ich grad versuche ein paar 'Module' zu schreiben, müsste dann alles in Klassen rein. Ist halt immer das Problem, dass ich bei einigen Funktionen die ich mehrfach in unzusammenhängenden Klassen brauche (wie db_query) nicht jedes mal bei einer Änderung 10 Klasse durchgehen will und das da ändern..
Wobei sich das bei auslagern in eine Klasse natürlich auch wieder geben würde..
 
Ich persönlich packe alles in Klassen... wenn wir hier z.B. bei unserem Datenbank Beispiel sind:

Database.class.php < Abstrakte Klasse mit den Grundsätzlichen Funktionen, welche jede Datenbank unterstützt.

Danach dann halt die Spezifische Klasse
MySQL.class.php (Singleton Klasse) welche dann von Database ableitet und die für MySQL spezifischen Befehle enthält. Ich finde diesen Grundsatz volkommen Rechtens... worum sollten wir den Umfang der OOP (ja, es könnte mehr sein) von PHP5 vernachlässigen? Den einzigen, nicht OOP Code, den ich in meinen Projekten benutze ist jedeglich der Aufruf der MainClass. Der Rest läuft komplett nur noch über Objekte.
 
So handhabe ich das auch. Funktionen, die wirklich unaghängig vom Objektkontext sind, werden eben als statisch deklariert.
Im Zusammenhang mit einer MVC/PAC Architektur meiner Meinung nach die beste Lösung ;) .

P.S: Klassennamen wie Utils oder Tools würde ich nach Möglichkeit trotzdem vermeiden, da nichtssagend.