variablen schützen die im gültigkeitsb. eines includes liegen
schildi
- php
hallo,
ich überlege wie ich bei folgendem konstrukt am besten verhindere das lokale variablen von variablen die in der include datei definiert werden könnten, überschrieben werden:
class
{
function foo()
{
meineVariable = "test";
include('unknownInclude.php');
}
}
nehmen wir an in der unknownInclude.php würde nun eine variable mit dem namen meineVariable definiert werden:
meineVariable = "istMeinTest!"
Dann würde diese ja die variable in der function foo() überschreiben.
Wie verhindere ich in so einem konstrukt am Besten, dass so etwas passieren kann?
Freue mich über gute Einfälle und bedanke mich dafür!
hi,
class
{function foo()
{
meineVariable = "test";
include('unknownInclude.php');
}
Aus welchem Grund willst du überhaupt in der Methodenimplementierung einer Klasse Code per include einbinden (bzw. diesen auslagern)?
nehmen wir an in der unknownInclude.php würde nun eine variable mit dem namen meineVariable definiert werden:
meineVariable = "istMeinTest!"
Dann würde diese ja die variable in der function foo() überschreiben.
Das würde sie ja unabhängig davon, ob du den Code nun mittels include an der Stelle "reinholst", oder ihn dirkekt dort stehen hättest.
Wie verhindere ich in so einem konstrukt am Besten, dass so etwas passieren kann?
Du kannst vor jeder Wertzuweisung erst mal abfragen, ob die Variable gesetzt ist und/oder einen Wert hat, wenn dir das sinnvoll erscheint, mit isset/empty.
gruß,
wahsaga
echo $begrüßung;
Aus welchem Grund willst du überhaupt in der Methodenimplementierung einer Klasse Code per include einbinden (bzw. diesen auslagern)?
Ein Anwendungsfall wäre, HTML-Code in der zu inkludierenden Datei mit eingebauten <?php echo $var ?>-Teilen drin. Das wäre dann ein recht einfaches Template-System, so wie es auch Zend_View vom Zend Framework verwendet. Beim Aufruf der Methode wird das HTML ausgegeben und dabei die variablen Teile durch die Variableninhalte ausgetauscht. Das übliche PHP-Verhalten, nur etwas anders eben :-)
echo "$verabschiedung $name";
hi,
Ein Anwendungsfall wäre, HTML-Code in der zu inkludierenden Datei mit eingebauten <?php echo $var ?>-Teilen drin.[...] Beim Aufruf der Methode wird das HTML ausgegeben und dabei die variablen Teile durch die Variableninhalte ausgetauscht. Das übliche PHP-Verhalten, nur etwas anders eben :-)
Ja, üblich vielleicht schon.
Aber sowas in einer Klassenmethode? Brrr ...
Dann kann man's mit OO aber lieber gleich bleiben lassen.
gruß,
wahsaga
Ja, üblich vielleicht schon.
Aber sowas in einer Klassenmethode? Brrr ...
Dann kann man's mit OO aber lieber gleich bleiben lassen.
gruß,
wahsaga
also ich verwende das, um action dateien einem template zuordnen zu können. diese werden eben reingeladen, bevor das entsprechende template geladen wird.
falls es hier bessere ideen gibt, um php-code an einer bestimmten stelle zu laden, nehme ich die gerne auf :)
echo $begrüßung;
ich überlege wie ich bei folgendem konstrukt am besten verhindere das lokale variablen von variablen die in der include datei definiert werden könnten, überschrieben werden:
Verhindern kannst du das nicht. Du kannst nur dafür sorgen, dass lokalen Variablen nichts passiert, indem du keine anlegst. Du kannst ja eine eigene, "nackige" Methode für das Inkludieren verwenden und die dann aufrufen. Was du auch nicht verhindern kannst, ist der Zugriff auf $this->..., es sei denn, du lagerst die Funktion aus der Klasse aus.
echo "$verabschiedung $name";
Verhindern kannst du das nicht. Du kannst nur dafür sorgen, dass lokalen Variablen nichts passiert, indem du keine anlegst. Du kannst ja eine eigene, "nackige" Methode für das Inkludieren verwenden und die dann aufrufen. Was du auch nicht verhindern kannst, ist der Zugriff auf $this->..., es sei denn, du lagerst die Funktion aus der Klasse aus.
echo "$verabschiedung $name";
das war auch mein erster gedanke...
und dasselbe dachte ich bei $this->...
mmm...
Verhindern kannst du das nicht. Du kannst nur dafür sorgen, dass lokalen Variablen nichts passiert, indem du keine anlegst. Du kannst ja eine eigene, "nackige" Methode für das Inkludieren verwenden und die dann aufrufen. Was du auch nicht verhindern kannst, ist der Zugriff auf $this->..., es sei denn, du lagerst die Funktion aus der Klasse aus.
echo "$verabschiedung $name";
das war auch mein erster gedanke...
und dasselbe dachte ich bei $this->...mmm...
funzt bloß net, da dann dem danach geladenen template nicht die erforderlichen variablen zur verfügung stehen.
ich glaube ich komme nicht umhin, dass ich es so konstruiere, dass diese includes über klassen realisiert werden, die entsprechende standardisierte ein- und ausgabefunktionen bereitstellen.
echo $begrüßung;
Verhindern kannst du das nicht. Du kannst nur dafür sorgen, dass lokalen Variablen nichts passiert, indem du keine anlegst. Du kannst ja eine eigene, "nackige" Methode für das Inkludieren verwenden und die dann aufrufen.
funzt bloß net, da dann dem danach geladenen template nicht die erforderlichen variablen zur verfügung stehen.
Übergib der Methode neben dem Namen der zu inkludierenden Datei auch die von dieser Datei zu verwendenden Variablen in Form eines Arrays. Dieses kannst du vor dem include mit extract() auspacken, so dass dem inkludierten Code dann diese Variablen und nur diese (abgesehen dem $this-Problem) zur Verfügung stehen.
Wenn du PHP 5 hast, schau dir mal im Zend Framework die Komponente Zend_View an. Diese besteht aus zwei Dateien. Zend_View_Abstract beinhaltet allen für die Klasse relevanten Code. Instanzvariablen sind als private deklariert, ebenso einige Methoden, die das Template nicht aufrufen soll. Zend_View erbt von Zend_View_Abstract. Es hat nur die Methode _run(), die den include beinhaltet. Dort stehen die private-Variablen aus ..._Abstract nicht mehr zur Verfügung, sondern nur noch die Variablen, die explizit für das Template bereitgestellt wurden.
echo "$verabschiedung $name";
Huhu Schildi,
Wie verhindere ich in so einem konstrukt am Besten, dass so etwas passieren kann?
Das verhindert bereits der Parser da so ein Konstrukt illegal ist.
Innerhalb von Klassendefinitionen sind require und include nicht möglich.
<WOWEREIT />
Viele Grüße
lulu
Wie verhindere ich in so einem konstrukt am Besten, dass so etwas passieren kann?
Das verhindert bereits der Parser da so ein Konstrukt illegal ist.
Innerhalb von Klassendefinitionen sind require und include nicht möglich.
Doch, innerhalb von function() schon. :-P