2016-09-08 9 views
0

Ich habe eine abstrakte Klasse wie folgt aus: nurPHP instanceof und abstrakte Klasse

<?php 
abstract class NoCie { 
    const SC = 01; 
    const MTL = 02; 
    const LAV = 03; 
} 
?> 

Ich möchte testen, ob eine Variable $ x-Wert aus dieser abstrakten Klasse enthalten.

Für jetzt habe ich $ x instanceof NoCie verwendet, aber das funktioniert wahrscheinlich nicht, weil diese Klasse abstrakt ist und nicht instanziiert werden kann.

Hier ist der Code, den ich versuche zu validieren.

class CustomersTaxes 
{ 

    public $NoCie; 
    private $_file; 

    public function __construct($file) 
    { 
     $this->_file = $file; 
    } 

    public function CheckValidAndWrite() 
    { 
     $error = false; 

     //Numéro de compagnie 
     if (!($this->NoCie instanceof NoCie)) { 
      $error = true; 

     } 
    } 
} 

Hier ist mein Code, der diese Klasse instanziiert:

$t = new CustomersTaxes($_SERVER['DOCUMENT_ROOT'] . '/test.xlsx'); 
$t->NoCie = NoCie::SC; 
$t->NoClient = "d"; 
$t->CheckValidAndWrite(); 

Wie kann ich das tun?

+0

is_subclass_of http://php.net/manual/en/function.is-subclass-of.php – nerdlyist

+1

Was weisen Sie auf '$ this-> NoCie'? Du kannst es mit 'get_class()' überprüfen – martin

+1

Wo wird 'NoCie :: SC' deklariert? Ich sehe ein 'NoCie :: SCA', aber kein' NoCie :: SC'. –

Antwort

0

Ich denke, du verwirrst zwei Konzepte, aber vielleicht kann was du willst auf eine andere Weise erreicht werden. Das einzige, was mir gerade einfällt, ist die PHP-Methode type-hinting. Aber ich würde leicht umgestalten, wodurch die NoCie Eigenschaft geschützt wird, um nur von einem Getter und einem Setter manipuliert zu werden. Wie folgt aus:

class CustomersTaxes 
{ 

    private $NoCie; 
    private $_file; 

    public function __construct($file) 
    { 
     $this->_file = $file; 
    } 

    public function getNoCie() 
    { 
     return $this->NoCie; 
    } 

    public function setNoCie(NoCie $NoCie) 
    { 
     $this->NoCie = $NoCie::VALUE; 
    } 
} 

Sie immer noch eine Klasse benötigen, die die abstrakte verlängert man aber, sonst wird es nie funktionieren:

class SCA extends NoCie 
{ 

    const VALUE = '01'; 
} 

Da die NoCie Eigenschaft auf CustomersTaxes privat ist, müssen Sie setzen es ist ein bisschen anders:

$t = new CustomersTaxes($_SERVER['DOCUMENT_ROOT'] . '/test.xlsx'); 
$t->setNoCie(new SCA()); 
// ... 

Auf diese Weise können Sie sicherstellen, dass, wenn ein NoCie Eigenschaft festgelegt ist, wird es die Klasse Sie wollen. Keine Notwendigkeit zu validieren - wenn setNoCie durch einen ungültigen Wert ausgelöst wird, wird eine Ausnahme ausgelöst.

+0

Das ist eine nette Lösung, aber ich benutze Composer als Auto-Loader für meine Klasse und ist psr-4-konform. Also mit dieser Lösung muss ich eine Datei für jede Konstante in meiner abstrakten Klasse erstellen, um eine Klasse zu erstellen, die die abstrakte Klasse erweitert. Ich weiß nicht wirklich, ob es eine gute Möglichkeit ist, diesen Job zu machen. –

0

Ich habe einen anderen Weg gefunden, diesen Job ohne Typhinweis zu machen. Typ Hinting scheint ein guter Weg, aber müssen viele Dateien mit bsr-4 Autoloader arbeiten.

Meine Wahl ist, ReflectionClass zu verwenden, um alle als Array konstant zu erhalten und den Wert von $ this-> SC zu vergleichen.

$NoCieReflection = new \ReflectionClass('\\Ogasys\\Enum\\NoCie'); 
if (!in_array($this->NoCie, $NoCieReflection->getConstants())) { 
    $error = true; 
    array_push($msg, "# de compagnie invalide"); 
}