Initialisation statique

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Initialisation statique

Re: Initialisation statique

par devlop78 » 13 oct. 2010, 20:55

D'ailleurs, pour continuer dans ces vives discutions ^^, l'interface Iterator modifie le comportement d'un foreach face à l'objet. C'est presque magique ^^. C'est un début d'indexeur, mais ma question n'est pas là. Peut-on obliger une classe fille à appeler la méthode parente lors de la surcharge de méthodes (pour éviter un "override" complet ^^).

Par exemple, ma classe Graph possède des propriétés dont la valeur est déterminée dans __construct(). Si une classe hérite de Graph mais qu'elle ne fait pas parent::__construct(), ça pert de son sens et ça risque de planter (notamment pour les propriétés qui sont des instances (vous savez ... mon ColorGraph ...)). ??

Re: Initialisation statique

par xTG » 13 oct. 2010, 20:29

Bah ce que j'essayais de traduire c'était mon incompréhension quant à la possibilité d'appeler avec succès une méthode non statique alors qu'aucune instance de l'objet existe. :/
De ce fait j'étais parti du principe de compréhension que la méthode de construction de l'objet est forcement statique.

Re: Initialisation statique

par devlop78 » 13 oct. 2010, 19:48

D'ailleurs, j'avais déjà lu ça :

Comme n'importe quelle autre variable PHP statique, les propriétés statiques ne peuvent être initialisées qu'en utilisant un litéral ou une constante; les expressions ne sont pas permises. Ainsi, vous pouvez initialiser une propriété statique avec un entier ou un tableau, mais ni avec une autre variable, ni avec une valeur de retour, ni avec un objet.

Et c'est bien là le problème ... maintenant, peut-être que tous les langages utilise un code qui va modifier ces variables. Je fais surtout référence à l'utilisation de Color.red en C# qui renvoit une instance de Color. Comment le peut-il ... en php, je n'ai même pas trouver d'équivalent de __get pour les statiques ...

Re: Initialisation statique

par devlop78 » 13 oct. 2010, 19:43

Ce que je voulais dire stealth35 c'est qu'un constructeur qui n'est pas statique ne peut dans l'optique être appelé vu que l'objet n'est pas créé et que c'est le constructeur qui le créé.
Donc si aucun objet créé mais qu'on veut en créé un il faut forcement appeler une procédure qui doit être accessible sans objet, il serait anti-objet d'en faire une externe à une classe donc il faut une méthode statique à l'intérieur de la classe.
J'ai rien compris. Il est possible que dans certains langages (les mêmes que je peux citer JAVA ou C#), il y ait un constructeur statique et un "normal". On peut aussi considérer, et c'est "logique", que le constructeur statique est tout simplement la lecture par php de l'ensemble de la classe, qui crée ainsi les propriétés et les méthodes. Cependant, le constructeur __construct n'est appelé que lors de l'instanciation de la classe, et après toute définition de propriété et méthodes. Sinon, on ne pourrait pas avoir accès aux propriétés et méthodes avant ... Bref, en dehors du détail extrême entre la définition d'interprétation de code, de chargement de classe, de constructeur statique, de constructeur, et tout, il y a bien une réalité : je ne peux pas mettre :

private $machin = new monObjet();

Tout comme $this se veut très peut flexible (impossible de le transmettre en paramètre, par exemple dans une fonction anonyme).

Re: Initialisation statique

par xTG » 13 oct. 2010, 08:35

Ce que je voulais dire stealth35 c'est qu'un constructeur qui n'est pas statique ne peut dans l'optique être appelé vu que l'objet n'est pas créé et que c'est le constructeur qui le créé.
Donc si aucun objet créé mais qu'on veut en créé un il faut forcement appeler une procédure qui doit être accessible sans objet, il serait anti-objet d'en faire une externe à une classe donc il faut une méthode statique à l'intérieur de la classe.

Re: Initialisation statique

par stealth35 » 12 oct. 2010, 23:48

D'ailleurs, quand on fait un code JAVA, la méthode qui porte le nom de la classe et qui est en statique, c'est une sorte de contrcuteur statique ... non ? Ou c'est valable que pour la classe initiatrice ? A voir ... +1 pour JAVA ;)
c'etait comme ca en php 4 :wink:
Comment un constructeur pourrait-il être autre chose que static. ^_-
En PHP c'est omis dans l'écriture mais au niveau du code je suis prêt à mettre ma main au feu que c'est géré comme pour les méthodes statiques.
non justement c'est l'inverse c'est le but du statique chaque méthode est indépendante
class Test
{
    public function __construct()
    {
        echo  __METHOD__;
    }
    
    public static function blabla()
    {
        echo  __METHOD__;
    }
}

Test::blabla();

$test = new Test();
$test->blabla();

Re: Initialisation statique

par xTG » 12 oct. 2010, 19:55

Comment un constructeur pourrait-il être autre chose que static. ^_-
En PHP c'est omis dans l'écriture mais au niveau du code je suis prêt à mettre ma main au feu que c'est géré comme pour les méthodes statiques.

Re: Initialisation statique

par devlop78 » 12 oct. 2010, 19:45

C'est un problème que se passe pour toutes les propriétés aussi. J'avais une propriété dans mon BattonGraph qui était "color" et je voulais que ce soit un ColorGraph .. j'ai faire appel à ColorGraph dans la méthode constructeur ... En sachant que Php va m'obliger à metter un setteur qui controlera le typage de la variable à modifier en fonction de son typage actuel, tout descendant de la classe qui oublie de mettre parent::__construct() se retrouve avec la possibilité de mettre de l'integer ou du string dans la variable color qui doit absolument être de type ColorGraph.

Bref, j'essaie de faire un pseudo code full object avec Php, j'y arrive à moitié (les indexeurs j'ai pu me démerder avec Implément Iterator, etc) mais là ...

D'ailleurs, quand on fait un code JAVA, la méthode qui porte le nom de la classe et qui est en statique, c'est une sorte de contrcuteur statique ... non ? Ou c'est valable que pour la classe initiatrice ? A voir ... +1 pour JAVA ;)

Re: Initialisation statique

par stealth35 » 12 oct. 2010, 13:34

oui c'est vrai tu peux pas faire ca, en même temps c'est logique, une constante c'est une constante...
ca falloir la définir méthode
public static function rouge()
{
    return ColorGraph::rgb(255,0,0);
}

Re: Initialisation statique

par devlop78 » 12 oct. 2010, 13:01

Tu penses, si j'ai posé la question ...

<?php

class bash {

const MA_CONST = bash::belier();

static function belier () {
return true;
}

}

?>

retourne ....

Parse error: parse error, expecting `','' or `';'' in C:\Users\Administrateur\Desktop\www\test.php on line 5

Re: Initialisation statique

par stealth35 » 12 oct. 2010, 10:50

c'est pareil
const ROUGE = ColorGraph::rgb(255,0,0);

Re: Initialisation statique

par devlop78 » 12 oct. 2010, 10:49

????

Je veux une constante de classe

class machin {
const ...
}

Re: Initialisation statique

par stealth35 » 12 oct. 2010, 10:44

tu mélanges tout la

si tu veux une constante
define('ROUGE', ColorGraph::rgb(255,0,0));

Initialisation statique

par devlop78 » 12 oct. 2010, 10:35

Bonjour,

J'ai une classe ColorGraph qui possède des méthodes statiques renvoyant une instance de ColorGraph. Par exemple je peux faire ColorGraph::rgb(255,0,0); et il me renverra une instance ColorGraph "rouge".
Mais ... ça se fâche lorsque je souhaite créer des variables statiques ou mieux des constantes ...

public static $rouge = new ColorGraph(255,0,0); // N'en veut pas, il n'aime pas les instanciations au niveau des propriétés

Mais comment faire puisque ma classe en tant que statique ne va jamais s'instanciée ... puisque elle est statique. N'existe pas une méthode magique qui initie ces variables (ou constantes) à la lecture de la classe (par php), voire même une sorte de __get statique qui renvoie une valeur ??

Je n'ai pas spécialement envie de faire une classe d'initiation qui va lancer un truc ... ça fait crade quand même ... déjà que je passe mon temps à faire des contrôles de typage ...

Merci d'avance.