Stocker un objet dans une constante

Petit nouveau ! | 5 Messages

15 mars 2011, 20:47

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

ViPHP
ViPHP | 3607 Messages

15 mars 2011, 23:52

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 ;)

Petit nouveau ! | 5 Messages

16 mars 2011, 09:21

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 ?

ViPHP
xTG
ViPHP | 7331 Messages

16 mars 2011, 13:55

Si ta classe implémente un singleton c'est possible.

Petit nouveau ! | 5 Messages

16 mars 2011, 14:13

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

ViPHP
ViPHP | 3607 Messages

16 mars 2011, 14:19

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);

Petit nouveau ! | 5 Messages

16 mars 2011, 14:50

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 ?

ViPHP
ViPHP | 3607 Messages

16 mars 2011, 15:05

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);
 

Petit nouveau ! | 5 Messages

16 mars 2011, 17:38

merci a tous pour votre aide !

devlop78
Invité n'ayant pas de compte PHPfrance

20 mars 2011, 03:58

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.