Zugriff auf nicht initialisierte Variable abfangen

Wessy

Erfahrenes Mitglied
Hallo Tutorilianer,

ich habe da eine Frage. Ich möchte eine so genannte Interceptor-Funktion schreiben welche bei Zugriff auf eine nicht initialisierte Variable ausgeführt wird. Diese Funktion soll dann die Variable initialisieren und entsprechend füllen.

Hier ein vereinfachtes Beispiel:
PHP:
//$type gibt es bis dato nicht
echo "ich bin ein $type...<br />";
function interceptor(&$variable){
       $variable='Berliner';
}
Führt man vor echo "...$type..."; folgendes aus:
PHP:
interceptor($type);
so funktioniert es reibungslos und die Ausgabe meldet [ich bin ein Berliner...].

Aber wie bekomme ich es hin dass ich die Funktion interceptor(); nicht expliziet aufrufen muss. Quasi wie die magische Funktion __get(); bei Klassen! Habe auch schon nach 'Exceptions' gesucht, aber ich glaube dies ist nicht der richtige Weg/ich habs nicht verstanden. :D
 
Hallo,

soll das eine Art Schutzfunktion sein?
Du könntest ja die Variable mit isset überprüfen:

Code:
function interceptor(&$variable)
{
       if (!isset($variable))
        $variable='Berliner';
}
 
Soviel ich weiss, gibts das nicht.

In deiner Funktion interceptor() solltest du noch isset anwenden um einen ev. Inhalt nicht zu überschreiben
PHP:
function interceptor(&$variable){
    $variable= isset($variable) ? $variable : 'Berliner';
}

Du kannst dich annähern mit einem array_walk über $GLOBALS[]
PHP:
<?php
$type=null;
$id=123;
array_walk($GLOBALS, 'interceptor');

echo "ich bin ein $type...<br />";
echo "ID ist $id...<br />";

function interceptor(&$variable){
    $variable= isset($variable) ? $variable : 'Berliner';
} 
?>

Eine weitere Möglichkeit besteht darin, dass du eine Variablenklasse machst, über diese du all deine Variablen steuerst

PHP:
<?php
class V{
    public function __get($name){
        return $this->$name = isset($this->$name) ? $this->$name : 'Berliner';
    }
}

$v = new V();

$v->id=123;

echo "ich bin ein {$v->type}...<br />";
echo "ID ist {$v->id}...<br />";
?>
 
Ich hoffe, das dein Script niemals innerhalb des www zum Einsatz kommt, denn wenn ich deine nicht definierten Vars mit SQL/PHP-Injection fülle, wird deine Funktion nicht mehr greifen und ich übernehme dann dein kompletten Server.

Manchmal kann ich echt nur mit dem Kopf schütteln, auf welche Ideen die Leute kommen.......und das hier noch ernsthaft an einer Problemlösung für sowas gesucht wird, ohne auf die Gefahren durch sowas hinzuweisen.
 
Hallo und Danke an euch für die Antworten.

@ComFreek: Nein nicht ganz. Es geht mir um die Sessions. Ich arbeite an einem etwas größeren Projekt und hier werden alle Teile des Systems dynamisch über Autoload-Register-Stack's geladen um die Gesamtgeschwindigkeit des Systems zu verbessern.

Da die Stacks jedoch nur als Interceptor-Funktion für nicht initialisierte Klassen und Objekte funktionieren, suche ich nun nach einer Möglichkeit dass erst bei Zugriff auf $_SESSION der Session-Handler generiert wird. Grund ist dass der Sessionhandler auf einem Großteil der Klassen basiert (DB, Debug, Tools, Errorhandler, etc) und diese somit selbst bei einem kleinen AJAX-Request geladen würden.

@yaslaw: Cool, das Beispiel mit der __get-Methode gefällt mir. Echt gut. Ich hätte jedoch dazuschreiben sollen dass es sich um eine superglobale Variable handelt. :p Hast du denn mal mit Exceptions gearbeitet? Also der Error-Handler bemerkt das schon. Vielleicht hast du ja mal eine Sekunde. Dann schau dir doch mal das hier an:
PHP:
error_reporting(E_ALL);
echo 'Session vorhanden? '.gettype($_SESSION);

@bofh: Ehh, also entweder deine Antwort sollte in einem ganz anderen Thread landen oder ich verstehe nicht was du mir mitteilen möchtest. Was bitte haben "SQL/PHP-Injection" mit meiner Fragestellung zu tun? Glaube mir bitte dass ich seit Jahren die amüsanten, verzweifelten SQL-Injections von Skript-Kiddies, Session-Hoppern, etc in PHP Projekten berücksichtige. Aber vielleicht könntest du hier ein Beispiel reinstellen!
 
Zuletzt bearbeitet:
Da brauche ich keine Beispiele aufzuzeigen, wenn jemand nach einer Funktion fragt, um nicht definierte Vars innerhalb eines Scriptes zu definieren, das ist nicht nur unsauberer Programmierstil, sondern auch Anfällig für Injections jeder Art, das Logfile des Server wird (je nach Einstellung) vollgespamt, das Script funktioniert eher willkürlich und bereitet schlussendlich nur Probleme.
 
Da brauche ich keine Beispiele aufzuzeigen, wenn jemand nach einer Funktion fragt, um nicht definierte Vars innerhalb eines Scriptes zu definieren, das ist nicht nur unsauberer Programmierstil, sondern auch Anfällig für Injections jeder Art, das Logfile des Server wird (je nach Einstellung) vollgespamt, das Script funktioniert eher willkürlich und bereitet schlussendlich nur Probleme.

Wie fängst du mit php ab, das jede Variable definiert wird?
Und wie definierst du eine Variable?

Ich lerne gerne dazu.
 
Ja ich lerne auch gern dazu. Ich denke, dass er sich wünscht dass ich seine Signatur (eval ($_REQUEST);) grundsätzlich in allen Projekten mit einbinde und er dann für mich die Variablen betreut! :D

Na ja, Spass beiseite. Ich find's jedenfalls etwas 'merkwürdig' in einem Thread 1. so OffTopic und 2. so forsch zu antworten wie bofh. Aber ich dachte mir schon dass da kein Beispiel zurückkommt. PS.: Bitte fühl dich jetzt nicht genötigt wieder zu antworten.

Noch mal zurück zum Thema: Kennt niemand eine Möglichkeit?
Stelle hier noch mal das Problem dar wie es mit einer Klasse und der __get-Methode funktionieren würde. Dieses benötige ich halt nur ohne eine Klasse zu schreiben da es sich um eine superglobale Variable handelt!

PHP:
class vars{
    public function __get($name){
        if($name=='typ'){$this->typ='Berliner';return $this->typ;}
    }
}
$vars=new vars;
echo 'ich bin ein '.$vars->typ.'...<br />';
 
Ich brauche bei mir nichts abfangen, wenn ich zb. 1 DB-Query habe, hole ich mir da die Vars, die ich benötige, schlägt die Query fehlt, gibt es auch eine geänderte HTML-Ausgabe

Wenn ich etwas per $_GET brauche, dann weiss ich auch, das es vorhanden ist, trotzdem werden solche Vars mit:

PHP:
$user_id = (isset($_GET['user_id']) ? intval($_GET['user_id']) : 0);

deklariert, danach weiss ich, das diese Var auf jeden fall deklariert wurde (wobei NULL natürlich auch abweichend sein kann, aber auch in diesem Fall geprüft werden muss, das sie nicht in der DB vorkommen kann, das gleiche natürlich auch bei Strings usw.
Bei Form-Daten werden nur die Daten verarbeitet, welche auch als Form-Feld vorhanden sind, nach dem verarbeiten wird das komplette _POST-Array gelöscht (unset), selbst im Core meines Scriptes gibt es eine Funktion, um Variablen, welche nicht über _REQUEST ins Script kommen, gleich wieder gekillt werden, _FILES wird (wenn es vom gesamten Script nicht benötigt wird) gleich wieder gekillt, da brauche ich dann auch nicht auf Inhalt prüfen.
 
Super dass du dir soviel Zeit nimmst, aber merkst du noch dass du hier komplett das Thema verfehlst? Wenn du dich unbedingt mitteilen möchtest schreib ein Tutorial aber nutz diesen Thread nicht zum zuspammen!
 
Zurück