2011-05-05 8 views
10

posiblemente relacionadas:
Why don't PHP attributes allow functions?¿Por qué no puede tener require * declaraciones en una definición de clase?

Perdón si esto se ha hecho antes, pero ¿por qué no tener algo como los siguientes:

class foo { 

require_once 'defines.php'; 

private $_server = DB_SERVER; 
private $_username = DB_USERNAME; 
private $_password = DB_PASSWORD; 
private $_database = DB_NAME; 
public $debug = false; 
public $_conn; 

function __construct() {       
    $connection = @mysqli_connect($this->_server, $this->_username, $this->_password, $this->_database); 
} 

... 

} 

Cheers,

EDITAR: Buscando averiguar por qué existe este comportamiento y por qué no es posible. ¿Cómo llegan los votos para cerrar?

Edit2: Desea, además, volver a abrir este

+1

Relacionado: [¿Por qué los atributos de PHP no permiten funciones?] (Http://stackoverflow.com/questions/3960323/why-dont-php-attributes-allow-functions) –

+0

Un modelo seguro, pero ese modelo debería ser capaz de tomar definiciones estáticas de otras fuentes para evitar la repetición ¿no es así? – barfoon

+0

Puedes ponerlo antes de la clase. – dqhendricks

Respuesta

5

Fue posible require y include archivos tanto dentro del ámbito de la función y el alcance global, antes de añadir a las clases PHP.

Esto es solo una suposición — No estoy seguro de qué otra cosa podríamos hacer aparte de que los diseñadores de idiomas vengan y nos cuenten su historia — pero imagino que se creía que no se obtendría ningún beneficio al agregar esta funcionalidad al "nuevo alcance" inventado por la adición de Clases, especialmente considerando la complejidad añadida al back-end para soportarlo.

Tampoco está del todo claro cuáles serían las reglas de alcance para las declaraciones realizadas dentro del archivo require d.

En conclusión, creo que está haciendo la pregunta incorrecta. En lugar de "¿por qué no se admite esto?" es más un caso de "¿por qué debería ser compatible?".

Espero que esto ayude de alguna manera pequeña.

+0

El alcance de 'clase 'no es ni' function', ni 'global' scope. Es posible usar declaraciones de inclusión hoy, como antes de que PHP implemente las clases. Nada cambió, excepto que llegó un nuevo concepto. – KingCrunch

+0

@KingCrunch: Eso es lo que dije. He editado mi respuesta con la esperanza de dejarlo más claro. –

2

Es porque en la definición de clase el código "real" no está permitido en absoluto, solo se permiten definiciones de propiedades, métodos y constantes. Puede poner sus declaraciones de inclusión en "ámbito principal" (procedimiento), funciones y métodos, como cualquier otro código.

class A { 
    var $a = 1 + 1; // Parse error: unexpected '+' 
} 

Sin embargo, hasta donde yo sé, no es compatible con ningún idioma. Por ejemplo java usa bloques de código estáticos para este

class A { 
    private static int a = 0; 
    static { 
    a = 1+1; 
    } 
} 

En PHP, simplemente coloque su código "estático" después de la clase misma.

class A {} 
/* static */ { 
    // do something 
} 

No es posible acceder a private o protectedstatic miembros de esta manera.

+0

Comprensible. Supongo que en ese momento la definición de "código real" entra en disputa.El argumento es que define y las constantes estáticas deben ser elegibles y no contienen ninguna lógica adicional por así decirlo. – barfoon

+3

Aunque es una analogía muy flexible, el ## include' de C++ (como una directiva de preprocesador) puede ir a cualquier parte, incluso dentro de una definición de clase. Me doy cuenta por supuesto que algunos de los contenidos del archivo incluido pueden no ser válidos allí. –

Cuestiones relacionadas