zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden PHP - Best Practice - Klassenkonstanten

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 16.12.2011, 14:01
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 24.07.2011
Beiträge: 83
lolDog befindet sich auf einem aufstrebenden Ast
Standard PHP - Best Practice - Klassenkonstanten

PHP-Code:
<?php

class {
    const 
REQUEST_TYPE_A 'a';
    const 
REQUEST_TYPE_B 'b';

    private 
$requestType;

    public function 
__construct$type ) {
        
// Wie kann man hier einfach abfragen
        
if( !( $type GIBT_ES_ALS_KONSTANTE_IN_DER_KLASSE ) ) {
            throw new 
Exception'Unknown type: "' $type '".' );
        }
        
$this->requestType $type;
    }
}

// Soll natürlich gehen
new AA::REQUEST_TYPE_A );
// Soll die Exception werfen
new A'c' );
Die Frage ist wie kann ich da einfach abfragen ob es den Typ gibt?
Am besten irgendwie ohne Reflection Class oder so, weil das ist ja nicht besonders schnell und nicht gerade die beste Lösung.
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 16.12.2011, 14:33
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 747
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Vielleicht so:

PHP-Code:
<?php

class {
    const 
REQUEST_TYPE_A 'a';
    const 
REQUEST_TYPE_B 'b';

    protected 
$types = array('a''b');

    private 
$requestType;

    public function 
__construct$type ) {
        
// Wie kann man hier einfach abfragen
        
if( !in_array$type$this->types ) )  {
            throw new 
Exception'Unknown type: "' $type '".' );
        }
        
$this->requestType $type;
    }
}

// Soll natürlich gehen
new AA::REQUEST_TYPE_A );
// Soll die Exception werfen
new A'c' );
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 16.12.2011, 14:45
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 24.07.2011
Beiträge: 83
lolDog befindet sich auf einem aufstrebenden Ast
Standard

Ja dann aber eher so:

PHP-Code:
protected $types = array( self::REQUEST_TYPE_Aself::REQUEST_TYPE_B); 
aber ich will mir sparen, den ganzen krams 2 mal dahinzuschreiben. bisher lösen wir das problem genau so, allerdings wird es bei ca 10 const sehr nervig und unübersichtlich
Mit Zitat antworten
  #4 (permalink)  
Alt 16.12.2011, 15:05
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 747
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

„Enum“ wäre vielleicht noch ein Stichwort.

- Enum-Implementation bewerten/verbessern - PHP Forum: phpforum.de
Mit Zitat antworten
  #5 (permalink)  
Alt 16.12.2011, 17:23
Benutzerbild von David
auch, ja!
XHTMLforum-Kenner
 
Registriert seit: 08.11.2007
Beiträge: 2.626
David ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von lolDog Beitrag anzeigen
PHP-Code:
// Soll natürlich gehen
new AA::REQUEST_TYPE_A );
// Soll die Exception werfen
new A'c' ); 
Das sind doch zwei völlig unterschiedliche Sachen.
Was genau willst Du prüfen? Den Namen der Konstanten, oder deren Inhalt?

Um auf den Namen zu prüfen:
PHP-Code:
/**
* @param string $const
*/
__construct$const ) {
   if ( 
defined'self::' $const ) ) 
      
//TRUE
   
else 
     
//FALSE

__________________
github | http://dnaber.de

Geändert von David (16.12.2011 um 17:30 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 16.12.2011, 20:30
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 24.07.2011
Beiträge: 83
lolDog befindet sich auf einem aufstrebenden Ast
Standard

ich will schauen ob es den übergebenen wert in den constanten gibt? sprich ist es ein erlaubter request typ. aber je länger ich über die sache nachdenke desto eher komme ich zum entschluss, dass es wohl keine besser möglichkeit gibt wie sie noch einmal in einem array zu speichern und diese dann entsprechen zu prüfen. wie es ja oben schon vorgeschlagen wurde und wie ich es im moment schon mache...

dachte eventuell hat jemand noch DIE IDEE..
Mit Zitat antworten
  #7 (permalink)  
Alt 17.12.2011, 01:11
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 747
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Ja, ich weiß, was du meinst, aber ich glaube, in PHP gibt es da keine Alternativen, die ohne Syntax-Vergewaltigung auskommen. Die SPL-Enum-Sache ist leider auch noch alles andere als Standard.
Mit Zitat antworten
  #8 (permalink)  
Alt 17.12.2011, 13:36
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 24.07.2011
Beiträge: 83
lolDog befindet sich auf einem aufstrebenden Ast
Standard

Man könnte es über die ReflectionClass lösen und dann mit der Methode getConstants alle Konstanten holen. Also so:

PHP-Code:

$ref 
= new ReflectionClass__CLASS__ );
foreach( 
$ref->getConstants() as $constant ) {
 if( 
strposself::DEFINITION_WIE_DIE CONSTANTE_ANFANGEN_MUSS$constant ) === ) {
  if( 
self::{$constant} === $uebergebener_type ) {
   echo 
'alles toll';
  }
 }

aber bei uns heißt es immer nimm wenn es geht nicht die reflection klasse das wäre so langsam. keine ahung ob das stimmt oder nicht. es würde ja schon mit php mitteln gehen, aber keine die ich einsetzen dürfte ohne das danach über den code diskutiert wird :P
Mit Zitat antworten
  #9 (permalink)  
Alt 17.12.2011, 14:25
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 747
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Du könntest die Werte dann auf Klassenebene (nicht auf Instanzebene) cachen. Das ist eine einmalige Operation pro Klasse und sollte nicht die Welt kosten.

PHP-Code:
<?php

class Foo
{
    const 
TYPE_A 'a';
    const 
TYPE_B 'b';
    const 
TYPE_C 'c';

    protected static 
$typeCache null;

    protected static function 
rebuildTypeCache()
    {
        
self::$typeCache = array();

        
$ref = new \ReflectionClass(__CLASS__);

        foreach (
$ref->getConstants() as $name => $value) {
            if (
strpos($name'TYPE_') === 0) {
                
self::$typeCache[$value] = true;
            }
        }
    }

    protected static function 
typeExists($type)
    {
        if (
self::$typeCache === null) {
            
self::rebuildTypeCache();
        }

        return 
self::$typeCache[$type];
    }

    public function 
__construct($type)
    {
        if (!
self::typeExists($type)) {
            throw new \
Exception('Illegal type specified: ' $type);
        }
    }
}

new 
Foo(Foo::TYPE_A);
new 
Foo(Foo::TYPE_B);
new 
Foo('d');
Wobei ich gerade nicht so wirklich den Gewinn der gesamten Vorgehensweise sehe. Kann man entsprechende Prüfungen nicht üblicherweise dort umsetzen, wo mit dem Wert konkret gearbeitet wird?
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

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 aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP Kontaktforumlar allgemeiner aufbau Krulle Serveradministration und serverseitige Scripte 15 17.06.2010 12:44
php Seiten online stellen online Serveradministration und serverseitige Scripte 7 27.03.2009 12:13
Praxisnah PHP lernen p0mmeluff Serveradministration und serverseitige Scripte 5 24.03.2009 21:18
Dateien auslagern - Include und PHP ArcVieh Serveradministration und serverseitige Scripte 17 27.03.2008 18:09
PHP lernen? Grafiken später hinzufügen? chilla Offtopic 0 21.07.2007 14:54


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:12 Uhr.