2016-09-22 5 views
1

Ich schrieb eine Klasse zu validieren Formulareingabe, die über bestimmte Felder (Schlüssel in der Eingabe-Array) und ermöglicht es, Regeln dafür zu definieren. Dies würde ermöglichen, einen Validierer zu schaffen, der sich um Kontaktdaten kümmert, z. mit Feldern "title", "name" und "email".Objekt als (globale) Konstante in PHP

Die Idee meines Entwurfs war, dass dieser Validator für mehrere Formulare wieder verwendet werden könnte, die auf der Website verteilt werden. Schließlich müssen viele dieser Formulare möglicherweise einige Kontaktdaten ausfüllen. Die einzige Sache, an die ich nicht gedacht habe, ist, dass PHP es nicht erlaubt, Konstanten oder statische Felder mit Objekten zu initialisieren.

Ich hatte gehofft, meine Validator zu verwenden, indem es in irgendeiner Datei utils.php als

const CONTACT_VALID = new Validator(...); 

, so dass ich konnte einfach require "utils.php" spezifizieren diese Konstante zuzugreifen, ohne sie jedes Mal initialisiert wird. Dies funktioniert natürlich nicht und auch bei statischen Variablen funktioniert das nicht. Ich dachte auch über so etwas wie

static CONTACT_VALID = NULL; 
static function get_contact_valid() { 
    if (is_null(CONTACT_VALID)) 
     CONTACT_VALID = new Validator(); 

    return CONTACT_VALID; 
} 

aber ich bin nicht ganz sicher, ob dies die gewünschte Wirkung haben würde, da ich relativ neu bin auf PHP (und Web-Technologie im Allgemeinen).

Also meine Frage: Gibt es eine Möglichkeit, ein Objekt so zu haben, dass ich es überall auf der Website verwenden kann, ohne es immer wieder neu initialisieren zu müssen?

Antwort

0

Die Antwort, die eigentlich gekommen sein sollte, ist, dass es keinen Sinn macht, auf mehreren Seiten einen globalen Konstante Validator für den Einsatz zu haben. Nach einigem Hinsehen fand ich heraus, dass

  1. php-Konstanten sind Kompilierzeitkonstanten und somit zum Speichern von Objekten ungeeignet.
  2. statische Variablen haben die Lebensdauer einer Anfrage und können daher nicht über mehrere Seiten hinweg verwendet werden.

Daher ist es notwendig, einen Validator für jede Anfrage zu initialisieren. Wenn die Initialisierung eines Validators immens teuer wäre, könnte es eine Option sein, das Objekt in eine Datei zu serialisieren und es zu deserialisieren, um es wiederherzustellen. Ich denke jedoch, dass dieser Vorschlag praktisch irrelevant ist (oder sein sollte).

Wenn derselbe Validator andererseits mehrmals während einer einzigen Anfrage verwendet werden könnte, könnte es sinnvoll sein, eine statische Variable mit zugehöriger Methode zu berücksichtigen, um darauf zuzugreifen, wie bereits in der Frage vorgeschlagen.

Entschuldigung, wenn meine Frage nicht vollkommen klar war

1

Sie müssen für sie es statische Klasse verwenden http://php.net/manual/en/language.oop5.static.php

class Validator 
{ 
    static function foo() 
    { 
     echo 'bar'; 
    } 
} 

Verwenden Sie telefonisch unter:

Validator::foo(); 

es zu nennen ‚Anywhere‘ können Sie die Datei von Ihrer Klasse gehören müssen oder Verwenden Sie ein Autoload.

0

Sie können nicht in constants nicht skalare Werte speichern, aber Sie können Singleton pattern verwenden.

<?php 
class Singleton 
{ 
    /** 
    * @var Singleton The reference to *Singleton* instance of this class 
    */ 
    private static $validator; 

    /** 
    * Returns the *Singleton* instance of this class. 
    * 
    * @return Singleton The *Singleton* instance. 
    */ 
    public static function getValidator() 
    { 
     if (null === static::$validator) { 
      static::$validator = new Validator(); 
     } 

     return static::$validator; 
    } 

    /** 
    * Protected constructor to prevent creating a new instance of the 
    * *Singleton* via the `new` operator from outside of this class. 
    */ 
    protected function __construct() 
    { 
    } 

    /** 
    * Private clone method to prevent cloning of the instance of the 
    * *Singleton* instance. 
    * 
    * @return void 
    */ 
    private function __clone() 
    { 
    } 

    /** 
    * Private unserialize method to prevent unserializing of the *Singleton* 
    * instance. 
    * 
    * @return void 
    */ 
    private function __wakeup() 
    { 
    } 
} 
+0

Nicht sicher wer den Downvote gab - das ist die richtige Antwort. Genau dafür stehen Singletons. Die allgegenwärtige Verwendung eines "konstanten" Objekts (das es nicht wirklich ist) ist eine Datenbankverbindung. Sie möchten keine Verbindung zu Ihrer Datenbank in einem Dutzend verschiedener Klassen herstellen, also behalten Sie einen Singleton, der sich an Ihre DB-Verbindung erinnert. Caching ist ebenfalls üblich. –

+0

Zunächst ist dies nicht das Singleton-Muster, wie es in OOP bekannt ist (für mich ist das immer noch das von der GoF beschriebene). Ich würde das eher eine Instanzklasse oder eine triviale Anwendung des Factory-Musters nennen. Außerdem wird das Singleton-Muster oft als ein [Anti-Muster] (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) angesehen. Auch in diesem Fall benötige ich möglicherweise mehrere Validierungsinstanzen (Kontaktinformationen, Fluginformationen, Beschwerden usw.). Zusammengefasst: Das Fabrikmuster könnte zu einer besseren Antwort geführt haben ... –

+0

@JoshfromQaribou Ich bin derjenige, der für die Down-Vote verantwortlich ist. Meine Argumentation kann in meinem vorherigen Kommentar gefunden werden. Außerdem: Sie haben recht, eine Datenbank ist eines der wenigen Beispiele, bei denen Singletons sinnvoll sind. –