2009-11-30 3 views
2

J'ai une classe config qui est une classe abstraite. Je voudrais le configurer afin qu'il détecte automatiquement quel serveur le site est allumé et puis assigne les constantes appropriées. J'obtiens une erreur sur la ligne dix $this->hostName = $_SERVER['SERVER_NAME']; en attendant `T_FUNCTION. Quelle est la bonne façon de procéder et existe-t-il une meilleure façon de procéder? Voici la première partie de ma classeConfiguration du site PHP classe abstraite

abstract class config{ 

public $hostName; 
public $hostSlices; 
public $domain; 
echo $_SERVER['SERVER_NAME']; 
//strips out the "www" from the server name but only if it has the name on it . 
$this->hostName = $_SERVER['SERVER_NAME']; 
$this->hostSlices = explode(".",$this->hostName); 
if($this->hostSlices[0]=="www"){array_shift($this->hostSlices);} 
$this->domain = join(".",$this->hostSlices); 

//depending on which domain is used, different config setup is used. 
switch ($this->domain){ 
    case "localhost":*/ 

    const HOST = "localhost";//would http://localhost/ work as well. In that case, then this and the SITE_ROOT could be the same variable and i would preferentially set them depending on the host that the site is on. 
    const USER = "root"; 
    const PWD = "xxxxxxx"; 
    const NAME = "hurunuitconz";//database name 

    //public $name = "hello from the config class";//you cannot access variables from an abstract class you should define constants and then the can be used anywhere 

###########Location of file groups######## 
    const SITE_ROOT = "http://localhost"; 
    const ADMIN_IMAGES = 'http://localhost/images/user_images/admin_images'; 

     break; 



    case "charles.hughs.natcoll.net.nz": 

    const HOST = "charles.hughs.natcoll.net.nz";//would http://localhost/ work as well. In that case, then this and the SITE_ROOT could be the same variable and i would preferentially set them depending on the host that the site is on. 
    const USER = "charles_andrew"; 
    const PWD = "xxxxxxx"; 
    const NAME = "charles_hurunuitconz";//database name 
###########Location of file groups######## 
    const SITE_ROOT = "http://charles.hughs.natcoll.net.nz/_Assignments/Industry/www";//this is just confusing the way natcoll makes us do this. 
    const ADMIN_IMAGES = 'http://charles.hughs.natcoll.net.nz/_Assignments/Industry/www/images/user_images/admin_images'; 

     break; 
    } 
+1

pourquoi utilisez-vous une classe abstraite? Pourquoi n'utilisez-vous pas un constructeur? –

Répondre

1

Vous devez envelopper tout ce code dans un constructeur ou mieux encore une fonction appelée init() ou somthing. Ensuite, lorsque vous surchargez init dans les classes enfants, vous appelez parent::init(). Vouliez-vous dire que cette classe était statique, pas abstraite?

2

Une classe abstraite ne doit pas vous permettre de définir des données privées (uniquement une classe concrète héritée).

Aussi, jetez un oeil à this link dans stackoverflow pour une discussion intéressante sur SERVER_NAME par rapport HTTP_HOST

0

Tu ne peux pas quelque chose de sortie dans une classe sans déclarer d'abord une méthode cette échouera

abstract class fo 
{ 
public $fo; 
echo $fo; 
} 

**but this will work** 

abstract class fo 
{ 
public $fo; 

public function __construct() 
{ 
    $this->fo = $_SERVER['SERVER_NAME']; 

} 

public function sayFo() 
{ 
    echo $this->fo; 
} 

} 
1

La façon dont vous structurez votre code n'est pas juste. PHP permet beaucoup de choses folles, mais définir des constantes et sortir du code en tant que partie d'une classe abstraite n'a aucun sens en termes de POO. Ce que vous avez probablement l'intention de faire est d'avoir une classe d'assistance qui définit les paramètres de configuration basés sur le nom du serveur local. Pour ce faire, vous disposez de deux options:

Option 1) Créez une classe régulière avec un constructeur.

class Config { 
    public $x; 
    public $y; 

    public function __construct() { 
     switch (...) { 
      $this->x = 2; 
      $this->y = 3; 
     } 
    } 
} 

Et l'utiliser comme ceci:

$config = new Config(); 
echo "Variable y: " . $config->y; 

Option 2) Méthode statique dans une classe abstraite.

abstract class Config { 
    public $boolInitialized = false; 

    public static function init() { 
     if (self::$boolInitialized) { 
      return; 
     } 

     self::$boolInitialized = true; 

     switch (...) { 
     self::$x = 1; 
     self::$y = 2; 
     } 
    } 

    public static function getX() { 
     self::init(); 
     return self::$x; 
    } 
} 

Et l'utiliser comme ceci:

echo Config::getX(); 
+0

Désolé im nouveau à ceci pourriez-vous donner un exemple avec la classe abstraite où vous permutez les constantes basées sur l'hôte. – andrew

Questions connexes