Accéder à des attributs protégés depuis une méthode 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 : Accéder à des attributs protégés depuis une méthode statique

par Hywan » 20 juil. 2007, 19:05

Oh oui, ok. J'avais pas compris ça, désolé, je devais être à l'ouest :)

+1 pour Sékyltoyailtalala ;)

par Sékiltoyai » 20 juil. 2007, 15:42

@Genova : C'est comme ca, et ca marche pareil en java, dans toute classe, tu peux manipuler n'importe quel objet de cette classe. Les langages OO semblent réfléchir en terme de classe et non d'objet, c'est à dire que les visibilités ne sont pas sensées protéger les instances les unes des autres, mais les classes les unes des autres, car les objets sont gérées par les classes, donc le développeur fait ce qu'il veut de ses objets, s'il ne veut pas qu'ils se voient, il programme en conséquence.
Mais les classes ne sont pas forcément codées par le même développeur, et quand un développeur veut utiliser ton framework, il est quelquefois de bonne augure de lui interdire de toucher trop à ta classe, par la protection des méthodes et attributs.

Ca peut parître con en php, parce que le code est souvent lisible, et que souvent aussi, on développe l'application en comité restreint, mais je te rappele que php est très inspiré du java, surtout pour la POO, et en java, on en voit plus l'utilité, puisque tout est basé sur les classes, même les librairies natives, et un projet peut appeler beaucoup de librairies différentes, dont les fichiers sont fournis compilés, on voit mieux l'intérêt pour des développeurs de cacher les méthodes et attributs entre les classes, et non entre les objets...

par zeus » 20 juil. 2007, 15:26

Merci Genova ;)

Il m'arrive d'avoir du mal à expliquer clairement un soucis :gla:

par Genova » 20 juil. 2007, 15:08

Le problème de zeus est simple, t'as une classe :

Code : Tout sélectionner

class Toto { protected $variable; public static function titi() { $new_instance = new Toto; $new_instance->variable = 'valeur'; } }
et il se demande pourquoi on peut assigner une valeur à $new_instance->variable alors qu'il s'agit d'une propriété protégée.
Sachant que ce code ne marche que si on créé une instance de la classe en son sein (mais malgré le fait qu'elle soit en son sein, elle reste indépendante, et par conséquent les éléments protected ne devrait pas être accessible).

par Hywan » 20 juil. 2007, 15:00

Tes questions me font mal à la tête.

Déjà, tu as compris le code maintenant ? Il faut savoir ce qu'on cherche. J'ai l'impression qu'on ne cherche pas la même chose :?
Par contre, je ne vois pas l'intérêt de pouvoir accéder à un attribut non statique d'une instance de la classe dans une méthode statique de cette même classe.
Je tente de traduire.
Tu ne vois pas l'intérêt de faire $object->proprety dans une méthode statique de cette même classe. Donc $object, peut être $this (sauf certain cas). Hmm. Moi, j'y vois un intérêt, ce serait une récursivité dans les objets, avec les instances dans une propriété statique ou non statique d'ailleurs.

Est-ce que tu pourrais mettre un exemple plus parlant ? Je suis un peu perdu.

Je dois partir, j'ai un truc important à faire. Je continue à regarder ton code ce soir :) (mais les autres peuvent participer ;-)).

par zeus » 20 juil. 2007, 14:51

J'ai mal compris ton code ...

Tu passes par un attribut statique, donc partager par toutes les instances de la classe, comme en Java et en C++.

Par contre, je ne vois pas l'intérêt de pouvoir accéder à un attribut non statique d'une instance de la classe dans une méthode statique de cette même classe.

par Hywan » 20 juil. 2007, 14:46

Je ne connais ni Java ni C++ ^^ Enfin, j'ai un niveau scolaire.

Mais j'ai appris le design pattern dans un livre pour Java, donc ça doit exister. Attends je regarde dan mon livre ... En fait, la syntaxe est la même, et on apelle ça le design pattern Singleton, ou aussi un objet unique.
Le pattern Singleton garandit qu'une classe n'a qu'une seule instance et fournit un point d'accès global à cette instance.
(chez O'Reilly)

Je ne vois pas ce que tu veux savoir de plus ?

par zeus » 20 juil. 2007, 14:41

Si ce que tu cherches à me dire c'est que c'est ce comportement qui permet la création de singleton, quel est le principe équivalent en Java ou C++ ?

par Hywan » 20 juil. 2007, 14:35

Le singleton est extrêmement pratique en fait.
Dans certain cas, ton objet ne doit être instancier qu'une seule et unique fois !

Par exemple, je travaille sur un MVC en ce moment. J'ai une classe qui se charge de dispatcher mes objets etc. Si mon objet est instancier plusieurs fois, on aura des soucis dans le dispatchage des objets. Donc on ne l'instancie qu'une seule et unique fois. Ca peut être utile aussi pour des connexions vers des tables etc.

Un petit exemple :
<?php

class Singleton {

    private static $_instance = null;

    private function __construct ( ) {

        // on lance les instructions qui n'ont besoin d'être faite qu'une
        // seule et unique fois !
    }

    public static function getInstance ( ) {

        if(null === self::$_instance)
            self::$_instance = new self();

        return self::$_instance;
    }
}

// on veut l'instance :
$singleton = Singleton::getInstance();
// on fait des opérations, des appels de méthodes etc.
// et si plus tard dans le code, on veut réavoir l'instance, on fait :
$singleton = Singleton::getInstance();

// l'objet ne sera pas recréé, mais l'instance sera retournée.
Edit : j'ai validé mon message sans faire exprès pour le précédent ... désolé.

par Hywan » 20 juil. 2007, 14:29

Tu parles du singleton là ? :P

par zeus » 20 juil. 2007, 14:20

@Hubert : Effectivement, j'ai essayé d'alléger au maximum et je suis allé trop loin :oops:
La méthode get_db_statut() retourne l'instance de Statut qu'elle a instanciée. Je corrige mon code d'origine. Désolé :?

@Genova : je ne savais pas, je prend note, merci

@HyWaN : Tu as un exemple très allégé de ce que fait cette méthode. Dans celle d'origine, il est très intéressant de ne pas instancier l'objet ;)
Cyrano et Genova sont très proche de ce que fait la classe.

En fait, ma question ne porte pas tellement sur "est-ce que c'est possible ?", puisque j'ai découvert que ça l'était, mais plutôt "Quel est l'utilité ?", surtout que c'est un comportement propre à PHP qui est impossible en C++ ou en Java :?

par Hywan » 20 juil. 2007, 14:05

@Cyrano : Oui je suis au courant. Mais dans son cas c'est inutile, du moins, avec le code présenté.

Mais tu as raison de le souligner :)

par Genova » 20 juil. 2007, 14:04

Idem pour le design pattern factory : http://www.journaldunet.com/developpeur ... ry-2.shtml assez pratique d'ailleurs ;)

par Cyrano » 20 juil. 2007, 13:59

Donc déclarer une méthode statique, pour instancier son objet est un peu bête :P
Pas obligatoirement : c'est comme ça qu'on crée un singleton, on crée un constructeur privé et une méthode statique de récupération d'instance de classe.

par Hywan » 20 juil. 2007, 13:53

Salut :)

Si on peut déclarer des méthodes en statique, c'est pour nous permettre de ne pas instancier. Donc déclarer une méthode statique, pour instancier son objet est un peu bête :P

J'aurais plutôt vue ça comme ça :
<?php

header('content-type: text/plain');

class StatusA {

    protected static $code    = null;
    protected static $message = null;

    public static function get_db_status ( ) {

        self::$code    = 'Mon code';
        self::$message = 'Mon message';

        return array(
            self::$code,
            self::$message);
    }
}

$status = StatusA::get_db_status();
print_r($status);

// ou

class StatusB {

    public static $code    = null;
    public static $message = null;

    public static function get_db_status ( ) {

        self::$code    = 'Mon code';
        self::$message = 'Mon message';
    }
}

StatusB::get_db_status();
echo StatusB::$code     . "\n" .
     StatusB::$message  . "\n\n";

StatusB::$code    = 'Autre code';
StatusB::$message = 'Autre message';
echo StatusB::$code     . "\n" .
     StatusB::$message  . "\n";
Tu remarques les différents types pour les propriétés (public et protected).

Affichera donc :

Code : Tout sélectionner

Array ( [0] => Mon code [1] => Mon message ) Mon code Mon message Autre code Autre message
:)