Andreas Vogt: Klassen

Hallo,
ich habe mal eine Frage zu Klassen.
Habe zum Test mal folgenden Code erstellt:

<?php
class lib {
var $faktor   = "";

function bar(){  
	global $lib;  
	echo "Hallo ";  
	echo $lib->faktor;  
}  
  
function foo(){  
	global $lib;  
	$lib->faktor = 500;  
	$lib->bar();  
}  

}
$lib = new lib;
$lib->faktor = $faktor;
?>

und eine index.php:
<?php
require "functions.php";
$lib->foo();
?>

Das funktioniert soweit ganz gut. Ich möchte damit bestimmte Variablen weitergeben, aber nicht über ein Formular als Hidden oder in einer Addresszeile.

Was passiert nun wenn 2 oder mehr Webbenuter gleichzeitig/kurz hintereinander diese Variable mit verschiedenen Werten weitergeben, wird der Wert dann überschrieben?

Oder wie regelt man das mit der Weitergabe am besten?

Gruß Andreas

  1. echo $begrüßung;

    class lib {
    var $faktor   = "";

    function bar(){
    global $lib;

    Was willst du denn damit erreichen? Du erstellst eine Klasse, ohne deren Möglichkeiten zu nutzen. Stattdessen greifst du auf eine globale Variable zu. Selbst wenn du mehrere Objekte instantiierst werden diese alle den selben Wert manipulieren. Das kann gewünscht sein, kann ich mir aber in deinem Fall nicht vorstellen. Außerdem gäbe es da mit statischen Klassenvariablen bessere Möglichkeiten als mit globalen Variablen.

    Das funktioniert soweit ganz gut. Ich möchte damit bestimmte Variablen weitergeben, aber nicht über ein Formular als Hidden oder in einer Addresszeile.

    Was passiert nun wenn 2 oder mehr Webbenuter gleichzeitig/kurz hintereinander diese Variable mit verschiedenen Werten weitergeben, wird der Wert dann überschrieben?

    Objekte verhalten sich in der Hinsicht nicht anders als andere Variablen unter PHP. Jede Script-Instanz läuft getrennt für sich. Egal wie viele gleichzeitig ausgeführt werden, sie kommen sich untereinander nicht ins Gehege.

    Oder wie regelt man das mit der Weitergabe am besten?

    Am Script-Ende geht alles verloren, auch Objektvariablen. Willst du etwas über mehrere Requests aufheben gibt es Mechanismen wie beispielsweise Sessions für eine getrennte Datenhaltung pro Client oder Datenbanken für eine gemeinsame Ablagestelle.

    echo "$verabschiedung $name";

  2. Moin!

    ich habe mal eine Frage zu Klassen.

    Dir fehlt noch die Erfahrung im objektorientierten Programmieren. Das sieht man insbesondere deinem Code an.

    Wichtigster Punkt überhaupt: Nutze PHP 5! Version 4 ist seit letztem Jahr tot, und hat außerdem kein wirklich nutzbares OOP - oder anders formuliert: Wenn man sich erstmal an die Möglichkeiten von PHP 5 gewöhnt hat, ist PHP 4 einfach nur noch ein Krampf.

    Habe zum Test mal folgenden Code erstellt:

    An dem gibts viel zu kritisieren.

    <?php
    class lib {
    var $faktor   = "";

    In PHP 5 wird den Eigenschaften von Objekten eine Sichtbarkeit zugewiesen: public, protected oder private. Das Schlüsselwort "var" ist veraltet und wird (noch) als Alternative zu "public" ausgewertet.

    Dasselbe gilt auch für alle Methoden des Objekts: Immer die Sichtbarkeit mit angeben. Fehlt die Angabe, ist die Methode public.

    function bar(){
    global $lib;

    Globale Variablen sind ganz ganz übel! Sowas sollte man unbedingt vermeiden!

    Wenn es darum geht, innerhalb einer Methode auf Methoden oder Eigenschaften desselben Objekts zuzugreifen, in dem man sich gerade befindet, benutzt man die Variable $this.

      echo "Hallo ";  
      echo $lib->faktor;  
    

    echo $this->faktor;

    }

    function foo(){
    global $lib;

    Globale Variablen sind übel... siehe oben,

      $lib->faktor = 500;  
      $lib->bar();  
    

    $this->faktor = 500;
    $this->bar();

    }
    }
    $lib = new lib;
    $lib->faktor = $faktor;

    Naja, sicherlich optimierungsfähig. Die Frage ist, was du damit erreichen willst.

    Wenn das Objekt bei seiner Instanziierung direkt Werte mit auf den Weg bekommen soll, dann erstelle in der Klasse eine Funktion mit dem Namen "__construct" (das sind zwei Unterstriche im Namen) und entsprechender Parameterliste:

    public function __construct($faktor) {
      $this->faktor = $faktor;
    }

    Instanziierung dann mit:
    $lib = new lib(1234);

    oder
    $lib = new lib($irgendeinevariable);

    und eine index.php:
    <?php
    require "functions.php";
    $lib->foo();
    ?>

    Rein vom Logikablauf würde man die Skripte so nicht verschachteln. Das Require sollte nur die Klassendefinition laden, alle Objekte sollten im Hauptskript angelegt werden.

    Das funktioniert soweit ganz gut. Ich möchte damit bestimmte Variablen weitergeben, aber nicht über ein Formular als Hidden oder in einer Addresszeile.

    Nutze Sessions. Das hat mit Klassen gar nichts zu tun.

    Du darfst natürlich Klassen benutzen, um den Zugriff auf das Session-Array zu regeln, aber das ist nicht notwendig - und für Anfänger wie dich vermutlich auch noch eine Nummer zu groß. Ich würde kleiner anfangen.

    - Sven Rautenberg