• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage Class in Class

mustang

Mitglied
Hallo Leute,

ich habe ein Problem, zu dem ich schon ein bisschen recherchiert habe, aber nicht wirklich zu einer Lösung gekommen bin. Als Zusatzinfo: ich habe gerade entdeckt, dass man ja schon PHP 7.0 nutzen kann, eventuell liegt also die Lösung darin, kenne mich da aber noch nicht komplett aus.

Mein Problem:
Eigentlich wollte ich eine eigene Klasse zum checken von Formulareingaben erstellen.
Bisher hat das in etwa in dem Stil funktioniert:

Code:
class formcheck_old {
    
    private $variable;
    public $formerrors = array();

    public function __construct     ($id = "") {
        //diverse Kontrollen zum Formular selbst
        //bei Fehlern wird der Name des Input-Feldes in $formerrors eingefügt
    }
    
    public function select          ($req, $value, $varname, $values) {
       //diverse Kontrollen zum select (ist das value in einem bestimmen array vorhanden, etc.)
    }
    
    public function text             ($req, $value, $varname) {
       //diverse Kontrollen zum Textfeld
       //bei Fehlern wird der Name des Input-Feldes in $formerrors eingefügt
    }

.
.
.
   function closecheck() {
      //wenn $formerrors Fehler enthält, wird false zurückgegeben, ansonsten true
   }

Das hatte den Vorteil, dass ein komplettes Formular mit unterschiedlichen Funktionen überprüft wird und anschließend alle Ergebnisse / Fehler zusammengefasst und ausgewertet werden können.

Nun wollte ich das ganze eigentlich ausbauen und Klassen für die einzelnen Input-Felder festlegen, da ich so flexibler mit Variablen, etc. arbeiten kann, bzw. ich auch eine Grundklasse erstellen kann, die alle gemeinsamen Eigenschaften enthält und dann nur noch um spezielle Dinge durch extends erweitert wird.

Problem an der ganzen Sache: Ich kann (meiner Meinung nach) keine Klassen in Klassen erstellen (sprich eine Klasse für das Formular, in welcher sich die Klassen der Input-Felder befinden). Ich würde gerne dennoch auf die gemeinsame Variable $formerrors mit allen Klassen für die Inputfelder zugreifen können.

Ich weiß nicht, ob ich den Sachverhalt ausreichend erklärt habe. Mich würde vorallem interessieren, ob es die Möglichkeit überhaupt gibt in dieser Art Klassen in einer Klasse zu definieren. Es geht mir nicht um: Da gibt es schon vorgefertigte Klassen um Formulare zu kontrollieren, da dies ein generelles Problem ist, welches auch für andere Beispiele zutreffen kann.

Würde mich sehr über eure Hilfe freuen!
 
Werbung:
Problem an der ganzen Sache: Ich kann (meiner Meinung nach) keine Klassen in Klassen erstellen
Natürlich geht das:
PHP:
<?php

   class abc
   {
     public function hallo()
     {
       echo "Hallo";
     }
   }
   
   class def
   {
     public function hallo()
     {
       $abc = new abc;
       $abc->hallo();
       echo " Welt";
     }
   }
   
   $xyz = new def;
   $xyz->hallo();
?>
 
Werbung:
Ähm ich befürchte, dass ich mein Problem nicht ausreichend beschrieben habe. Ich meinte eigentlich eine neue Klasse definieren. So in der Art:
Code:
class Parent {
     private $var1;
     private $var2;
     public var3;

     class Child1 {
          }

     class Child2 {
          }
}

Es hätte den Vorteil, dass ich einmal eine Parent-Instanz erstelle und aus dieser dann jeweils Childs, die aber auch auf die Variablen der Parent-Klasse zugreifen können (die sie gemeinsam haben).
So könnten verschiedene Klassen auf ein und die selbe Variable zugreifen und diese nach belieben ändern.
Im Prinzip wie Funktionen in Klassen nur eben in Form einer Klasse.
Mit extend gebe ich nur die Funktionen weiter, aber habe keine gemeinsame Parent-Klasse. Keine Ahnung, ob man das versteht :D
 
Irgendwie muss ich schon die ganze Zeit an ein composite pattern denken. Keine Ahnung ob das so ungefähr das ist was du haben willst. Also es ist nun auch nur ein Gedanke, aber wie schaut mit folgender Methode aus

PHP:
class Form {
    protected $fields = array();
    protected $formErrors = array();

   public function addFormFields($formfields) {
       $this->fields[] = $formFields;
   }

    public function valide() {
        foreach($this->fields as $formFields) {
            $formFields->validate();
            $this->formErrors[] = $formFields->getErrors();
        }
    }
}

$Form = new Form();
$Form->addFormFields(new Text());
$Form->addFormFields(new Select());
$Form->addFormFields(new Checkbox());

Wie gesagt ist nur ein erster Gedankengang, auf die Art hat man noch paar mehr Möglichkeiten wie die Form direkt über die Form Klasse zu rendern und so was. Aber da weiß ich nun nicht genau was du vor hast mit deinen Klassen.

So wärst du flexibel, hättest für jedes Input Feld ne eigene Klasse.
 
PHP:
abstract class AbstractForm {

    private $data     = [];

    private $messages = [];

    private $elements = [];

    public function isValid()
    {
        // Überprüft ob die Form valide ausgefüllt wurde
    }

    public function getFormData()
    {
        // Wenn isValid === true gebe die Daten danach zurück
    }

    public function setFormData($data = [])
    {
        // Setzt die übergebenen Daten
    }

    public function getMessages()
    {
        // Gibt Error Messages zurück falls vorhanden
    }
 
    public function hasMessages()
    {
        // ...
    }

    public function addElement(AbstractFormElement $element)
    {
        // Bli Bla Blub
    }
}

PHP:
abstract class AbstractFormElement
{
    private $options     = [];

    private $attributes = [];

    public function getOptions()
    {
        // ...
    }

    public function setOptions($options = [])
    {
        // ...
    }

    public function setAttributes($attributs = [])
    {
        // ...
    }

    public function getAttributes()
    {
        // ...
    }
}

PHP:
class ContactForm extends AbstractForm
{
    // ...
}

PHP:
class Textarea extends  AbstractFormElement
{
    // ...
}


Dann irgendwie so...
PHP:
$form = new ContactForm();

// Daten vom POST-Request abfangen
$data = $_POST;

$form->setData($data);

if ($form->isValid()) {
     // Alles okay, gefilterten Daten können wieder geholt werden
     $data = $form->getData();
    
     // Daten verarbeiten
     return true;
} elseif ($form->hasMessages()) {
     return $form->getMessages();
}
 
Zuletzt bearbeitet:
Werbung:
Ich glaube composite pattern sieht ganz gut aus. Kenne ich noch nicht, insofern ist die chance groß, dass es die Lösung ist. Werde es die Tage mal ausprobieren. Danke!
 
Zurück
Oben