Pregunta

Al tratar de cambiarlo, lanzar una excepción.

¿Fue útil?

Solución

I suponga una solución, para propiedades de clase, sería:

  • no define una propiedad con el nombre que le interesa
  • utilizar el método __get mágica para el acceso de este inmueble, utilizando el nombre de "falso"
  • definir el método __set por lo que se produce una excepción al intentar establecer esa propiedad.
  • Sobrecarga , para más información sobre los métodos mágicos.

Para las variables, no creo que es posible tener una variable de sólo lectura para los que PHP lanzar una excepción cuando se está tratando de escribir en él.


Por ejemplo, considere esta pequeña clase:

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

instanciando la clase y tratando de leer la propiedad:

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

le dará el resultado esperado:

test

Mientras que intenta escribir en la propiedad:

$a->myVar = 10;

Le conseguirá una excepción:

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

Otros consejos

class test {
   const CANT_CHANGE_ME = 1;
}

y que se refieren como test::CANT_CHANGE_ME

Utilice una constante. Palabra clave const

Sé que esto es una vieja pregunta, pero la respuesta de PASCAL realmente me ayudó y yo quería añadir a ella un poco.

__ get () los incendios no sólo en las propiedades inexistentes, pero los "inaccesibles", así, por ejemplo, las protegidas. Esto hace que sea fácil hacer las propiedades de sólo lectura!

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 respuesta corta es que no se puede crear una variable miembro objeto de sólo lectura en PHP.

De hecho, la mayoría de los lenguajes orientados a objetos consideran que la falta de forma para exponer públicamente las variables miembro de todos modos ... (C # es el grande y feo excepción con su propiedad constructos).

Si desea una variable de clase, utilice la palabra clave const:

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

Esta variable se puede acceder a:

echo MyClass::myVariable;

Esta variable existirá en exactamente una versión sin importar la cantidad de diferentes objetos de tipo MyClass se crea, y en la mayoría de escenarios orientados a objetos que tiene poco o ningún uso.

Sin embargo, si usted quiere una variable de sólo lectura que puede tener valores diferentes para cada objeto, se debe utilizar una variable privada miembros y al método de acceso (k un captador):

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

La variable se establece en el constructor, y está siendo hecha de sólo lectura por no tener un colocador. Pero cada instancia de MyClass puede tener su propio valor para 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top