2010-11-21 33 views
3

Je crée ma propre classe PHP. Je veux avoir des références constantes dans cette classe d'instances de cette classe, comme une énumération.Comment créer des tableaux const d'instances d'une classe, au sein de cette classe?

Je continue de recevoir 2 erreurs: 1. Constantes ne peuvent pas être tableaux 2. erreur d'analyse syntaxique à la ligne 11 (voir ci-dessous)

Quel est le problème? Puis-je sérieusement ne pas avoir un tableau constant? Je suis d'un milieu Java ...

Voici mon code:

class Suit { 
    const SUIT_NAMES = array("Club", "Diamond", "Heart", "Spade"); 
    const COLOURS = array("red", "black"); 

    const CLUB = new Suit("Club", "black");  // LINE 11 
    const DIAMOND = new Suit("Diamond", "red"); 
    const HEART = new Suit("Heart", "red"); 
    const SPADE = new Suit("Spade", "black"); 

    var $colour = ""; 
    var $name = ""; 

    function __construct($name, $colour) { 
     if (!in_array(self::SUIT_NAMES, $name)) { 
      throw new Exception("Suit Exception: invalid suit name."); 
     } 
     if (!in_array(self::COLOURS, $colour)) { 
      throw new Exception("Suit Exception: invalid colour."); 
     } 
     $this->name = $name; 
     $this->colour = $colour; 
    } 
} 
+0

me manque trop énumérations ... – SparK

Répondre

4

MISE À JOUR:

As of PHP 5.6 it's possible to define a const of type array.

Also as of PHP 7.1 it's possible to define constant visibility (before it would always be public).

RÉPONSE ORIGINAL:

Les tableaux et les objets ne peuvent pas être affectés à des constantes dans PHP. Le documentation dit qu'il doit être une "expression constante". Je ne sais pas s'ils définissent ce terme, mais ils notent qu'il exclut "une variable, une propriété, un résultat d'une opération mathématique ou un appel de fonction".

Il n'est pas surprenant que les appels de constructeurs ne soient pas autorisés non plus, et bien que array ne soit pas vraiment une fonction, c'est comme une "fonction".

Probablement, vous devrez faire un contourner comme ci-dessous. Nous utilisons private static au lieu des constantes réelles. Cela signifie que vous devez éviter manuellement de réattribuer, et devez fournir un getter (getClub, etc., avec un nom à vous) si nécessaire.

De plus, comme vous ne pouvez pas affecter un objet à un static, et que PHP n'a pas d'initialiseurs statiques, nous initialisons à la demande dans le constructeur.

Une question sans rapport est que vous avez in_array arrière

class Suit { 
    private static $CLUB, $DIAMOND, $HEART, $SPADE; 
    private static $SUIT_NAMES = array("Club", "Diamond", "Heart", "Spade"); 
    private static $COLOURS = array("red", "black"); 

    private static $initialized = false; 

    function __construct($name, $colour) { 
     if(!self::$initialized) 
     { 
      self::$CLUB = new Suit("Club", "black"); 
      self::$DIAMOND = new Suit("Diamond", "red"); 
      self::$HEART = new Suit("Heart", "red"); 
      self::$SPADE = new Suit("Spade", "black"); 
      self::$initialized = true; 
     } 

     if (!in_array($name, self::$SUIT_NAMES)) { 
      throw new Exception("Suit Exception: invalid suit name."); 
     } 
     if (!in_array($colour, self::$COLOURS)) { 
      throw new Exception("Suit Exception: invalid colour."); 
     } 
     $this->name = $name; 
     $this->colour = $colour; 
    } 
} 
+0

Y at-il un travail autour? Mon programme serait plutôt difficile sans cela: X Et ça n'a pas de sens pour moi de faire autrement ... Qu'en est-il de la statique? Même chose? – Lindz

+0

Très bien, merci pour votre aide! :) – Lindz