DK: Funktion aus einer Klasse in anderer Funktion aufrufen

Guten Abend,

ich habe gerade eine Funktion geschrieben in der ich mein kleines "Template-System" benutzen wollte.

Die Funktionen dazu liegen in einer externen Datei (global.php)
Ich binde die Datei global.php ein und definiere danach eine neue Funktion in der ich die Funktionen benutze.

Allerdings funktioniert das nicht, warum?

global.php

  
class template {  
var $templates = array();  
  
 function read ($filename){  
  if(!isset($this->templates[$filename]) && file_exists("templates/" . $filename . ".tpl"))  
   $this->templates[$filename] = str_replace("\"","\\\"", file_get_contents("templates/" . $filename . ".tpl"));  
  
  return $this->templates[$filename];  
 }  
}  
  
$tpl = new template();  

andere Datei:

  
require("global.php");  
  
function getDirectoryTree ($directory){  
  $handle = opendir($directory);  
  while(false !== ($resource = readdir($handle))){  
    if(is_dir($resource)){  
      eval("\$directories .= \"" . $tpl->read('galery_directory') . "\";");  
    }  
    else  
      eval("\$files .= \"" . $tpl->read('galery_file') . "\";");  
  }  
  return array($directories, $files);  
}  

  1. Hi!

    Ich binde die Datei global.php ein und definiere danach eine neue Funktion in der ich die Funktionen benutze.

    Nein, du willst eine Variable lokal in einer Funktion benutzen, die dort gar nicht existiert, weil es eine globale Variable ist. Das hat zunächst nichts mit Klassen zu tun, sondern schlicht mit der Sichtbarkeit von Variablen.

    Du könntest allerdings das Singleton-Pattern anwenden, da du deinem Code zufolge sowieso nur eine Instanz haben willst. Damit löst sich auch dein Scope-Problem in Wohlgefallen auf, und du hast keine globale Variable rumfliegen, auf die du ständig aufpassen musst.

    Allerdings funktioniert das nicht, warum?

    "Funktioniert nicht" hat als Fehlerbeschreibung noch nie funktioniert. Bitte beobachte und beschreibe genauer, sonst muss man als potentiell Antwortender raten oder in die Glaskugel schauen.

    Lo!

    1. Du könntest allerdings das Singleton-Pattern anwenden, da du deinem Code zufolge sowieso nur eine Instanz haben willst.

      Dann müsste meine Funktion ja eigentlich so aussehen, wenn ich nichts falsch verstanden habe.

        
      function getDirectoryTree ($directory){  
        $handle = opendir($directory);  
        while(false !== ($resource = readdir($handle))){  
          if(is_dir($resource))  
            eval("\$directories .= \"" . template::read('galery_directory') . "\";");  
        
          else  
            eval("\$files .= \"" . template::read('galery_file') . "\";");  
        
        }  
        return array($directories, $files);  
      }
      

      Das bringt mir allerding folgenden Fehler:

      Fatal error: Using $this when not in object context on line 7

      Also diese Zeile aus der global.php
      if(!isset($this->templates[$filename]) && file_exists("templates/" . $filename . ".tpl"))

      1. Hi!

        Du könntest allerdings das Singleton-Pattern anwenden, da du deinem Code zufolge sowieso nur eine Instanz haben willst.

        Dann müsste meine Funktion ja eigentlich so aussehen, wenn ich nichts falsch verstanden habe.
        Das bringt mir allerding folgenden Fehler:
        Fatal error: Using $this when not in object context on line 7

        Wenn du eine Methode statisch aufrufst, existiert kein $this, da einfach keine Instanz existiert. Du hast nicht das Singleton-Pattern implementiert sondern nur statische Funktionsaufrufe verwendet. Statische Funktionsaufrufe sind dann einsetzbar, wenn daraus auf andere Elemente der Klasse ebenfalls nur statisch zugegriffen werden soll. Das Singleton-Pattern hingegen arbeitet sehr wohl mit einer Instanz und kann dann alle damit verbundenen Möglichkeiten nutzen, es schützt die Klasse jedoch so, dass nur eine einzige Instanz erzeugt werden kann. Diese verwaltet es intern und gibt sie bei Bedarf heraus.

        Lo!

        1. Das Singleton-Pattern hingegen arbeitet sehr wohl mit einer Instanz und kann dann alle damit verbundenen Möglichkeiten nutzen, es schützt die Klasse jedoch so, dass nur eine einzige Instanz erzeugt werden kann. Diese verwaltet es intern und gibt sie bei Bedarf heraus.

          So jetzt hab ich's endlich verstanden.
          War gestern vielleicht einfach zu spät :D

          Vielen Dank.

  2. Hi,

    Die Funktionen dazu liegen in einer externen Datei (global.php)
    Ich binde die Datei global.php ein und definiere danach eine neue Funktion in der ich die Funktionen benutze.

    Allerdings funktioniert das nicht, warum?

    Das dürfte dir error_reporting=E_ALL doch durchaus mit einer entsprechenden Meldung verraten haben?

    function getDirectoryTree ($directory){
      $handle = opendir($directory);
      while(false !== ($resource = readdir($handle))){
        if(is_dir($resource)){
          eval("$directories .= "" . $tpl->read('galery_directory') . "";");

    Dieser Funktion hast du keinerlei Variable $tpl bekannt gemacht.

    Mit "Klassen" oder OOP im Allgemeinen hat das Problem m.E. überhaupt nichts zu tun - nur mit dem ganz normalen Scope von Variablen.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.