php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 04-06-2010, 22:25
limaleet
 Registrierter Benutzer
Links : Onlinestatus : limaleet ist offline
Registriert seit: May 2010
Beiträge: 9
limaleet befindet sich auf einem aufstrebenden Ast
Standard Variablen trotz niedrigerem Scope sichtbar?

Hallo!

Schreibe gerade ein mapper für den http_user_agent und da fiel mir folgendes auf:

PHP-Code:
foreach($browsers as $browser)
{
    if (
preg_match("#($browser[0])[/ ]?([0-9.]*)#"$s$match))
    {
        
$bname $browser[1] ;
        
//$version = $match[2]{1} . ".x";
        
break ;
    }
}

foreach(
$os as $opsys)
{
    if (
preg_match("#($opsys[0])[/ ]?([0-9.]*)#"$s$match))
    {
        
$oname $opsys[1] ;
        break ;
    }
}

echo 
$bname " :- " $oname
Es erfolgt tatsächlich eine korrekte Ausgabe - wie kann es sein, dass bname und oname bekannt sind?

Danke
Mit Zitat antworten
  #2 (permalink)  
Alt 04-06-2010, 22:28
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von limaleet Beitrag anzeigen
Es erfolgt tatsächlich eine korrekte Ausgabe - wie kann es sein, dass bname und oname bekannt sind?
Vielleicht, weil sie per Default in den gängigen Browsern in genau dem, was du gerade auswertest, nämlich dem User Agent String, mitgesendet werden vom anfragenden Client ...?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #3 (permalink)  
Alt 04-06-2010, 22:33
limaleet
 Registrierter Benutzer
Links : Onlinestatus : limaleet ist offline
Registriert seit: May 2010
Beiträge: 9
limaleet befindet sich auf einem aufstrebenden Ast
Standard

Hallo wahsaga,

leider stehe ich gerade völlig auf dem Schlauch, wie meinst du das genau?
Wenn ich die Variable $oname123hahablabla_hallo_wahsaga nenne, so funktioniert es immernoch, kann doch kein Zufall sein..

edit:

Mal etwas einfacher:

PHP-Code:
if (true)
    {
        
$text "123";
    }
    
    echo 
$text
Warum wird tatsächlich 123 ausgegeben? Das überrascht mich total, obwohl ichschon längere Zeit mit PHP arbeite... mir ist keine andere Sprache bekannt, in der das auch so ist..

Hat das was mit reg_globals oder so zu tun?

Geändert von limaleet (04-06-2010 um 22:43 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 04-06-2010, 22:48
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von limaleet Beitrag anzeigen
kann doch kein Zufall sein..
Ist es nicht, Interpretersprachen haben meist eine sehr dynamische Symboltabelle.

Zitat:
Zitat von limaleet Beitrag anzeigen
mir ist keine andere Sprache bekannt, in der das auch so ist..
Es gibt da noch sowas, das nennt sich JavaScript
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #5 (permalink)  
Alt 04-06-2010, 23:22
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von limaleet Beitrag anzeigen
Es erfolgt tatsächlich eine korrekte Ausgabe - wie kann es sein, dass bname und oname bekannt sind?
Ach so, ich glaube jetzt versteh' ich deine Frage erst ...

Du meinst, warum die Anweisungsblöcke, die von den geschweiften Klammern nach foreach/if umgeben sind, keinen eigenen Scope bilden und damit die darin verwendeten Variablen lokal wären?

Das ist PHP nun mal so ... - und ehrlich gesagt, bin ich momentan nicht mal in der Lage, im Manual die Stelle zu finden, an der das explizit beschrieben wird. (Anyone ...?)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #6 (permalink)  
Alt 04-06-2010, 23:39
limaleet
 Registrierter Benutzer
Links : Onlinestatus : limaleet ist offline
Registriert seit: May 2010
Beiträge: 9
limaleet befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen

Du meinst, warum die Anweisungsblöcke, die von den geschweiften Klammern nach foreach/if umgeben sind, keinen eigenen Scope bilden und damit die darin verwendeten Variablen lokal wären?
Jope, genau das mein ich

Und dabei erinnere ich mich noch an das blöde Buch vor zig Jahren, das behauptete, man müsste im Scope benutze Arrays vor dem Scope mit $test = array(); deklarieren, da man sie sonst später nicht mehr verwenden könnte - bis gerade eben hab ich das geglaubt und lustigerweise in PHP immer alles so programmiert wie in Java und Co.

edit: heißt das etwa, es gibt in PHP keine lokalen Variablen - von Funktionen und OOP mal abgesehen?

Geändert von limaleet (04-06-2010 um 23:44 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 04-06-2010, 23:46
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Es steht nirgends explizit im Manual.

Der Interpreter startet mit einer Symboltabelle, der globalen, in der alles steht, was man auch in $GLOBALS findet.
Jede Funktion und jede Klasse bekommt ihre eigene Symboltabelle.
Aber Blöcke (von geschweiften Klammern umschlossener Code) bekommen keine eigene Symboltabelle.
Mit Zitat antworten
  #8 (permalink)  
Alt 04-06-2010, 23:49
limaleet
 Registrierter Benutzer
Links : Onlinestatus : limaleet ist offline
Registriert seit: May 2010
Beiträge: 9
limaleet befindet sich auf einem aufstrebenden Ast
Standard

Danke! dann wäre

Zitat:
Zitat von limaleet Beitrag anzeigen
edit: heißt das etwa, es gibt in PHP keine lokalen Variablen - von Funktionen und OOP mal abgesehen?
also mit Ja zu beantworten. Das war mir echt neu und verwundert mich gerade sehr.. wieder was gelernt.

Geändert von limaleet (04-06-2010 um 23:51 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 05-06-2010, 00:07
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Seit der Einführung von Namespaces ist es nicht mehr ganz so einfach wie ich oben schrieb. Es gibt immer noch den globalen Scope, aber er ist jetzt gleichzeitig ein Namespace (\). Jeder Namespace bekommt seine eigene Symboltabelle und jede in diesem Namespace definierte Funktion, Klasse oder Namespace bekommt darin sozusagen eine "Untertabelle".
Da man Namespaces allerdings nicht mitten in einer Funktion, Klasse oder Block definieren kann, macht das für dich keinen Unterschied. Blöcke bilden nach wie vor keinen eigenen Scope.
Mit Zitat antworten
  #10 (permalink)  
Alt 05-06-2010, 00:34
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Ich finds gut so, wie es ist!

Warum sollen einfache (Schleifen,if) Blöcke einen eigenen "Gültigkeitsbereich" haben?
Wie soll man denn da Daten rein oder raus bekommen?
Übergeben, wie bei Funktionen oder Methoden geht ja nicht...


Zitat:
mir ist keine andere Sprache bekannt, in der das auch so ist..
Übrigens:
C, C++, Java, PAscal und so weiter, handeln das ganz genau so ab!
__________________
Wir werden alle sterben
Mit Zitat antworten
  #11 (permalink)  
Alt 05-06-2010, 00:46
limaleet
 Registrierter Benutzer
Links : Onlinestatus : limaleet ist offline
Registriert seit: May 2010
Beiträge: 9
limaleet befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von combie Beitrag anzeigen
Warum sollen einfache (Schleifen,if) Blöcke einen eigenen "Gültigkeitsbereich" haben?
Wie soll man denn da Daten rein oder raus bekommen?
Ist Geschmackssache, ich persönlich finde es besser, wenn jeder Scope seine eigene "Sandbox" darstellt. Wenn ich z.B. an verschiedenen Stellen im Code innerhalb eines Blocks nochmal while-Schleifen o.ä. mit Laufvariablen benutze, so kann ich ohne extra Acht geben zu müssen überall die selben Laufvariablen bneutzen, ohne sie zuvor resetten zu müssen. Das ist nur ein Beispiel von vielen.

Zitat:
Zitat von combie Beitrag anzeigen
Übrigens:
C, C++, Java, PAscal und so weiter, handeln das ganz genau so ab!
Da muss ich dir leider widersprechen
In Java als auch C# bedeutet eigener Block (egal wo und wie, hauptsache Klammern) immer lokaler Bereich für alle Variablen darin. C/C++ weiß ich gerade nicht, würde mich aber wundern wenn es nicht so wäre.

edit: in c/c++ ist es genau so. In einem Block definierte Variablen gelten nur dort und "sterben", wenn der Block zu geht. Sie sind aber natürlich an innere Blöcke "vererbbar".

Geändert von limaleet (05-06-2010 um 00:56 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 05-06-2010, 00:52
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
In Java als auch C# bedeutet eigener Block (egal wo und wie, hauptsache Klammern) immer lokaler Bereich für alle Variablen darin.
Das glaube ich dir nicht!

Bedenke:
Wenn du keine Daten aus einer Schleife herein und heraus bekommst, dann ist die Schleife meist Sinnfrei.

Beachte die Verwendung von i

Code:
    public void wuerfeleBisZurSechs()
    {
        int i=1;
 
        // Erster Wurf muss auf jeden Fall durchgeführt werden
        int zwischenspeicher=wuerfel.getZufallszahl(6);
        System.out.println("Wurf "+i+ " ist "+zwischenspeicher);
 
        // weitere Würfe
        while (zwischenspeicher!=6){
            i++;
            zwischenspeicher=wuerfel.getZufallszahl(6);
            System.out.println("Wurf "+i+ " ist "+zwischenspeicher);  
        }
    }
Aus: Java/while-Schleife ? ZUM-Wiki
__________________
Wir werden alle sterben

Geändert von combie (05-06-2010 um 01:03 Uhr)
Mit Zitat antworten
  #13 (permalink)  
Alt 05-06-2010, 00:59
limaleet
 Registrierter Benutzer
Links : Onlinestatus : limaleet ist offline
Registriert seit: May 2010
Beiträge: 9
limaleet befindet sich auf einem aufstrebenden Ast
Standard

Außerhalb der Schleife definierte Variablen sind natürlich auch innerhalb der Schleife verwendbar, und auch in allen Unterblöcken (if,else,whatever) in der Schleife drin.

Hier ging es ja darrum, dass bei PHP innerhalb von Blöcken definierte Dinge auch außerhalb sichtbar sind, also der Weg genau andersrum.

edit zu deinem edit: denke es ist klar mit obigem Text. Das ganze läuft ab wie ein Wasserfall. Du kommst runter, aber nicht mehr hoch.

Siehe Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 2.4 Blöcke, Initialisierung und Sichtbarkeit

C Referenz -Globale und lokala Variablen-

edit2: nochmal ein einfaches Beispiel:

Code:
int zahl = 5;

if(true) {
    System.out.println(zahl);   // gibt 5 aus
}

///// aber



if(true) {
     int zahl = 5;
}
System.out.println(zahl);  // kompiliert nicht mal

Geändert von limaleet (05-06-2010 um 01:09 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 05-06-2010, 01:13
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
Hier ging es ja darrum, dass bei PHP innerhalb von Blöcken definierte Dinge auch außerhalb sichtbar sind, also der Weg genau andersrum.
Das ist eine php Interpreterspracheneigenheit.

Bei den Kompilersprachen kannst du in Schleifen keine Variablen erzeugen/anlegen/definieren

Aber nichts desto trotz ist der Gültigkeitsbereich derselbe.
Egal ob c# oder PHP.
__________________
Wir werden alle sterben
Mit Zitat antworten
  #15 (permalink)  
Alt 05-06-2010, 01:24
limaleet
 Registrierter Benutzer
Links : Onlinestatus : limaleet ist offline
Registriert seit: May 2010
Beiträge: 9
limaleet befindet sich auf einem aufstrebenden Ast
Standard

Hey combie,

ich glaube du denkst da schon besser/weiter als ich oder wir reden aneinander vorbei.

Klar kann ich in Kompilersprachen Variablen in Schleifen oder sonstwas erzeugen/anlegen/definieren und sie dort auch wunderbar benutzen. Und ihr Gültigkeitsbereich ist eben am Scopeende zu Ende, was in PHP nicht so ist.

Dass das eine Angelegenheit des Interpretes ist sehe ich auch so, aber deswegen sind die Gültigkeitsbereiche doch trotzdem Grundverschieden.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Scope und Performance pekka BRAINSTORMING PHP/SQL/HTML/JS/CSS 5 08-11-2006 15:27
Dropdown sichtbar TBT HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 2 04-07-2006 10:04
php in wml - php code sichtbar mysqlfrage PHP Developer Forum 2 03-01-2006 01:58
/tmp Verzeichnis sichtbar oms IT-Security 5 09-01-2003 11:10
DOMXML: Scope-Operator (:) wird nicht erkannt Blaster XML 0 08-01-2003 21:28

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:37 Uhr.