2012-04-19 19 views
43

PHP no permite¿Son posibles las constantes privadas en PHP?

class Foo 
{ 
    private const my_private_const; 

pero por supuesto permite

const my_const; 

Así que en constantes efectos son globales porque puedo acceder my_const cualquier lugar utilizando Foo::my_const

¿Hay una manera de hacer constantes privados ?

+8

si es un valor constante, ¿importaría si es privado o no? – hjpotter92

+0

puede definir las constantes de clase que pertenecen a una clase http://www.php.net/manual/en/language.oop5.constants.php – Hajo

+0

@Hajo - ¿cómo? const privado produce un error. –

Respuesta

35

La respuesta es un simple "no". PHP no es compatible con este concepto. Lo mejor que puede hacer es una variable private static en la clase, que no es tan buena, por supuesto, porque no es de solo lectura. Pero solo tienes que evitarlo.

Edición

Su pregunta me hizo pensar - esto es algo que nunca he intentado, pero podría funcionar. Dicho de otra manera, "esto no se ha probado". Pero dijo que quería una "constante privada" llamada FOO:

// "Constant" definitions 
private function __get($constName){ 
    // Null for non-defined "constants" 
    $val = null; 

    switch($constName){ 
     case 'FOO': 
      $val = 'MY CONSTANT UNCHANGEABLE VALUE'; 
      break; 
     case 'BAR': 
      $val = 'MY OTHER CONSTANT VALUE'; 
      break; 
    } 

    return $val; 
} 

Por supuesto, su sintaxis sería un poco extraño:

// Retrieve the "constant" 
$foo = $this->FOO; 

... pero al menos esto no funcionaría:

$this->FOO = 'illegal!'; 

Tal vez algo que vale la pena probar?

Saludos

+0

Esta es una sugerencia increíble ... Definitivamente la usaré. Gracias por compartir. Otra opción es hacer que todas las variables sean privadas y protegidas, y luego crear una función como esta para filtrar qué variables se pueden cambiar y cuáles son obligatorias para ser de solo lectura. ¡Mira esto que acabo de publicar! http://www.designersgate.com/blogs/?p=187 – raphie

+0

Cool, gracias por el asentimiento – Madbreaks

+0

Desafortunadamente, el getter privado mágico no funcionará ya que PHP quiere __get con visibilidad pública. – marcosdsanchez

6

una versión simplificada de la solución provisional @Madbreaks': escribir una función estática privada que devuelve el valor de su privado "constante":

private static function MY_CONSTANT() { 
    return "constant string"; 
} 

Uso:

public static function DoStuff() { 
    echo self::MY_CONSTANT(); 
} 
29

gente! PHP 7.1.0 has been released

Ahora es posible tener modificadores de visibilidad con constantes de clase.

<?php 
class Foo { 
    // As of PHP 7.1.0 
    public const BAR = 'bar'; 
    private const BAZ = 'baz'; 
} 
echo Foo::BAR, PHP_EOL; 
echo Foo::BAZ, PHP_EOL; 
?> 

salida del ejemplo anterior en PHP 7.1:

bar 

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in … 
0

También puede utilizar:

private static $foo; 

o

protected static $bar; 

Y dentro de la clase puede llamar . O bien por:

self::$foo 
$this::$foo 
CLASSNAME::$foo 
+1

Dado que esta es una pregunta bastante antigua, [PHP 7.1] (http://php.net/manual/en/language.oop5.constants.php) permite modificar la visibilidad de las constantes de clase. –

+0

me enfrentaba algunos problemas para acceder a la const privada. – Deepesh

Cuestiones relacionadas