__ get () ve __ seti () sihirli için noktayı php

3 Cevap php

PHP 5 sihirli yöntem __ get () ve __ set () tanıttı. Benim anlayış, her üyenin alıcı ve ayarlayıcı yazmak zorunda için bir kısayol;

 <?php
class Person {
    private $firstname;
    private $lastname;

    function __set($var, $name) {
        $this->$var = $name;
    }

    function __get($var) {
        return $this->$var;
    }
}

$person = new Person();
$person->firstname = "Tom";
$person->lastname = "Brady";


echo $person->firstname . " " . $person->lastname;

// print: Tom Brady
?>

Benim soru bu sadece üye değişkenler kamu yapmak gibidir, olduğunu.

class Person {
    public $firstname;
    public $lastname;
}

Bu OOP ilkelerine aykırı değil midir? Ve ne anlamı var?

3 Cevap

Sizin örnekte, onları kamu yapma gibi aynı şey olurdu. Ancak, __ set ve __get işlevleri tüm değişkenleri işlemek zorunda değilsiniz. (Belki işlemek istediğiniz karar vermek için bir switch deyimi kullanarak.) Ayrıca, __ ayarlamak için parametreleri veri doğrulama gerçekleştirmek ya da hiç var olmayan bir __ get için bir geri dönüş değeri hesaplayabilir.

Sadece (ben doğru çalışması için kodu için tasarlanmıştır düşünüyorum ne olduğunu) yerine kodunuzda $ this-> $ var $ this-> var kullanarak fark ettim

Something to be understood is that "OOP principles" aren't sent in stone. They are more like rules of thumb.

Yani, örneğin Python tüm üye değişkenler halka açıktır. Hiçbir gerçek özel değişkenler vardır.

Smalltalk'daki tüm değişkenler özeldir Eğer bir alıcı gereken bir değişkene erişim sağlamak istiyorsanız, hiçbir kamu değişkenler vardır. Alıcılar ve ayarlayıcıları uygulama kökenli nerede burada aslında bir meselesidir.

So the magic getters and setters in php can be useful on many circumstances. For example:

  • ORMappers
  • Eğer harici bir API göndermek için bir nesne oluştururken
  • Tanımlamak istediğiniz zaman birisi bir değişken erişilebilir.
  • vb

Now if you want to keep private variables and still use magic getters and setters again for the specific case of your application you could modify your code to use the '_' underscore convention for private variables.

<?php
class Person {
    private $_firstname;
    private $_lastname;

    function __set($name, $value) {
        if (!strpos('_', $name) === 0) {
            $this->$name = $value;
        } else {
            throw new Exception ("trying to assign a private variable");
        }
    }

    function __get($name) {
        if (!strpos('_', $name) === 0) {
            retrun $this->$name;
        } else {
            throw new Exception ("trying to read a private variable");
        }
    }
}

?>

Her şeyden önce, sizin örnek erişen çünkü çalışmak $this->var. Olmamalı

İkincisi: Evet, sihirli belirleyiciler ve alıcılar ekleyerek belirleyiciler ve alıcılar eklemeye benzer. Sadece büyü.

__ Set ve __ için kullanımları vardır olsun: Böyle bir ORM gibi bir kütüphane inşa edildi, eğer kullanışlı gelebilir. Ayrıca, bir yoksul adamın özellikleri olarak kullanılabilir: Eğer başlangıçta bir alan kamu yapmıştı eğer her zaman olduğu gibi, şimdi (doğrulama örneğin), __ set davranış ekleyebilir ve __ alabilirsiniz.