2011-12-07 13 views
7

¡Buenos días a todos!PHP: propiedad de lectura estática en la clase

Mi problema es: tengo que sobrecargar la obtención estándar y establecer las variables estáticas en la clase ... pero no se proporcionó dicha funcionalidad en php ... se solicitó en 2008 y aún no se implementó ... Lo mismo ocurre con readonly ...

Mi pregunta: ¿hay alguna manera de hacer que una propiedad estática sea accesible para leer desde el exterior, pero está protegida contra modificaciones?

echo aaa::$qwe; //<--- echoes value of $qwe 
aaa::$qwe = '666'; //<--- throws an error because variable is protected from modification 

No puedo usar const porque algunas variables contienen matrices.

¿Quizás hay algunas soluciones?

Sí, sé que puedo hacerlo como AAA :: get ('qwe'), pero eso no es bueno ...

+2

¿Por qué no sirve? – Artefacto

+0

Porque necesitaría cambiar 2mb de código base existente, y tampoco está limpio, además hay otras razones que no dependen de mí :) – NewProger

+1

¿Por qué no usar una constante de clase? ¿O la variable se modificará internamente? – mAu

Respuesta

1

Si el valor no cambia nunca, puede utilizar const lugar. De lo contrario, no hay manera de que cumpla con sus restricciones (salvo llamadas de función de enganche en PHP a través de una extensión, pero incluso entonces tendría que cambiar sus accesos de variable estática a llamadas a funciones; de lo contrario, tendría que parchar PHP).

Por supuesto, es muy dudoso que lo que hace su aplicación es un buen diseño. Confiar en cambiar las propiedades estáticas es más o menos lo mismo que depender de variables globales.

+0

Bueno, eso es con lo que tengo que vivir :) Base de código existente ... Y desafortunadamente no puedo usar const porque algunas variables almacenan matrices ... – NewProger

+1

Si el diseño permite tal cambio, puede guardar las matrices como CSV, o tal vez codificado en JSON: 'const $ qwe = '[" 666 "]' ' – KingCrunch

+0

¡Hm, esa es una idea realmente interesante! – NewProger

4

Respondiendo directamente a su pregunta: No, no puede marcar propiedades regulares como de solo lectura. Si desea establecer los tipos primitivos (excepto array), que nunca va a cambiar, se debe utilizar constantes

const QWE = '666'; 

que no funciona para los objetos y las matrices. Veo dos (digamos que) "soluciones"

  1. Uso Getter

    private $qwe; 
    public function getQwe() { return $this->qwe; } 
    protected function setQwe($value) { $this->qwe = $value; } 
    

    no me gustan mucho ("Las propiedades definen el estado, no el comportamiento, al igual que lo hacen los métodos") . Siempre obtienes el doble de métodos adicionales que las propiedades y si tienes muchas propiedades, esto explotará extremadamente tu clase. Sin embargo, es la única forma de implementar lo que desea lograr.

  2. Confíe en sus usuarios;) Comente su propiedad y diga algo como "Si cambia este valor, probablemente algo se romperá y es su propia culpa".

    /** 
    * QWE 
    * 
    * This property should be treatened as "readonly". If you change this value 
    * something scary will happen to you. 
    * 
    * @readonly 
    * @var string 
    */ 
    public $qwe = '666'; 
    

    No es genial, pero al menos se puede decir "te lo dije".

+0

Solo la opción 2 sería posible :) Pero dejar variables muy importantes como esa no es bueno :) – NewProger

+0

Confía en tus usuarios ... (Sigue leyendo)!?! (Espera un momento dahell Acabo de leer ??). . (Facepalm). ¡Ese señor es lo más divertido que he leído todo el día! – Sebastien

+0

@Sebastien No sé ... ¿cuál es la parte graciosa? ¿Sabes que con "usuarios" me refiero a otros desarrolladores y no a visitantes de la aplicación? Y sabes, que si "no son confiables" se dispararon a sí mismos. Nada de lo que tenga que preocuparse;) – KingCrunch

0

Esto es un poco más fácil:

class aaa{ 
private static $qwe='rty'; 
public static function qwe() { return self::$qwe; } 
} 

No permite cambios, y sigue siendo de fácil acceso:

aaa::$qwe = 'something'; // fails 
echo aaa::qwe(); // success 

Sé que no es lo ideal, pero se puede hacer un reemplazo todos

aaa::$qwe 

con

aaa::$qwe() 
+1

-1 No se puede usar '$ this' fuera del contexto del objeto. – Leri

+0

Gracias Leri, corrigió el primer fragmento de código de '$ this-> qwe;' a 'self :: $ qwe'. Por favor, vuelva a calificar mi respuesta si siente que es mejor. –

Cuestiones relacionadas