/ Ne zaman kullanmam gerekir mi __ construct (), __ (), __) (set ve __ call () PHP olsun?

10 Cevap php

10 Cevap

This page muhtemelen yararlı olacaktır. (Ne demek yanlış olduğunu unutmayın - __set() değişkenin adı ve değeri hem de bir parametre olarak alır __get() sadece değişkenin adını alır.).

__get() ve __set() değişkenler için genel erişim sağlamak istiyoruz kütüphane işlevleri yararlıdır. Bir ActiveRecord sınıfta Örneğin, insanlar nesne özellikleri gibi veritabanı alanlarını erişmek mümkün isteyebilirsiniz. Örneğin, Kohana PHP çerçevesinde kullanmak olabilir:

$user = ORM::factory('user', 1);
$email = $user->email_address;

Bu __get() ve __set() kullanılarak gerçekleştirilir.

Kullanırken benzer bir şey __call(), birisi getProperty () ve setProperty () çağırıyor algılamak ve buna göre işleyebilir yani yapılabilir.

__get (), __ () set ve __ call () PHP bunu biraz saçma olduğunu düşünüyorum bir lakap olduğunu "sihirli yöntemler" dediği - ı "kanca" biraz daha uygun olduğunu düşünüyorum. Her neyse, ben sapmak ...

Bunların amacı, are not nesne üzerinde tanımlanan DataMembers (özellikleri, ya da yöntem) "akıllı" değişken gizleme, mesaj gibi düşünen her türlü için kullanılabilecek, erişilen zaman için yürütme durumlarda sağlamaktır yönlendirme, vb

Bir maliyet Ancak, var - bu etrafında 10x tanımlanan DataMembers için bir çağrı daha yavaş çağıran bir çağrı.

__get ve __set çekirdek sınıfların özellikle yararlı olabilir yeniden tanımlanması. Eğer istemiyordu Örneğin config yanlışlıkla yazılmaz ama yine de ondan veri almak istiyorlardı:

class Example
{
    private $config = array('password' => 'pAsSwOrD');
    public function __get($name)
    {
        return $this->config[$name];
    }
}

Sihirli yöntemlerin bir başka yararlı uygulama, özellikle __get ve __set ve __toString şablonları. Sadece sihirli yöntemler kullanan basit bir adaptör yazarak şablon motoru kod bağımsız yapabilirsiniz. Eğer sadece sadece bu yöntemleri değiştirmek, başka bir şablon motoru taşımak istiyorum.

class View {

    public $templateFile;
    protected $properties = array();

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

    public function __get($property) {
        return @$this->properties[$property];
    }

    public function __toString() {
        require_once 'smarty/libs/Smarty.class.php';
        $smarty = new Smarty();
        $smarty->template_dir = 'view';
        $smarty->compile_dir = 'smarty/compile';
        $smarty->config_dir = 'smarty/config';
        $smarty->cache_dir = 'smarty/cache';
        foreach ($this->properties as $property => $value) {
            $smarty->assign($property, $value);
        }
        return $smarty->fetch($this->templateFile);
    }

}

Bu yaklaşımın gizli yararı yuva görüntüle birbiri içine nesneleri olabilir:

$index = new View();
$index->templateFile = 'index.tpl';

$topNav = new View();
$topNav->templateFile = 'topNav.tpl';

$index->topNav = $topNav;

Ve index.tpl olarak, yuvalama gibi görünüyor:

<html>
<head></head>
<body>
    {$topNav}
    Welcome to Foobar Corporation.
</body>
</html>

Tüm iç içe nesneleri görüntüleme kısa sürede size echo $index;, sinek (HTML kesin olmalıdır) dizeye dönüştürülür alır

Ben tasarım kodu için kötü olduğunu düşünüyorum. Eğer bilmek ve iyi bir tasarım yaparsanız o zaman kodundaki __set() ve __get() kullanmak gerekmez. Ayrıca kodu okuyan çok önemli olduğunu ve stüdyo ile (örneğin Zend studio), __set() kullanıyorsanız ve eğer __get() sizin sınıf özelliklerini göremiyorum.

PHP bize sorunlara neden olabilir hangi dinamik sınıf değişkenleri oluşturmak için olanak sağlar. Sen __ kümesi kullanmak ve __ .. bu davranışı kısıtlamak yöntemleri olsun aşağıdaki örnekte görebilirsiniz ...

class Person { 
      public $name;
      public function printProperties(){
       print_r(get_object_vars($this));
      }
}

$person = new Person();
$person->name = 'Jay'; //This is valid
$person->printProperties();
$person->age = '26';  //This shouldn't work...but it does 
$person->printProperties();

Size yukarıda önlemek için bunu yapabilirsiniz ..

public function __set($name, $value){
    $classVar = get_object_vars($this);
    if(in_array($name, $classVar)){
    $this->$name = $value;
    }
}

Bu yardımcı olur umarım ...

Onlar, "zeki" bir şeyler yapmak için konum.

Örneğin __set() kullanabilir ve __get() bir veritabanına konuşmak için. Sizin kod sonra olacaktır: $myObject->foo = "bar"; ve bu perde arkasında bir veritabanı kaydı güncelleme olabilir. Tabii ki bu konuda oldukça dikkatli olmak lazım ya da performans, "zeki" etrafında dolayısıyla tırnak muzdarip olabilir :)

Kolayca erişilebilir olmalıdır verileri içeren PHP nesneler ile çalışırken Overloading şekli özellikle yararlıdır. Varolmayan bir PROPERY erişirken __get() denir, __set() varolmayan bir özellik yazmaya çalışıyor ve var olmayan bir zaman __call() çağrıldığında denir yöntemi çağrılır.

Örneğin, yapılandırma yönetimi bir sınıf olan hayal:

class Config
{
    protected $_data = array();

    public function __set($key, $val)
    {
        $this->_data[$key] = $val;
    }

    public function __get($key)
    {
        return $this->_data[$key];
    }

    ...etc

}

This makes it a lot easier to read and write to the object, and gives you the change to use custom functionality when reading or writing to object. Example:

$config = new Config();
$config->foo = 'bar';

echo $config->foo; // returns 'bar'

Bunları kullanmak için iyi bir nedeni, bir kayıt sistemi (Ben Zend Framework Sicil veya yapılandırma sınıf IIRC olarak uygulayan düşünüyorum) açısından olacak, böylece gibi şeyler yapabilirsiniz

$conf = new Config();
$conf->parent->child->grandchild = 'foo';

: Bu özelliklerin her bir otomatik olarak oluşturulan Yapılandırma nesne, benzer bir şeydir

function __get($key) {
    return new Config($key);
}

$ Conf-> ebeveyn zaten varsa Açıkçası, __ get () yöntemi güzel bir hile çok yeni değişkenleri oluşturmak için bu kullanmak için, denilen olmaz.

Aklımda sadece alıntı ettik bu kod işlevselliği değil ayı, ben sadece örnek uğruna hızlı bir şekilde yazdı.

Muhtemelen temiz dünyada tasarım ama ben, yani bir sınıfta bir örnek değişkeni referans oldu bir sürü kod vardı bir durum vardı:

$obj->value = 'blah';
echo $obj->value;

Ben değeri değişken adını ve uygulanan __ () set ve __ get () gerekli değişiklikleri ile bu kadar ancak daha sonra, ben "değer" belirli şartlar altında ne zaman kuruldu özel bir şey yapmak istedim.

Kodun kalan farkı bilmiyordum.