Meine erste Klasse erkennt variable nicht

Godstyle

Erfahrenes Mitglied
Hey,

ich eröffne hier mal einen neuen Thread, da mein anderer ja zu einer netten und sehr informativen Diskussion geworden ist.

Wie die fleissigen leser wissen habe ich mich nun ertsmalig mit Klassen beschäftigt und übe mich daran.

Viel wissen habe ich auch immer von php.net genommen doch wenn man mal so gar keine Ahnung hat ist es als würde man Chinesisch lesen, ich bin ehrlich ich verstehe vlt 5% von dem was die da grade sagen.

So sieht meine Klasse erstmal aus:

PHP:
<?php
	session_start();
	$_SESSION['onstatus'] = "online";
	$userstatus2 = 'offline';
class User
{
		var $online_status;
		var $zeige_online;
		
		public function setzOnstatus($var)
		{
			$this -> online_status = $var;
		}
		
		public function zeigOnstatus($ons)
		{
			
			if($ons == 'online'){
					if($ich === $anderer){
						print "User ist online<br />";
						print "Jetzt chatten<br />";
						print "Jetzt anrufen<br />";
					}
					else {
						print "Leider sind nur Sie online";
					}
			}
			else {
				print "User ist offline";
			}
		}
}

$ich = new User ;
$anderer = new User;

$ich -> zeigOnstatus($_SESSION['onstatus']);
$anderer -> zeigOnstatus($userstatus2);
#print_r($user);



?>

Der Fehler ist undefinierte variable $ich und $anderer, irgendwie auch logisch da sie erst später deklariert werden.

Was ich hier jedoch alles nicht verstehe ist:

PHP:
class User
{
               var $online_status = $_SESSION['onstatus']; # geht nicht aber manuel mit "" etwas eintragen geht
		var $online_status;
		
		public function setzOnstatus($var)
		{
			$this -> online_status = $var;
		} ...

ich verstehe es so, das ich mit dieser function der variablen $online status, den wer $var zuweise.

Klingt für mich, sry, schwachsinnig, da ich doch einfach $online_status = $_SESSION['onstatus']; schreiben kann und das thema erledigt ist.

nungut, ich habe es vorerst dabei belassen und habe weiter gemacht, ich dachte vlt kommt später der moment wo ich den Sinn erkenne.

Also Ging ich weiter, ich dachte mir, ich erstelle mal einen 2ten User und dieser ist offline, nun wollte ich die beiden Objekte vergleichen und nur wenn beide online sind sollte angezeigt werden das sie miteinander ua. chatten können.

Das script seht ihr oben und gibt den genannten Fehler aus.

Hab einiges rumprobiert und kam wieder zu dem ergebnis das ich sagen könnte if($ich == $anderer) {...

das ganze erneut ohne Klasse oder Objekte und in einer einzigen Zeile.

So komme ich zu dem entschluss, dass entweder Klassen total überflüssig sind und nur gut aussehen ( bitte erschlagt mich nicht) oder ich auf dem totalen Holzweg bin und den SInn dahinter noch überhaupt nicht erkenne was ich eher vermute da sonst niemand damit arbeiten würde.

Ok, fragen stelle ich mal keine da ich keine Konkreten stellen kann, aber ich denke das meine Problematik doch verständlich hier ist.

lg
 
Wie du weißt, diskutiere ich im anderen Thread als Neuling mit. Daher kann ich dir nur "meine logische" Erklärung zeigen. Wenns nicht geht, bitte nicht hauen.

Zuerst das hier
PHP:
var $online_status = $_SESSION['onstatus'];
Ich glaub, du musst es einfach nur anders lösen...
PHP:
class User
{
   var $online_status;
   public function __construct()
   {
        $this->online_status = $_SESSION['onstatus'];
   }
}
Dadurch wird, sobald das Objekt erzeugt wird, die Variable mit der Session gefüllt.

PHP:
<?php 
    session_start(); 
    $_SESSION['onstatus'] = "online"; 
    $userstatus2 = 'offline'; 
class User 
{ 
        var $online_status; 
        var $zeige_online; 
         
        public function setzOnstatus($var) 
        { 
            $this -> online_status = $var; 
        } 
         
        public function zeigOnstatus($ons) 
        { 
             
            if($ons == 'online'){ 
                    if($ich === $anderer){ 
                        print "User ist online<br />"; 
                        print "Jetzt chatten<br />"; 
                        print "Jetzt anrufen<br />"; 
                    } 
                    else { 
                        print "Leider sind nur Sie online"; 
                    } 
            } 
            else { 
                print "User ist offline"; 
            } 
        } 
} 

$ich = new User ; 
$anderer = new User; 

$ich -> zeigOnstatus($_SESSION['onstatus']); 
$anderer -> zeigOnstatus($userstatus2); 
#print_r($user); 
?>
Also rein von der Logik, würd ichs anders aufbauen. Gibt sicherlich genügend Möglichkeiten, aber mal meine Idee:
PHP:
<?php 
    session_start(); 
    $_SESSION['onstatus'] = "online"; 
    $userstatus2 = 'offline'; 
class User 
{ 
        var $online_status; 
        var $zeige_online; 
         
        public function setzOnstatus($var) 
        { 
            $this -> online_status = $var; 
        } 
         
        public function zeigOnstatus($user) 
        { 
             if($this->online_status == $user->online_status)
             {
                  print "User online. Chatten?";
             } else {
                  print "User offline.";
             }
        } 
} 

$ich = new User;
$ich->setzOnstatus($_SESSION['onstatus']);

$anderer = new User;
$anderer->setzOnstatus($userstatus2);

$ich->zeigOnstatus($anderer); //$ich vergleicht seinen Status mit $anderer

$anderer->zeigOnstatus($ich); //$anderer vergleicht seinen Status mit $ich
?>
Den Status musst du eigentlich nicht übergeben, den setzt du ja vorher. Interessant wäre nur, mit welchem User man seinen Status vergleicht. Mal abgesehen davon, dass der eigene Status eig. immer online ist, wenn man sich mit jemandem vergleicht. Sonst könnte man sich ja nicht vergleichen. ^^
€: Ich hab jetzt meins sogar getestet, was ich sonst nie mache. Siehe da, es funktioniert einwandfrei.
€2: Was mir aufgefallen ist... Sich in einen Code einzuarbeiten/einzulesen ist viel schwerer, als selber was zu programmieren mit OOP. Übung macht den Meister.
 
Zuletzt bearbeitet:
Um mir das mal anzusehen habe ich dein letztes cript 1:1 kopiert, ich erhalte jedoch das ergebnis, das beide User online sind.

Der Gedanke dahinter war, ich gehe auf ein User Profil, und entweder wird mir angezeigt das der User Offline ist, oder das ich mit ihm chatten kann, so erhalte ich 2 mal: User Offline.

Vom Gedanken her Zeigt er mir jedoch nur einmal entweder oder an.
 
Ja klar, ich vergleiche ja gerade auch Äpfel mit Birnen und dann nochmal Birnen mit Äpfel.
PHP:
$ich->zeigOnstatus($anderer); //$ich vergleicht seinen Status mit $anderer

$anderer->zeigOnstatus($ich); //$anderer vergleicht seinen Status mit $ich
Redundant. Wenn du nur dich selber (den User, der auf der Homepage surft) mit einem anderen vergleichen willst, dann eben so:
PHP:
$ich->zeigOnstatus($andereruser);

Aus deiner Idee raus, kann man das z.B. so sehen:
PHP:
<?php 
session_start(); 
$_SESSION['onstatus'] = "online"; 
//Den zweiten Userstatus musst du ja erstmal irgendwo holen... Vermutlich aus der Datenbank
//SQL-Connection setzen wir mal voraus
$qry = "SELECT id FROM users WHERE id='".mysql_real_escape_string($_GET['id'])."' AND last_action > (UNIX_TIMESTAMP-600)";
if(mysql_num_rows(mysql_query($qry)) != 0)
{ $userstatus2 = "online"; } else { $userstatus2 = "offline"; }
//du musst somit bei jeder Aktion, die ein User ausführt, die last_action updaten...
//ich gehe davon aus, dass beim Aufrufen seines Profils seine ID in der URL steht

class User 
{ 
        var $online_status; 
         
        public function setzOnstatus($var) 
        { 
            $this -> online_status = $var; 
        } 
         
        public function zeigOnstatus($user) 
        { 
             if($this->online_status == $user->online_status)
             {
                  print "User online. Chatten?";
             } else {
                  print "User offline.";
             }
        } 
} 

$ich = new User;
$ich->setzOnstatus($_SESSION['onstatus']);

$anderer = new User;
$anderer->setzOnstatus($userstatus2);

$ich->zeigOnstatus($anderer); //$ich vergleicht seinen Status mit $anderer

$anderer->zeigOnstatus($ich); //$anderer vergleicht seinen Status mit $ich
?>

Eigentlich, wenn man wirklich korrekt sein möchte, müsste man annehmen, dass der User, der ein Profil aufruft, online ist. Somit muss man nur kontrollieren, ob der andere auch online ist!

PHP:
<?php 
session_start(); 
$_SESSION['onstatus'] = "online"; 
//Den zweiten Userstatus musst du ja erstmal irgendwo holen... Vermutlich aus der Datenbank
//SQL-Connection setzen wir mal voraus
$qry = "SELECT id FROM users WHERE id='".mysql_real_escape_string($_GET['id'])."' AND last_action > (UNIX_TIMESTAMP-600)";
if(mysql_num_rows(mysql_query($qry)) != 0)
{ $userstatus2 = "online"; } else { $userstatus2 = "offline"; }
//du musst somit bei jeder Aktion, die ein User ausführt, die last_action updaten...
//ich gehe davon aus, dass beim Aufrufen seines Profils seine ID in der URL steht

class User 
{ 
        var $online_status; 
         
        public function setzOnstatus($var) 
        { 
            $this -> online_status = $var; 
        } 
         
        public function zeigOnstatus($user) 
        { 
             if($user->online_status == "online")
             {
                  print "User online. Chatten?";
             } else {
                  print "User offline.";
             }
        } 
} 

$ich = new User;
$ich->setzOnstatus($_SESSION['onstatus']);

$anderer = new User;
$anderer->setzOnstatus($userstatus2);

$ich->zeigOnstatus($anderer);
 
Zuletzt bearbeitet:
Ok, das ist uch nachvollziehbar, das mit der DB ist auch logisch, daher hab ich den Wert nur in einer variablen gespeichert.

Du meintest man kann davon ausgehen das man selbst online ist, das ist nicht richtig.

Mein Gedanke ging ja auch ein wenig weiter, ich kann diese User seite ja nun auch aufrufen wenn ich nicht eingelogged bin, also als Offline, mein Nächster schritt wäre es ja das ich dann ausgebe, Sie müssen eingelogged sein um mit diesem User jetzt zu chatten.

Nur ehe ich das mache, da ich wirklich keine ahnung habe bisher, wollte ich auch mit mir selbst vergleichen, denn sobald ich mich selbst als offline anzeige, wird auch der andere wieder offline.

EDIT: ich hab da aber ne idee, mal sehen obs klappt.
 
Meine Lösung:

PHP:
    session_start(); 
    $_SESSION['onstatus'] = "online"; 
    $userstatus2 = 'online'; # hier könnte auch der wert aus der db stehen 
class User 
{ 
        var $zeige_online; 
         
 		public function __construct()
 		{
      		 $this->online_status = $_SESSION['onstatus'];
  		} 
        public function setzOnstatus($var) 
        { 
             $this -> online_status = $var; 
        } 
           
        public function zeigOnstatus($user) 
        { 
             if(($this->online_status == $user->online_status)&& ($user->online_status !== 'offline'))
             { 
                  print "User online. Chatten?";
             }
			 elseif(($this->online_status == 'offline')&& ($user->online_status !== 'offline'))
             {
                  print "Sie müssen eingelogged sein um mit diesem User jetzt zu chatten.";
             }
			 
			  else {
                  print "User offline.";
             }
        } 
} 

$ich = new User;
$ich->setzOnstatus($_SESSION['onstatus']);

$anderer = new User;
$anderer->setzOnstatus($userstatus2);

$ich->zeigOnstatus($anderer);

scheint auch zu funktionieren zumindest jetzt im ersten durchgang ;)
 
Soweit hatte ich natürlich nicht gedacht, aber die Lösung ist richtig.
Allerdings würde ich ja zum Teil noch viel weiter gehen und nicht mit Text, sondern mit Zahlen kalkulieren. Kann man besser vergleichen und hat mMn weniger Fehlerquellen, weil man sich nicht so schnell verschreibt.

PHP:
<?php
$status = array('offline','online');
$_SESSION['status'] = 1;
echo $status[$_SESSION['status']]; //sollte online ausgeben
?>
Natürlich könnte mans auch in eine Funktion stecken...
PHP:
class User
{
    public function getStatusString($var)
    {
        if($var == 1) return 'online';
        elseif($var == 2) return 'offline';
    }
}
 
in der Regel arbeite Ich auch mit Zahlen einfach weil es kürzer ist eine Zahl zu schreiben, als ein ganzes Wort und ich denke auf die Dauer wirkt sich das auch auf die Performence aus, nur zum Üben belasse ich es noch bei den Wörtern. Mein Nächstes Ziel ist es zu Prüfen ob der User generell einverstanden ist das man Ihn zum chat auffordert und anschliesen ob der User mich nicht vlt sogar blockiert hat, ich muss mich ja steigern um da durch zu blicken ;)
 
So, ich habe ein wenig weiter gebastelt, die ganze zeit probiert und siehe da, nix geht xD

Also vorab mal das script:

PHP:
    session_start(); 
    $_SESSION['onstatus'] = "online"; 
    $userstatus2 = 'online'; # hier könnte auch der wert aus der db stehen 
	$rechte_status = 1; // 1 = jeder 2 = derzeit keine chats 3 = kein zugriff
	
class User 
{ 
        var $zeige_online; 
         
 		public function __construct()
 		{
      		 $this->online_status = $_SESSION['onstatus'];
			 $this->rechte_status = $rechte_status;     // zeile 14
  		} 

        public function setzOnstatus($var) 
        { 
             $this -> online_status = $var; 
        } 
           
        public function zeigOnstatus($user) 
        { 
             if(($this->online_status == $user->online_status)&& ($user->online_status !== 'offline'))
             { 
                  function habRecht($recht) 
				  {
				  	if(($this->rechte_status == $recht->rechte_status)&&($recht->rechte_status == 1)) {
						print "Jeder hat das Recht zu chatten";	
					}
				  	elseif(($this->rechte_status == $recht->rechte_status)&&($recht->rechte_status == 2)) {
						print "Derzeit keine chats";	
					}
				  	elseif(($this->rechte_status == $recht->rechte_status)&&($recht->rechte_status == 3)) {
						print "Du hast kein Recht zu chatten";	
					}
					else { 
						print "Fehler im Code"; 
					}
				  
				  }
				  
             }
			 elseif(($this->online_status == 'offline')&& ($user->online_status !== 'offline'))
             {
                  print "Sie müssen eingelogged sein um mit diesem User jetzt zu chatten.";
             }
			 
			  else {
                  print "User offline.";
             }
        } 
} 

$ich = new User;
$ich->setzOnstatus($_SESSION['onstatus']);

$anderer = new User;
$anderer->setzOnstatus($userstatus2);
$ich->habRecht($rechte_status);


Fehlermeldungen:

Notice: Undefined variable: rechte_status in C:\xampp\htdocs\com_classes\classes\user_class.ink.php on line 14

Notice: Undefined variable: rechte_status in C:\xampp\htdocs\com_classes\classes\user_class.ink.php on line 14

Fatal error: Call to undefined method User::habRecht() in C:\xampp\htdocs\com_classes\classes\user_class.ink.php on line 60

was das script machen sollte: es sollte anhand der oben definierten variablen entscheiden was angezeigt wird wenn beide User online sind, doch noch ehe ich was sehe kommt der Fehler, Ok, den kann man sich zusammenreimen, doch hab ich die Methode doch deklariert ( ich weiß hab ich nicht, sonst würd der das nicht sagen) nur was mache ich noch falsch?

Weiter wollte ich bei der Ffunction public vorsetzen doch das wird auch zu einem Fehler, ich dachte weil es ja eine öffentlich function ist oder******

lg


EDIT: Die sternchen waren eig fragezeichen, ausrufezeichen, fragezeichen
 
Die Warnung kommt daher, weil es innerhalb des Konstruktors keine Zuweisung der Variablen $rechte_status gibt. Evtl. wolltest du es als Parameter in __construct() verwenden?

Die fatale Fehlermeldung kommt, weil es in der Klasse User keine Methode "habRecht()" gibt. Das kommt mit einem Funktionsaufruf gleich, bei dem die Funktion nicht existiert.

Es kommt jetzt darauf an, was du mit der Methode "habRecht()" erreichen willst. :-)

Den ersten Fehler kann man so beheben:

PHP:
class User 
{ 
        var $zeige_online; 
         
         public function __construct($rechte_status = null)
         {
               $this->online_status = $_SESSION['onstatus'];
             $this->rechte_status = $rechte_status;     // zeile 14
          }

Dann kannst du beim Erzeugen einer neuen Instanz von User optional einen Parameter mitgeben:

PHP:
$ich = new User(1);

Vermutlich soll deine habRecht()-Methode den die Mitgliedsvariable $rechte_status ändern? Dann wäre das so zu erledigen:

PHP:
class User
{
 ....

  public function habRecht($rechte_status)
  {
    $this->rechte_status = $rechte_status;
  }

  ....
}
 
Zuletzt bearbeitet:
Zurück