Portal > Foren > PHP > PHP-Programmierung > Innerhalb einer Methode einer Klassenvariablen einer anderen Klasse etwas zuweisen...
Antwort
 
Themen-Optionen
Alt 10.03.2006, 13:17 Nach oben    #1
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard Innerhalb einer Methode einer Klassenvariablen einer anderen Klasse etwas zuweisen...

Innerhalb einer Methode einer Klassenvariablen einer anderen Klasse etwas zuweisen ohne die Klasse vorher instanziert zu haben.
Wuah hab ich ein Brett vorm Kopf, aber selten dick.

Mein Problem ist besser am Beispiel zu erklären.
Ich hab ne Klasse "Auth", die mein Login checkt und bei falschen Daten der Error-Klasse "Error" und der darin enthaltenen Klassenvariable $_error (Array) einen String übergeben und anhängen soll ('Fehlerhafte Logindaten').
Klappt alles nicht, sprich das Array bleibt leer.
Mein Quellcode ohne Fehlermeldungen:
index.php
PHP-Code:
<?php
error_reporting
(E_ALL E_STRICT);
require_once 
"autoload.php"// Aus dem Tutorial von Guradia

/* Beginn der Session */
session_start();

$ErrorHandling = new Error();
$DB = new DB();
$Auth = new Auth('WarrenFaith''Password');
$ErrorHandling->showError();
?>
Auth.php
PHP-Code:
<?php
class Auth
{
    public function 
__construct($name$password)
    {
        
$this->checkAuth($name$password);
    }
    
    public function 
checkAuth($name$password)
    {
        
$sql "SELECT
                    ID, Nickname, Password, Email, Aktiv
                FROM
                    tblAccounts
                WHERE
                    BINARY Nickname = '"
.$name."' AND Password = '".md5($password)."';";
        
$result mysql_query($sql);
        if (
$ergebnis mysql_fetch_object($result)) {
            return 
true;
        } else {
            
$ErrorHandling->pushError('Fehlerhafte Loginangaben'); //PROBLEM
            
return false;
        }
    }
}
?>
Error.php
PHP-Code:
<?php
class Error
{
    private 
$_error = array();
    
    public function 
pushError($msg)
    {
        
$this->_error[] = $msg;
    }
    
    public function 
showError()
    {
        return 
'<pre>'.print_r($this->_error).'</pre>';
    }
}
?>
Fehlermeldungen (die ich auch verstehe, nur nich weiß wie beheben)
Code:
Notice: Undefined variable: ErrorHandling in ...\framework\Auth.php on line 22

Fatal error: Call to a member function pushError() on a non-object in ...\framework\Auth.php on line 22
Ich weiß, dass "static" Variablen ihren Wert auch ohne Object behalten (oder irre ich mich?) Aber ich check nicht, wie ich die Variable static machen kann, denn mit private stativ $_error gibts keine Veränderungen :/

An dem Manual orientiert ergibt sich mir die Frage, wenn das Auslesen der Static-Variable geht, kann ich sie nicht auch setzen? Und wenn ja, wie?
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 13:34 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Jou. Es gibt ja kein Objekt ErrorHandling. Du nutzt das, ohne es vorher instanziiert zu haben.

Füge der Klasse Auth doch eine Klassenvariable hinzu und greife darauf zu.

PHP-Code:
class Auth {

    private 
$errorHandler;

    public 
__construct() { 
        
// ..
        
$this->errorHandler = new Error();
    }
    
    
// ...

Und dann einfach
PHP-Code:
$this->errorHandler->pushError(..); 
Wenn die Klasse Error einen Handler darstellen soll würde ich sie auch so nennen. Das aber nur nebenbei.

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 13:46 Nach oben    #3
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Mja bisher ist das nur rumgeteste, aber ich will eigentlich ohne ein Objekt erstellen zu müssen auf dieser Variablen "rumschreiben" deswegen muss es doch möglich sein, dass mit static zu tun oder? nur auslesen einer static-variablen ohne die möglichkeit des wertzuweisens ist doch fast schon sinnlos
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:02 Nach oben    #4
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Warum nicht einfach im Error-Handler eine statische Methode erzeugen, die Objekt von sich selbst erstellt und dann damit arbeitet?
PHP-Code:
class Error
{
  const 
CRITICAL 0;

  public static 
pushError($message$level)
  {
    
$error = new __CLASS__;
    
$error->doSth();
  }
}

Error::pushError('An error occured.'Error::CRITICAL); 
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:04 Nach oben    #5
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Hey die Idee ist gut, dass probier ich gleich mal.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:14 Nach oben    #6
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Ich habs wie folgt gelöst.
PHP-Code:
class Error
{
  const 
CRITICAL 1;
  const 
WARNING  2;
  const 
SILENT   3;

  public static function 
trigger($message 'An error occured.'$level self::CRITICAL)
  {
    switch (
$level)
    {
      case 
self::CRITICAL:
        
// Exception werfen, die dann im Main-Thread abgefangen wird, Fehler loggen.
        
break;

      case 
self::WARNING:
        
// Mit printf() eine Meldung ausgeben und weitermachen, Fehler loggen.
        
break;

      case 
self::SILENT:
        
// Nichts ausgeben, Fehler loggen.
        
break;
  }

PHP-Code:
try
{
  if (
1)
  {
    
Error::trigger('Something went wrong here.'Error::CRITICAL);
  }
}
catch (
Exception $e)
{
  
// Behandlung für Fehler vom Typ Error::CRITICAL

Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:22 Nach oben    #7
Erfahrener Benutzer
 
Registriert seit: 19.08.2005
Beiträge: 115
Standard

Warum nicht einfach singleton? Du wirst doch eh nur eine Instanz der Klasse brauchen, das ist doch das Typische Anwendungsgebiet.
__________________
Programming today is a race between software engineers striving to build bigger and better
idiot-proof programs, and the universe trying to build bigger and better idiots. So far, the
universe is winning.
Buhmann ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:23 Nach oben    #8
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Zitat:
Zitat von Buhmann
Du wirst doch eh nur eine Instanz der Klasse brauchen
Mit einer statischen Methode braucht er gar keine.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:31 Nach oben    #9
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Error.php
PHP-Code:
<?php
class Error
{
    private 
$_error = array ("CRITICAL" => array(),
                                
"WARNING" => array(),
                                
"NOTICE" => array(),
                                
"GAMEPLAY" => array());
    
    public static function 
pushError($msg$lvl)
    {
        
$ErrorHandling = new self();
        switch(
$lvl)
        {
            case 
'CRITICAL':    $this->_error['CRITICAL'][] = $msg;
                                break;
            case 
'WARNING':        $this->_error['WARNING'][] = $msg;
                                break;
            case 
'NOTICE':        $this->_error['NOTICE'][] = $msg;
                                break;
            case 
'GAMEPLAY':    $this->_error['GAMEPLAY'][] = $msg// Zeile 20
                                
break;
            default:            break;
        }
    }
    
    public function 
showError()
    {
        return 
'<pre>'.print_r(self::$_error).'</pre>';
    }
}
?>
Bin ich blöd? Egal ob mit oder ohne $this er meckert.
Mit $this

Zitat:
Fatal error: Using $this when not in object context in C:\Dokumente und Einstellungen\Christine\Desktop\martin\workspace\C overLoses\framework\Error.php on line 20
Ohne $this
Zitat:
Fatal error: Access to undeclared static property: Error::$_error in C:\Dokumente und Einstellungen\Christine\Desktop\martin\workspace\C overLoses\framework\Error.php on line 28
Ich steh auf der Leitung!
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:34 Nach oben    #10
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

In statischen Methoden gibt es kein $this, das gibts nur im Objektkontext, d.h. wenn ein Objekt erzeugt wurde und dann darin gearbeitet wird.

Setz' $_error auf static (private static $error), dann kannst du in der Methode mittels self::$_error drauf zugreifen.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:35 Nach oben    #11
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Schon ohne $this und mit self::, dazu dann noch die Klassenvariable public static machen und fein. Oder halt wie Lars als Konstanten ablegen.

Nochmal genau schauen:
http://de3.php.net/manual/en/language.oop5.static.php


[EDIT]
@Lars: Sicher, dass private static funktioniert?
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:44 Nach oben    #12
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Klar, warum solls nicht?
Ist ja im Prinzip eine normale Klassenvariable, die dann halt nur innerhalb der Klasse erreichbar ist.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 14:53 Nach oben    #13
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Weiß auch nicht. Hatte irgendwie im Hinterkopf, dass das bei Java anders wäre. Ein Test hat mich vom Gegenteil überzeugt.
Also: Vergessen.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 15:08 Nach oben    #14
axo
Gast
 
Beiträge: n/a
Standard

wenn's denn mit singleton gemacht werden muss, und der errorhandler nicht einfach als konstruktorparameter übergeben werden soll, dann so:

PHP-Code:
class ErrorHandler {
   private 
$_errorStack = array();
   private function 
__construct() {}

   public static function 
getInstance() {
       static 
$e null;
        if(
is_null($e)) {
            
$e = new ErrorHandler();
        }
        return 
$e
   }
   public function 
debug($message) {}
   public function 
error$message ) {}
   public function 
fatal$message ) {}

  public function 
setErrorLevel $int ) {}
}

// usage:
// initialization:

ErrorHandler::getInstance() -> setErrorLevel(ERROR_DEBUG);


// in den klassen dann....
ErrorHandler::getInstance() -> debug('bla');
ErrorHandler::getInstance() -> error('hello'); 
... ist von http://logging.apache.org/log4j/docs/index.html abgeguckt... ist ganz praktisch, um die diversen error-levels schön zu mappen.

die allgemeinen gefahren von singletons sollten halt klar sein.
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 15:11 Nach oben    #15
axo
Gast
 
Beiträge: n/a
Standard

übrigens:
http://us2.php.net/errorfunc

sollte portabler und schneller sein und auch beim austausch des handlers weniger probleme machen.
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 16:15 Nach oben    #16
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Danke für die Hilfe
@axo: das error_reporting von php wollte ich nicht nutzen, denn eigentlich sollen keine parserfehler ausgegeben werden sondern programmspezifische Fehler wie falsche Formulareingaben etc. trotzdem danke
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 16:16 Nach oben    #17
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Parser-Fehler kannst du ohnehin nicht ausgeben
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 16:31 Nach oben    #18
axo
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von WarrenFaith
Danke für die Hilfe
@axo: das error_reporting von php wollte ich nicht nutzen, denn eigentlich sollen keine parserfehler ausgegeben werden sondern programmspezifische Fehler wie falsche Formulareingaben etc. trotzdem danke
nope, du kannst z.b. mit set_exception_handler auch deine eigenen exceptions wunderbar abfangen und damit schön formatieren.
aber wie du willst. singleton-pattern ist halt gefährlich, aber wie's geht kannst du an obenstehendem code schon sehen.
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.03.2006, 21:25 Nach oben    #19
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

dann werd ich mir das nochmal genauer zu gemüte führen.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag