PHP устанавливает текущую директорию в константу класса - PullRequest
2 голосов
/ 02 декабря 2009

У меня есть файл конфигурации в корневом каталоге моего проекта, который содержит класс констант, которые зависят от конкретной среды. Проблема у меня заключается в том, как установить текущий каталог в качестве ROOT var. Что-то с эффектом:

Class Config {
  const ROOT = dirname(__FILE__);
}

Это невозможно, так как это постоянное выражение. Я также пытался изменить его для каждой сделки, например:

Class Config {
  const ROOT = '/old/path';
  public function __construct(){ $this->ROOT = '/new/path'; echo $this->ROOT; }
}
$config = new Config;

Кажется, это работает, но для этого нужно передать $ config между всеми моими классами. Кто-нибудь нашел взломать вокруг этого?

(Кроме того, я пока не на php5.3, поэтому __DIR__ не будет работать).

Ответы [ 3 ]

4 голосов
/ 02 декабря 2009

Сделать статическую функцию, которая инициализируется при первом вызове:

class Conf {

 static protected $_root= null;

 static public function root() {
  if (is_null(self::$_root)) self::$_root= dirname(__FILE__);
  return self::$_root;
 }

}

Это позволяет вам установить root в классе и защитить значение root от перезаписи.

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

Вы можете использовать свойство static вместо константы, подобной этой:

Class Config {
    public static $ROOT = ''; // Can't call dirname yet
}
Config::$ROOT = dirname( __FILE__ ); // Now we can set it

И затем вы можете позвонить в любое место (при условии, что ваш конфигурационный файл включен), например:

Config::$ROOT
0 голосов
/ 19 августа 2015

Я копаю эту проблему, потому что я нашел другое решение в другом проекте. В проекте уже использовалась константа, поэтому я не мог изменить все вызовы на константу Config::ROOT.

Решение было таким:

<?php
// classes/Config.php
eval('class Config { const ROOT = "'.dirname(__FILE__).'"; }');

Это очень уродливо, но в этом случае это сработало.

...