Page 1 sur 1

Stocker un objet dans une constante

Posté : 15 mars 2011, 20:47
par fredp006
Bonjour, encore un peu novice dans la prog objet PHP, j'ai un ptit soucis !
A l'instar d'autre langage comme le JAVA ou Javascript j'aimerais accéder a une constante qui contiendrai un Objet par exemple :

Class Color {
...
public static BLACK = new Color( 0,0,0 );
....
}

Pour utiliser cette syntaxe : $myObject->changeColor( Color::BLACK );

Si qqu à une idée, par avance merci

Re: Stocker un objet dans une constante

Posté : 15 mars 2011, 23:52
par jojolapine
Bonsoir,
Sur quoi est censé jouer la méthode changeColor() ?

Tu pourrais définir tes constantes de cette manière :
<?php

class Color {
    const BLACK = '#000000';
    const WHITE = '#ffffff';
}

$Obj->changeColor( Color::BLACK );
Tu pourrais aussi utiliser des attributs:
<?php

class Color {
    public $color_black = '#000000';
    public $color_white = '#ffffff';
}

class Foo extends Color {

    public function changeColor($color){
        echo $color;
    }
}
$Obj = new Foo();
$Obj->changeColor( $Obj->color_black );
Et il y a surement des tas d'autres manières de faire ;)

Re: Stocker un objet dans une constante

Posté : 16 mars 2011, 09:21
par fredp006
Je te remercie, lains en fait c'est simplement un exemple, rien n'est censé jouer sur quoi que ce soit pour l'instant si ce n'est que les methodes ou constructeurs prennent un OBJET de type Color et non une string ! de plus avec les methodes statiques de la classe Color je n epux pas accéder aux attributs de la classe ?

Re: Stocker un objet dans une constante

Posté : 16 mars 2011, 13:55
par xTG
Si ta classe implémente un singleton c'est possible.

Re: Stocker un objet dans une constante

Posté : 16 mars 2011, 14:13
par fredp006
Oui en fait je me suis peut-être mal exprimé #-o ! En fait ma classe objet :

class Objet{
function changeColor( Color $color ){
.......
}
}
Il faut donc que la méthode valide un Objet !

C'est pourquoi, l'intérêt de disposer d'éléments de type constante comme :

BLACK
ou
Color::BLACK

Ceci peut également utile pour plein d'autre chose !

En JAvascript par exemple :

Color.Black = new Color( 0,0,0 );

Merci en tout les cas pour vos réponses et celles à venir. :D

Re: Stocker un objet dans une constante

Posté : 16 mars 2011, 14:19
par jojolapine
Bon et bien alors il suffit de faire ceci:
<?php

class Color {

    private $_rgb = array('r'=>null,'g'=>null,'b'=>null);

    public function __construct($r,$g,$b){
        $this->_rgb = array('r'=>$r,'g'=>$g,'b'=>$b);
    }
}

class Objet{

    // couleur par défaut
    private $_color_instance = new Color(0,0,0);

    function changeColor( Color $color ){

        $this->_color_instance = $color;

        var_dump($color);
    }
}

$obj = new Objet();

var_dump($obj);

$obj->changeColor(new Color(55,55,55));

var_dump($obj);

Re: Stocker un objet dans une constante

Posté : 16 mars 2011, 14:50
par fredp006
Ok ,merci , je suis d'accord avec toi mais si je veux une couleur rouge définit par un code couleur imposé comme par exemple, il est plus clair de faire
$obj->changeColor( Color::RED_LIGHTER );
que :
$obj->changeCOlor( new Color( 228,15,31) );

C'est pourquoi, ma question était surtout de savoir si à l'instar d'autre langage Objet comme Java, C ou JavaScript on pouvait stocker une valeur explicite dans sa nomination (comme une constante) un objet ?

Re: Stocker un objet dans une constante

Posté : 16 mars 2011, 15:05
par jojolapine
Non, ça n'est pas possible:
La valeur de la constante ; seuls les scalaires et les valeurs NULL sont autorisées. Les valeurs scalaires sont les valeurs entier, nombre décimal, chaîne de caractères ou booléen. Il est techniquement possible de définir des constantes de type ressource, mais cela est fortement déconseillé, et peut causer des comportements inattendus.
tu peux par contre utiliser des valeurs intermédiaires, du genre:
<?php

class Color {

    const BLACK = 1;
    const WHITE = 2;

    private $_rgb = array('r'=>null,'g'=>null,'b'=>null);

    public function __construct($r,$g == null ,$b == null){

        if($g === null && $b === null){
            switch($r){
                case self::BLACK:
                    $r=0;$g=0;$b=0;
                break;
                case self::WHITE:
                    $r=255;$g=255;$b=255;
                break;
            }
        }

        $this->_rgb = array('r'=>$r,'g'=>$g,'b'=>$b);
    }
}

class Objet{

    // couleur par défaut
    private $_color_instance = new Color(Color::BLACK);

    function changeColor( Color $color ){

        $this->_color_instance = $color;

        var_dump($color);
    }
}

$obj = new Objet();

var_dump($obj);

$obj->changeColor(new Color(55,55,55));

var_dump($obj);

$obj->changeColor(new Color(Color::WHITE));

var_dump($obj);
 

Re: Stocker un objet dans une constante

Posté : 16 mars 2011, 17:38
par fredp006
merci a tous pour votre aide !

Re: Stocker un objet dans une constante

Posté : 20 mars 2011, 03:58
par devlop78
Perso, j'ai déjà créé une classe Color (mais moi en "copiant" sur C#.NET ...)

En gros :

class Color {

public static function BLACK () { return new Color (0,0,0); }

...

}

et donc au lieu de faire Color::BLACK je faisais Color::BLACK()

Php est en retard à ce niveau ... pareil,

private $_backGroundColor = new Color (0,0,0);

ne fonctionne pas car cela doit être scalaire. Il faut donc créer un constructeur qui construira les propriétés ... quitte à avoir des accidents en cas d'héritage avec une surcharge du constructeur sans appel de celui du parent.