Frage

Beim Versuch, es zu ändern, eine Ausnahme aus.

War es hilfreich?

Lösung

ich eine Lösung annehmen, für Klasseneigenschaften, wäre:

  • keine Eigenschaft mit dem Namen festlegen, dass Sie interessiert
  • verwenden, um die Magie __get Methode zuzugreifen, die Eigenschaft, mit dem „falschen“ namen
  • die __set Methode definieren, so dass es eine Ausnahme auslöst, wenn diese Eigenschaft zu setzen versuchen.
  • Siehe Overloading , um weitere Informationen zu magischen Methoden.

Für Variablen, ich glaube nicht, ist es möglich, eine schreibgeschützte Variable zu haben, für die PHP eine Ausnahme ausgelöst wird, wenn Sie schreiben, um es versuchen.


Betrachten wir zum Beispiel diese kleine Klasse:

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
        }
    }
}

Instanziierung der Klasse und versucht, die Eigenschaft zu lesen:

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

Werden Sie die erwartete Ausgabe:

test

Bei dem Versuch, die Immobilie zu schreiben:

$a->myVar = 10;

Wollen Sie eine Ausnahme erhalten:

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

Andere Tipps

class test {
   const CANT_CHANGE_ME = 1;
}

und Sie finden es als test::CANT_CHANGE_ME

eine Konstante verwenden. Stichwort const

Ich weiß, das ist eine alte Fragen, aber PASCAL Die Antwort hat mir wirklich geholfen, und ich wollte es ein wenig hinzuzufügen.

__ get () feuert nicht nur auf nicht vorhandenen Eigenschaften, aber „nicht zugänglich“ Einsen als auch, zum Beispiel geschützte. Dies macht es einfach schreibgeschützte Eigenschaften machen!

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

Die kurze Antwort ist, dass Sie nicht ein schreibgeschützte Objekt Membervariable in PHP erstellen.

In der Tat, die meisten objektorientierten Sprachen betrachten es als schlechte Form Variablen Mitglied öffentlich sowieso zu entlarven ... (C # ist die große, hässliche Ausnahme mit seinen Eigenschaft-Konstrukten).

Wenn Sie eine Klassenvariable möchten, verwenden Sie das const Stichwort:

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

Diese Variable kann zugegriffen werden:

echo MyClass::myVariable;

Diese Variable wird genau eine Version gibt es in unabhängig davon, wie viele verschiedenen Objekten des Typ MyClass Sie erstellen und in den meisten objektorientierten Szenarien hat es wenig bis gar keine Verwendung.

Wenn Sie jedoch wollen eine schreibgeschützte Variable, die unterschiedlichen Werte pro Objekt haben kann, sollten Sie eine private Variable verwenden und eine Zugriffsmethode (ak ein Getter):

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

Die Variable wird im Konstruktor festgelegt, und es wird gemacht wird schreibgeschützt, indem nicht eine Setter haben. Aber jede Instanz MyClass kann seinen eigenen Wert für myVariable hat.

$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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top