Ankündigung

Einklappen
Keine Ankündigung bisher.

Nur Konstanten aus einer Klasse übergeben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Nur Konstanten aus einer Klasse übergeben

    Hallo,

    erstmal der Pseudecode:

    PHP-Code:
    class myTestClass
    {
        const 
    myConst 1;

        public function 
    doIt($const)
        {
            
    tuEtwas();
        }


    Gibt es eine möglichkeit damit ich festlegen kann dass bei $const nur Konstanten übergeben werden die in dieser Klasse definiert wurden ?
    Wenn möglich sollte man natürlich Konstanten hinzufügen ohne ein in_array oder so zu erweitern....

    PHP-Code:
    $obj = new myTestClass();
    $obj->doIt(myTestClass::myConst); // GUT

    $obj->doIt('was'); // Fehler 
    Grüße
    Signatur:
    PHP-Code:
    $s '0048656c6c6f20576f726c64';
    while(
    $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

  • #2
    Nein. Weil Konstanten ja nur Werte repräsentieren. Du kannst in der Methode aber die Konstanten prüfen.
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      Du kannst in der Methode aber die Konstanten prüfen.
      Verstehe nicht genau wie du das meinst ?
      Einfach nachsehen ob der Wert als Konstante existiert ? in_array() ?

      Anderer Ansatz, gibt es eine function wo ich alle Konstanten in einer Klasse bekomme ?
      Signatur:
      PHP-Code:
      $s '0048656c6c6f20576f726c64';
      while(
      $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

      Kommentar


      • #4
        Ja das meine ich. Und die Frage beantwortet das Manual. Klassenfunktionen.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Was ist überhaupt deine Motivation?
          [URL]http://hallophp.de[/URL]

          Kommentar


          • #6
            Es sind gewisse Auslöser vorgegeben an die man eine Aktion binden kann.
            Die Auslöser(name) werden durch die Konstanten definiert, man soll nun nur Sachen an Auslöser binden können die auch existieren...
            Signatur:
            PHP-Code:
            $s '0048656c6c6f20576f726c64';
            while(
            $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

            Kommentar


            • #7
              Hallo,

              ich muss zugeben, ich mache das auch gelegentlich so. Hier mein Code, sicherlich nicht wahnsinnig performant, da er auf Reflections beruht:

              PHP-Code:
              <?php
              class Message {
                const 
              TYPE_INBOX 1;
                const 
              TYPE_OUTBOX 2;

                protected 
              $_type;

                public function 
              setMessageType($type) {
                  
              $this->_checkType($type);
                  
              $this->_type $type;
                }

                protected function 
              _checkType($type) {
                  if (!
              $this->_isType($type)) {
                    throw new 
              InvalidArgumentException("unknown message type provided");
                  }
                }

                protected function 
              _isType($type) {
                  return 
              in_array($type$this->_getTypes(), true);
                }

                protected function 
              _getTypes() {
                  
              $reflection = new ReflectionObject($this);
                  
              $types = array();
                  foreach (
              $reflection->getConstants() as $name => $value) {
                    if (
              mb_strpos($name"TYPE_") !== 0) {
                      continue;
                    }
                    
              $types[] = $value;
                  }
                  return 
              $types;
                }
              }
              ?>
              (ausm Kopf)

              Zwei Punkte dazu:
              1.) Warum nicht setMessageTypeInbox() und setMessageTypeOutbox() einfuehren?
              2.) Vorsicht, wenn du versuchen moechtest die Reflection-Abfrage zu cachen, a) ist ein Cache noetig? (mehr als ein Aufruf der Methode pro Skript?) b) wenn du einen statischen Propertycache benutzt, kann es sein, dass Ableitungen mit zusaetzlichen Konstanten nicht mehr funktionieren.

              Ich find das recht bequem, da ich die _getTypes()-Methode nicht bei jeder Aenderung aktualisieren muss. Wenn es ewig-feste Bezeichner sind (wie bspw. hier, Inbox/Outbox), dann kann man sie ruhig festkodieren. Bei haeufigem oder potenziell folgenden Aenderungen wuerde ich das so uebernehmen. Wenn auch wie gesagt nicht sonderlich performant.
              "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

              Kommentar

              Lädt...
              X