Magic __ PHP statik özellikleri için getter olsun

3 Cevap php
public static function __get($value)

çalışmak, ve yaptım bile, o yüzden zaten sihirli gerektiğini olur değil __ aynı sınıfta örnek özellikleri için getter olsun.

Bu muhtemelen mümkün, evet veya hayır soru, öyle mi?

3 Cevap

Hayır, bu mümkün değildir.

Alıntı manual page of __get:

Member overloading only works in object context. These magic methods will not be triggered in static context. Therefore these methods can not be declared static.


In PHP 5.3, __callStatic has been added ; but there is no __getStatic nor __setStatic yet ; even if the idea of having/coding them often comes back on the php internals@ mailling-list.

There is even a Request for Comments: Static classes for PHP
But, still, not implemented (yet ? )

Belki birisi hala bu gerekir:

static public function __callStatic($method, $args) {

  if (preg_match('/^([gs]et)([A-Z])(.*)$/', $method, $match)) {
    $reflector = new \ReflectionClass(__CLASS__);
    $property = strtolower($match[2]). $match[3];
    if ($reflector->hasProperty($property)) {
      $property = $reflector->getProperty($property);
      switch($match[1]) {
        case 'get': return $property->getValue();
        case 'set': return $property->setValue($args[0]);
      }     
    } else throw new InvalidArgumentException("Property {$property} doesn't exist");
  }
}

Çok güzel mbrzuchalski. Ama sadece kamu değişkenler üzerinde çalışmak gibi görünüyor. Sadece özel / korumalı olanları erişmek için izin vermek için bu için anahtarı değiştirin:

switch($match[1]) {
   case 'get': return self::${$property->name};
   case 'set': return self::${$property->name} = $args[0];
}

Ve muhtemelen erişilebilir değişkenleri sınırlamak için, ya da başka özel ya da korumalı olan amacı yenilgi olacaktır if deyimini değiştirmek isterdim.

if ($reflector->hasProperty($property) && in_array($property, array("allowedBVariable1", "allowedVariable2"))) {...)

Yani, örneğin, ben bir ssh armut modülünü kullanarak uzak bir sunucu üzerinden benim için çeşitli veri çekmek için tasarlanmış bir sınıf var ve ben buna bakmak soruluyor ne sunucu dayalı hedef dizin hakkında bazı varsayımlar yapmak istiyorum. Mbrzuchalski metodunun bir tweaked versiyonu bunun için idealdir.

static public function __callStatic($method, $args) {
    if (preg_match('/^([gs]et)([A-Z])(.*)$/', $method, $match)) {
        $reflector = new \ReflectionClass(__CLASS__);
        $property = strtolower($match[2]). $match[3];
        if ($reflector->hasProperty($property)) {
            if ($property == "server") {
                $property = $reflector->getProperty($property);
                switch($match[1]) {
                    case 'set':
                        self::${$property->name} = $args[0];
                        if ($args[0] == "server1") self::$targetDir = "/mnt/source/";
                        elseif($args[0] == "server2") self::$targetDir = "/source/";
                        else self::$targetDir = "/";
                    case 'get': return self::${$property->name};
                }
            } else throw new InvalidArgumentException("Property {$property} is not publicly accessible.");
        } else throw new InvalidArgumentException("Property {$property} doesn't exist.");
    }
}