Запись в статические классы в PHP - PullRequest
2 голосов
/ 09 марта 2010

Предполагая, что у меня есть класс Config, который я использую для доступа к переменным конфигурации из любого места (Config::X).

Можно ли реализовать функцию, которая может вызываться извне класса, который добавляет и / или изменяет свойства?

Примерно так я и думаю:

class Config
{
    const myVar = 'blah';
    public static function write( $name, $value )
    {
        //....
    }
}
echo Config::myVar; // Clear

Config::write( 'test', 'foo' );
echo Config::test; // Should be foo

Я видел что-то похожее в CakePHP, но не смог найти решение. Моей целью было бы иметь возможность записи в базовый класс Config из разных файлов, например: хранить информацию базы данных в отдельном файле.

Ответы [ 3 ]

2 голосов
/ 09 марта 2010

Этого нельзя достичь, не объявив сначала переменные, если вы не отбросите статические переменные и не будете использовать конкретные реализации. Даже если вы сначала объявите переменные, вам придется вызывать их, используя `$:

class Config {

    const $myVar = 'blah';
    public static $test;

    public static function write( $name, $value )
    {
        //....
    }
}

Config::write( 'test', 'foo' );
echo Config::$test; // Will be foo

Если у вас есть конкретная реализация, вы можете использовать __ get и __set , поэтому вам не нужно объявлять все ваши переменные.

class Config {

    const $myVar = 'blah';

    private $vars = array();

    public function __set($name, $value) {
        $this->vars[$name] = $value;
    }

    public function __get($name) {
        if(isset($this->vars[$name]) 
            return $this->vars[$name];
         return null;
    }
}

echo Config::myVar; // Still the same

$config = new Config();
$config->test = 'foo';
echo $config->test; // Will be foo

Это будет означать, что вам нужно будет передать ваш конфигурационный объект, если он вам нужен где-то. Если вас это раздражает, возможно, вы захотите изучить внедрение зависимостей .

0 голосов
/ 09 марта 2010

Ваш код, кажется, заставляет функцию записи связывать новый const с именем $ name .... никогда не видел, что было сделано раньше.

0 голосов
/ 09 марта 2010

Вы не можете изменять значения статического класса. Если вы хотите иметь эту функциональность, вам нужно создать экземпляр класса и сохранить в нем сеанс, если вам нужно сохранить значения на страницах.

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