Ankündigung

Einklappen
Keine Ankündigung bisher.

Datentypen festlegen

Einklappen

Neue Werbung 2019

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

  • Datentypen festlegen

    Hallo liebe PHP-Programmierer,

    für die Erstellung eines automatisierten Tests möchte ich php auf Kommandozeilenebene nutzen (keine Webentwicklung). Das Testskript, oder Teile des Testskripts sollen möglichst wiederverwendbar sein und ein anderer Test möglichst schnell durch Austausch von Komponenten möglich sein.
    Um dies zu realisieren möchte ich Interfaces bzw. abstrakte Klassen verwenden.

    Nun zu meinem Problem:
    Ich möchte eine abstrakte Testklasse definieren die schon einige Methoden und ein paar Attribute enthält, welche wiederum Objekte sind. Ich möchte den Datentyp der Attribute in der abstrakten Klasse festlegen, da ich in den Methoden der abstrakten Testklasse wiederum Methoden der internen Objekte zugreifen möchte. Demzufolge muss es sich bei den Attributen um Childs einer abstrakten Klasse handeln. Dies möchte ich nun festlegen.

    Dazu folgendes Beispiel:
    PHP-Code:
    <?php

    abstract class MeasuremenDevice
    {

          public function 
    GetMeasurementValues($Channel);


    }


    abstract class 
    TestSkript
    {

          protected 
    $myMeasurementDevice;   // hier möchte ich festlegen, dass dieses Attribut ein Child der MeasurementDevice-Klasse sein muss
          
    protected $myProtocol;
          protected 
    $ValueArray=array();

          function 
    __construct ($Path)
          {
                 
    $this->myProtocol = new Protocol($Path);  // diese Klasse beschreibe ich hier nicht näher
           
    }

          public function 
    StartTest()
          {
                 
    $this->myProtocol->WriteStartPage();
                 
    $myValues $this->myMeasuremtDevice->GetMeasurementValues(1);
                
    $this->myProtocol->AddValues();

           }
    }


    class 
    VoltageDevice
    {

         public function 
    GetVoltageValues()
        {
             return 
    12.3;    //kleines Beispiel
        
    }

    }

    class 
    VoltageMeasurement extends TestSkript
    {
          function 
    __construct(
          {
                
    parent::__construct("Protokoll_1.pdf");
                
    $this->myMeasurementDevice = new VoltageDevice();
          }
    }


    $myTest = new VoltageMeasurement();
    $myTest->StartTest();

    ?>
    Im obigen Beispiel werde ich zur Laufzeit eine Fehlermeldung bekommen, dass es die Funktion GetMeasurementValues nicht gibt, da diese in der Klasse VoltageDevice nicht implementiert wurde. Deshalb möchte ich bereits in der abstrakten Klasse TestSkript festlegen, dass es sich bei dem Attribut $myMeasurementDevice um eine Instanz einer Klasse handeln muss, welche von der Klasse MeasurementDevice erbt.

    Gibt es in PHP die Möglichkeit, dies in der abstrakten Klasse breits festzulegen?

    Ich bin eigentlich ein C bzw. C++ Programmierer und wüsste zumindest in diesen Programmiersprachen, wie ich mit diesem Problem umgehen müsste, da man hier Datentypen festlegen muss.

    Vielen Dank im Vorraus!


  • #2
    Du könntest das ganze mit Getter/Setter regeln. Indem du ihm im Setter sagst, dass es MeasurementDevice sein muss.
    Zitat von derwunner
    "Ein FISI ist auf gut-deutsch der Netzwerker. Das heißt Du gehst rauß zum Kunden oder auf die Straße und verlegst Leitungen" - derwunner 2015

    Kommentar


    • #3
      Seit Version 5 gibt es type hinting
      http://php.net/manual/de/language.oop5.typehinting.php

      Oder aber der operator "instanceof"...
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Codebeispiele bitte in BBCode. Sehr verbunden.
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Hallo,

          vielen Dank für eure sehr schnellen Antworten.

          @CrocoBlack:
          "Du könntest das ganze mit Getter/Setter regeln. Indem du ihm im Setter sagst, dass es MeasurementDevice sein muss."

          Wie meinst du das bzw. wie könnte das aussehen?
          PHP-Code:
          function __set (MeasurementDevice $myMeasurementDevice
          ???

          @Istegelitz
          Beides habe ich versucht, doch leider bekomme ich einen Syntax-Fehler. Da ich nicht so PHP-Affin bin habe ich es so gemacht:
          PHP-Code:
          protected MeasurementDevice $myMeasurementDevice
          bzw.
          PHP-Code:
          protected $myMeasurementDevice instanceof MeasurementDevice
          @nikosch:
          Bitte entschuldige, ich hoffe in diesem Post ist es etwas besser leserlich.

          Kommentar


          • #6
            Da ich nicht so PHP-Affin bin habe ich es so gemacht:
            PHP-Code:
            protected MeasurementDevice $myMeasurementDevice;
            bzw.
            PHP-Code:
            protected $myMeasurementDevice instanceof MeasurementDevice;
            PHP kennt Typehinting nur in Methodensignaturen. Das was Du da planst ist so nicht durchführbar. Du kannst also allenfalls beim Setting/der Initialisierung der Properties den Typ prüfen. Du kannst auch Konstruktoren oder Setter final setzen. Und Du könntest eine Factory bauen, die ein Objekt der gewünschten Konfiguration erzeugt. Alles Varianten um den Erzeugungskontext zu kontrollieren. Aber verbindliche Typen in der Variable selbst kennt eine schwach typisierte Sprache eben nicht.
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar

            Lädt...
            X