2010-04-09 9 views
11

Quiero tener una variable de cadena para una clase PHP, que estaría disponible para todos los métodos.Variable de cadena constante de clase PHP que abarca varias líneas

Sin embargo, esta variable es bastante larga, por lo que quiero separarla en varias líneas.

Por ejemplo,

$variable = "line 1" . 
      "line 2" . 
      "line 3"; 

Pero sobre esto no funciona.

Intenté EOD, pero EOD no está permitido dentro de la clase. Y cuando lo declaro fuera de la clase, no puedo acceder a la variable desde dentro de la clase.

¿Cuál es la mejor manera?

+1

No veo ningún motivo por el que lo anterior no funcione. ¿Puedes publicar exactamente tu código? Gracias. –

+0

Seguramente puede abarcar variables en múltiples líneas, ¿puede publicar el código y exactamente cómo no funciona? –

+0

Puede acceder a variables fuera de la clase usando la palabra clave 'global' o la matriz superglobal' $ GLOBALS', por cierto. No lo recomiendo, por supuesto. – Zarel

Respuesta

10

Si está utilizando PHP> = 5.3, podría utilizar HEREDOC syntax declarar su cadena:

class MyClass { 
    public $str = <<<STR 
this is 
a long 
string 
STR; 

} 

$a = new MyClass(); 
var_dump($a->str); 

Pero esto:

  • sólo es posible con PHP> = 5.3
  • y la cadena no debe contener ninguna variable
    • esto es porque el valor de la cadena debe conocerse en tiempo de compilación
    • que, por cierto, explica por qué la concatenación, con ., no funcionará: se realiza en tiempo de ejecución.

Y otro inconveniente es que esto va a poner saltos de línea en la cadena - que podría, o no, ser algo malo.


Si está utilizando PHP < = 5.2:

No puede hacer eso; una solución podría ser para inicializar la cadena en su clase constructor:

class MyClass { 
    public $str; 
    public function __construct() { 
     $this->str = <<<STR 
this is 
a long 
string 
STR; 
    } 
} 

(misma no con saltos de línea)

O, aquí, se puede hacer cuerdas concatenaciones:

class MyClass { 
    public $str; 
    public function __construct() { 
     $this->str = 'this is' . 
        'a long' . 
        'string'; 
    } 
} 

(de esta manera, no hay líneas secundarias)


Si no, puede tener una cadena que está rodeado por comillas simples o dobles, y lo puso en varias líneas:

class MyClass { 
    public $str = "this is 
a long 
string"; 
} 

(Aquí, de nuevo, que tendrá nuevas líneas en la cadena resultante)

+1

_esto es porque el valor de la cadena debe conocerse en tiempo de compilación_ - incorrecto. – user187291

+0

@stereofrog http://fr2.php.net/manual/en/language.oop5.properties.php says * Esta declaración puede incluir una inicialización, pero esta inicialización debe ser un valor constante, es decir, debe poder para ser evaluado en tiempo de compilación * - ¿así que esto realmente está mal? –

+0

sí, el manual está equivocado sobre esto. – user187291

2
$var = "this is a really long variable and I'd rather have it " . 
"span over multiple lines for readability sake. God it's so hot in here " . 
"can someone turn on the A/C?"; 
echo $var; 

que da salida:

ésta es una variable muy largo y yo prefiero que se abarcan en varias líneas por causa legibilidad. Dios hace tanto calor aquí ¿alguien puede encender el aire acondicionado?

Lo que tiene ahora funciona usando el string concatenation operator. Si puede publicar más información sobre su problema, algún código o quizás una explicación adicional de , cómo no funciona. Más información lo llevará a una mejor respuesta.

+1

Esto funcionará para una variable dentro de un método; pero, ¿funcionará para una propiedad de clase? * (de lo que creo que se trata la pregunta) * –

+0

Hola, como dijo Martin, quería declarar la variable FUERA de la clase y luego acceder a ella dentro de un método. $ var = "line1". "línea2"; funciona si lo declaro dentro de una función, pero no si lo hago fuera. Ni siquiera me dejará. – ericbae

+0

Ah, que no lo he intentado, podría probarlo cuando regrese del trabajo, si es necesario. Pero parece que ya has encontrado una solución. –

0

Estoy usando PHP 5.5.9 y he encontrado un problema similar solo con las constantes class. Quiero usar una cadena tanto tiempo como una constante, pero no quiero:

  • muy largas líneas de código
  • nuevas líneas apareciendo en el texto en los puntos de quiebre
  • la propiedad de ser mutable
  • la propiedad a ser inaccesible fuera de la clase

Creo que la solución a este problema es algo que se hace mucho en el laravel 5 andamios y por qué se mantienen haciendo esto me tenía desconcertado hasta ahora. Lo que hacen es algo así como:

public static function getLongPropertyString() 
{ 
    return 'A a string that can be arbitrarily long and contain as ' . 
     'many breaks in the code as you want without line breaks ' . 
     'appearing in the resulting string.'; 
} 

Este método proporciona una cadena inmutable. No se obtiene estrictamente creando una variable protected/private con getters ya que aún se puede modificar internamente. Solo cambiando el código o anulando puede cambiar esta cadena. Otro profesional es que hacerlo estático permite una única "instancia" por clase.

Desafortunadamente, ahora su código sería Class::getProperty() en lugar de solo Class::property. Otro inconveniente es que la concatenación se realizará cada vez que llame a la función, pero dependiendo de cómo la use, ese costo es generalmente insignificante.

Sería genial si el compilador PHP fuera capaz de reconocer que la operación de concatenación solo en valores conocidos en tiempo de compilación puede ejecutarse en tiempo de compilación y el resultado puede ser sustituido (los seres más conocedores saben por qué es así) .

+0

Si no agrega un colocador y ningún método lo cambia, una variable privada también es inmutable a menos que cambie el código. Pero devolver la cadena desde un método _might_ da una intención más clara en cuanto a lo que estás haciendo. –

+0

Estoy de acuerdo. Acabo de recomendar este formulario, ya que no hay una forma implícita de cambiar la cadena sin anular el método intencionadamente o cambiar el texto en el interior, es decir, la única forma de cambiar la cadena es anular el método o cambiar el código dentro de él. En este sentido, su _closer_ es inmutable ya que hemos eliminado los medios involuntarios de modificarlo. – jeteon

Cuestiones relacionadas