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 14-07-2009, 15:21
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard OOP: Statische Eigenschaften

Hallo

Ich habe folgende Situation

PHP-Code:
class Core{

    private 
$error NULL// Error-Objekt
    
 
    
public function __construct(){
        
    
/* Error-Objekt reinholen */ 
        
global $error;
        
$this->error $error
        
    }
   
    public static function 
newError(){
      
$this->error->triggerError();
    }

triggerError() ist eine nicht-statische Funktion des Error-Objekts, dass ich im Konstruktor via global reinhole. Es gibt nur ein einziges Errorobjekt im gesamten Skript, deshalb diese Vorgehensweise.
Natürlich funktioniert $this.. in einer statischen Funktion newError() nicht. Wie sonst könnte ich es machen?
Wenn ich die Eigenschaft $error via private static $error statisch deklariere, gehts ja auch nicht. Ich kann in newError() ja nicht mit self::error->triggerError() aufrufen - dies gibt mir einen Syntaxfehler aus.

Danke und hoffe war nicht zu kompliziert.
Mit Zitat antworten
  #2 (permalink)  
Alt 14-07-2009, 15:23
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von tim-gt Beitrag anzeigen
Ich kann in newError() ja nicht mit self::error->triggerError() aufrufen - dies gibt mir einen Syntaxfehler aus.
Richtig wäre ja auch self::$error
Mit Zitat antworten
  #3 (permalink)  
Alt 14-07-2009, 15:28
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

global hat in objektorientierter Programmierung überhaupt nix verloren.

PHP-Code:
class Core {

    private 
$error NULL// Error-Objekt
 
    
public function __construct($error){
        
/* Error-Objekt reinholen */ 
        
$this->error $error
    }
   
    public function 
newError(){
        
$this->error->triggerError();
    }

Außerdem solltest du dir mal Exceptions anschauen:

http://de.php.net/manual/en/language.exceptions.php

Geändert von h3ll (14-07-2009 um 15:35 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 14-07-2009, 15:33
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

global $error? "reinholen"? *autsch*

Wenn es sowieso nur ein Error-Objekt geben kann, dann mach das zum Singleton und benutze Error::getInstance().
Mit Zitat antworten
  #5 (permalink)  
Alt 14-07-2009, 15:43
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Mit Patterns habe ich mich noch nicht auseinandergesetzt ;-)

Meine aktuelle Lösung sieht jetzt so aus:

PHP-Code:
class Core{

    private static 
$error NULL// Error-Objekt
    
 
    
public function __construct(){
        

        
    }
   
    public static function 
newError(){
       global 
$error;
       
self::$error $error;
       
self::$error->triggerError();
    }

Ich weiss, es ist nicht schön.. Aber mit Singletons muss ich mich erst noch auseinandersetzen. Mit Exceptions bin ich schon dran.. ich verwende ein Debugging-System, das set_error_handler() und Exceptions kombiniert. Ich werde es dann einmal hier posten.
Danke für die Hilfe.
Mit Zitat antworten
  #6 (permalink)  
Alt 14-07-2009, 15:48
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Gib das global weg!!!
Mit Zitat antworten
  #7 (permalink)  
Alt 14-07-2009, 15:56
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

Du brauchst doch gar kein Property dafür!
PHP-Code:
class Core{
    public static function 
newError(){
       global 
$error;
       
$error->triggerError();
    }

Aber mal ehrlich, warum dieser Umweg über Core? Es gibt offenbar im Calling Scope keine Instanz von Core, weshalb du newError() statisch machen musst. Da wäre es doch viel einfacher, statt Core::newError() gleich das globale Error-Objekt zu benutzen. Mehr macht newError() doch auch nicht!
Mit Zitat antworten
  #8 (permalink)  
Alt 14-07-2009, 16:04
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Ich hab die Funktionsnamen nur zur Illustration verwendet.
Core ist eine Basisklasse, die vor allem statische Methoden zur Stringformatierung etc. enthält. Passiert in einer dieser Methode ein Fehler, wird die Methode triggerError der Klasse Error aufgerufen oder eine Exception geworfen, die mit catchExceptions der Klasse Error abgefangen werden kann (formatierte Ausgabe von Backtrace etc). Ich möchte jetzt nicht die ganze Struktur erklären, danke euch aber für den Hinweis auf Singleton, habe mich schlau gemacht auf PHP: Pattern - Manual und nun sieht die Sache so aus:

Error-Klasse:

PHP-Code:

 
class Error {
         private static 
$instance;
         
         private function 
__construct(){
         
//...
         
}

        public static function 
generate(){
           if(!isset(
self::$instance)) {
              
$class __CLASS__;
              
self::$instance = new $class;
            }
            return 
self::$instance;
          }  

Core-Klasse

PHP-Code:
 class Core {
          private static 
$error;
          
          public function 
__construct(){
          
//...
          
}
 
   public static function 
formatRootRemove($str$root DOCUMENTROOT){
    
/* Error-Objekt reinholen */
    
self::$error Error::generate();

    
$root =preg_replace('!/!','\\',$root);            // Slash zu Backslash ändern  und Kurzform generieren
        
$str str_replace($root,'',$str$count);
        if(
$count === 0){
      
self::$error->triggerError('Needle \''.$root.'\' nicht in Haystack \''.$str.'\' gefunden.',__LINE__,__FILE__,E_USER_NOTICE);
        } else {
            return 
$str;
        }

formatRootRemove() entfernt wie schon erwähnt standardmässig den Rootfolder einer Datei.

Mir fällt grad noch ein, generate() ist wohl der falsche Name für die Methode. getInstance() macht wirklich mehr Sinn.. ;-)

Geändert von tim-gt (14-07-2009 um 16:07 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 14-07-2009, 16:17
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

Jetzt noch auf die Property verzichten, dann ist es perfekt.
PHP-Code:
class Core {
    public function 
__construct(){
         
//...
    
}

    public static function 
formatRootRemove(...){
        
// ...
        
if($count === 0) {
            
Error::getInstance()->triggerError(...);
        }
    }

Mit Zitat antworten
  #10 (permalink)  
Alt 14-07-2009, 17:06
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Also du meinst so:

PHP-Code:

$error 
Error::generate();
$error->triggerError(..); 

Hier macht das m.E. schon Sinn, spart ein paar Zeilen. Aber wenn ich
v.a. mit nicht-statischen Methoden arbeite, sollte ich Error::generate() ja im Konstruktor der jeweiligen Klasse aufrufen und das $error-Objekt private abspeichern, oder nicht?
Mit Zitat antworten
  #11 (permalink)  
Alt 14-07-2009, 17:37
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

Zitat:
Zitat von tim-gt Beitrag anzeigen
Aber wenn ich v.a. mit nicht-statischen Methoden arbeite, sollte ich Error::generate() ja im Konstruktor der jeweiligen Klasse aufrufen und das $error-Objekt private abspeichern, oder nicht?
Nein. Wozu?
Mit Zitat antworten
  #12 (permalink)  
Alt 14-07-2009, 18:01
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Sonst muss ich es ja in jeder nicht-statischen Funktion, in der ich es brauche, neu "generieren"..?
Mit Zitat antworten
  #13 (permalink)  
Alt 14-07-2009, 18:15
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

Aber es ist doch ein Singleton, d.h. nur beim ersten Aufruf von getInstance() wird da was "generiert". Bei jedem weiteren Aufruf wird nur das zurück gegeben, was eh schon da ist.
Mit Zitat antworten
  #14 (permalink)  
Alt 14-07-2009, 19:43
tim-gt
 Registrierter Benutzer
Links : Onlinestatus : tim-gt ist offline
Registriert seit: Jun 2009
Beiträge: 52
tim-gt befindet sich auf einem aufstrebenden Ast
Standard

Ja, "generieren" nenn ich es nur, weil meine Funktion fälschlicherweise "generate()" heisst. Ich meinte damit, dass eine Methode ja keinen Zugriff auf ausserhalb der Klasse deklarierte Objekte hat, weshalb ich dann bei jeder Klasse, in der ich das einmalige Error-Objekt verwenden will, eine Eigenschaft mit dem Objekt belegen muss -> dieses Objekt kann dann von allen Methoden innerhalb der Klasse verwendet werden. Oder bin ich etwa komplett auf dem Holzweg? Natürlich kann ich das Error-Objekt auch in jeder Methode von neuem wieder mit Error::generate() "reinholen"...
Mit Zitat antworten
  #15 (permalink)  
Alt 14-07-2009, 19:50
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

Ich würde es wie gesagt nicht im Konstruktor "reinholen" und in ein Property speichern. Finde es besser, wenn man wirklich bei jeder Verwendung mit getInstance() arbeitet. Dann sieht auch ein Fremder sofort was dahinter steckt (Singleton).
Und das was du da in der Property speichern willst, ist sowieso nur eine Referenz auf das Objekt, die selbe Referenz, die auch getInstance() liefert. Faktisch passiert also bei $this->error->... das selbe wie bei Error::getInstance()->...

Zum "reinholen" an sich: Du musst das Error-Objekt nicht reinholen. Es lebt irgendwo außerhalb. Du willst es gar nicht im Scope der Klasse haben und eigentlich auch keine Referenz darauf. Du willst ihm eigentlich nur eine Nachricht zukommen lassen, wenn es einen Fehler gab. Sieh es einfach so, dann wird es vielleicht verständlicher.
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
statische variablen Kropff PHP Developer Forum 6 01-02-2007 22:05
mehrere Eigenschaften mangrove SQL / Datenbanken 2 30-11-2006 15:42
Vererbung von Eigenschaften R4fT4m4N PHP Developer Forum 8 04-11-2006 12:05
statische Methoden in PHP? Àchtim PHP Developer Forum 3 15-12-2003 13:17
Statische Klassenvariabeln Winner PHP Developer Forum 9 05-12-2003 16:16

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 20:49 Uhr.