Конфигурация сайта абстрактного класса Php - PullRequest
2 голосов
/ 01 декабря 2009

У меня есть класс конфигурации, который является абстрактным классом. Я хотел бы настроить его так, чтобы он автоматически определял, на каком сервере находится сайт, и назначал соответствующие константы. Я получаю сообщение об ошибке в строке десять $this->hostName = $_SERVER['SERVER_NAME'];, ожидая `T_FUNCTION. Как правильно сделать это, и есть ли лучший способ сделать это? Вот первая часть моего класса

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;
    }

Ответы [ 4 ]

2 голосов
/ 01 декабря 2009

Абстрактный класс не должен позволять вам устанавливать личные данные (только унаследованный конкретный класс).

Кроме того, посмотрите на эту ссылку в stackoverflow для интересного обсуждения SERVER_NAME и HTTP_HOST

1 голос
/ 01 декабря 2009

То, как вы структурируете свой код, просто неверно. PHP допускает много сумасшедших вещей, но определение констант и вывод кода как части абстрактного класса не имеет никакого смысла с точки зрения ООП.

То, что вы, вероятно, хотите сделать, это иметь вспомогательный класс, который определяет параметры конфигурации на основе имени локального сервера. Для этого у вас есть пара вариантов:

Вариант 1) Создать обычный класс с помощью конструктора.

class Config {
   public $x; 
   public $y;

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

И используйте это так:

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

Вариант 2) Статический метод в абстрактном классе.

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;
   }
}

И используйте это так:

echo Config::getX();
1 голос
/ 01 декабря 2009

Вы должны обернуть весь этот код в конструктор или, что еще лучше, функцию с именем init() или что-то в этом роде. Затем, когда вы переопределяете init в дочерних классах, вы вызываете parent::init(). Вы хотели сделать этот класс статическим, а не абстрактным?

0 голосов
/ 01 декабря 2009

Вы не можете вывести что-то в классе, не объявив сначала метод это не удастся

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;
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...