Question

Lorsque vous essayez de le changer, lancer une exception.

Était-ce utile?

La solution

Je suppose que d'une solution, pour les propriétés de classe, serait:

  • définit pas une propriété avec le nom qui vous intéresse
  • utilisez la méthode magique __get pour accéder à cette propriété, en utilisant le nom de « faux »
  • définir la méthode de __set il jette une exception en essayant de définir cette propriété.
  • Voir Surcharge, pour plus d'informations sur les méthodes magiques.

Pour les variables, je ne pense pas qu'il est possible d'avoir une variable en lecture seule pour laquelle PHP va lancer une exception lorsque vous essayez d'écrire.


Par exemple, considérons cette petite classe:

class MyClass {
    protected $_data = array(
        'myVar' => 'test'
    );

    public function __get($name) {
        if (isset($this->_data[$name])) {
            return $this->_data[$name];
        } else {
            // non-existant property
            // => up to you to decide what to do
        }
    }

    public function __set($name, $value) {
        if ($name === 'myVar') {
            throw new Exception("not allowed : $name");
        } else {
            // => up to you to decide what to do
        }
    }
}

instancier la classe et en essayant de lire la propriété:

$a = new MyClass();
echo $a->myVar . '<br />';

Vous obtiendrez ainsi la sortie attendue:

test

Tout en essayant d'écrire à la propriété:

$a->myVar = 10;

Vous obtiendrez ainsi une exception:

Exception: not allowed : myVar in /.../temp.php on line 19

Autres conseils

class test {
   const CANT_CHANGE_ME = 1;
}

et vous vous référez comme test::CANT_CHANGE_ME

Utiliser une constante. Mots-clés const

Je sais que c'est une vieille question, mais la réponse de Pascal m'a vraiment aidé et je voulais ajouter un peu.

__ get () tire non seulement sur les propriétés non existantes, mais les « inaccessibles » et, par exemple celles qui sont protégées. Cela rend plus facile de faire des propriétés en lecture seule!

class MyClass {
    protected $this;
    protected $that;
    protected $theOther;

    public function __get( $name ) {
        if ( isset( $this->$name ) ) {
            return $this->$name;
        } else {
            throw new Exception( "Call to nonexistent '$name' property of MyClass class" );
            return false;
        }
    }

    public function __set( $name ) {
        if ( isset( $this->$name ) ) {
            throw new Exception( "Tried to set nonexistent '$name' property of MyClass class" );
            return false;
        } else {
            throw new Exception( "Tried to set read-only '$name' property of MyClass class" );
            return false;
        }
    }
}

La réponse courte est que vous ne pouvez pas créer une variable de membre d'objet en lecture seule en PHP.

En fait, la plupart des langages orientés objet considèrent la mauvaise forme d'exposer les variables membres du public de toute façon ... (C # étant la grande, exception laid avec ses biens-constructions).

Si vous voulez une variable de classe, utilisez le mot-clé const:

class MyClass {
    public const myVariable = 'x';
}

Cette variable est accessible:

echo MyClass::myVariable;

Cette variable existera exactement une seule version, peu importe le nombre d'objets différents de type MyClass que vous créez, et dans la plupart des scénarios orientés objet, il a peu à rien.

Si, toutefois, vous voulez une variable en lecture seule qui peut avoir des valeurs différentes par objet, vous devez utiliser une variable membre privée et une méthode accesseur (k un getter):

class MyClass {
    private $myVariable;
    public function getMyVariable() {
        return $this->myVariable;
    }
    public function __construct($myVar) {
        $this->myVariable = $myVar;
    }
}

La variable est définie dans le constructeur, et il est en cours en lecture seule par ne pas avoir un poseur. Mais chaque instance de MyClass peut avoir sa propre valeur pour myVariable.

$a = new MyClass(1);
$b = new MyClass(2);

echo $a->getMyVariable(); // 1
echo $b->getMyVariable(); // 2

$a->setMyVariable(3); // causes an error - the method doesn't exist
$a->myVariable = 3; // also error - the variable is private
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top