PHP statik sınıflar için yazma

3 Cevap php

Ben her yerde yapılandırma değişkenler erişmek için kullanabileceğiniz bir yapılandırma sınıfı var varsayarsak (Config::X).

Bu özellikleri ekler ve / veya değiştirir sınıfın dışında denebilecek bir işlevi uygulamak mümkün mü?

Böyle bir şey ben düşünüyorum budur:

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

I've seen something similiar in CakePHP but couldn't figure out the solution. My goal would be being able to write to the base Config class from different files, e.g.: store Database information in a separate file.

3 Cevap

Eğer statik değişkenler hendek ve yerine beton uygulamaları kullandığınız sürece ilk değişkenleri bildirmek olmadan bunu başaramaz. Eğer değişkenleri bildirmek yapmak bile ilk önce `$ kullanarak onları aramak gerekir:

class Config {

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

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

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

Eğer somut bir uygulama varsa o zaman __get and __set kaldıraç böylece tüm değişkenleri bildirmek zorunda değilsiniz.

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

Bu bir yere ihtiyacınız varsa config nesnenin etrafında geçmesi gerekir anlamına gelecektir. Bu rahatsız edici bulursanız dependency injection içine bakmak isteyebilirsiniz.

Eğer statik bir sınıfın değerlerini değiştiremezsiniz. Bu özelliğe sahip istiyorsanız, size sınıfının bir örneğini yapmak gerekir, ve sayfalar üzerinde kalıcı değerler gerekiyorsa o oturumda saklayın.

Sizin kod yazma işlevi .... daha önce yapılan görmedim $ isim adında yeni bir const kadar bağlamak yapmak gibi görünüyor.