PHP OOP Kavramları (Değer Nesneleri / Veri Erişim Nesneleri)

2 Cevap php

Ben sadece daha önce ben bir usul şekilde PHP yapıyor, PHP OOP öğrenmeye başladım. Ben okuyordum this article ve ben çabuk bir kaç soru var,

  1. Değer nesneler için yapıcı sık nasıl tanımlanır? Parametresi olarak tüm "veri üyeleri" alır veya varsayılan kurucusuna sopa ve veri üyeleri almak / ayarlamak için mutator / accessor yöntemleri kullanmak biri olarak?

  2. Bu PHP OOP yapmaya başlamak aslında önerilen yolu nedir? Çünkü dürüst, kavramlar benim için biraz kafa karıştırıcı oldu makalesinde açıklanmıştır.

Şerefe

2 Cevap

Nesneler her zaman geçerli bir state olmalıdır. Bu nesne, her zaman (yöntemlerini) davranır ve bilgi (üye değişkenler) mantıklı olduğu içerdiği anlamına gelir. Bir kurucu amacı geçerli bir durumda nesne yaratmak için olduğunu.

Değer nesnelerin dikkate alınarak, yapıcı nesne mantıklı şekilde argümanlar az sayıda almalıdır. Bir RGB değeri nesne olsaydı kırmızı dize "maymun" ise Örneğin, bu uygulama mantıklı olur, yeşil NULL idi, ve mavi bir dizi oldu?

final class RGB {
    $r, $g, $b;
}

$mycolor = new RGB;

// NULL, what value of red is that supposed to be?
var_dump($mycolor->r);

// We are free to set these values too, even though they do not make sense.
$mycolor->r = 'monkey';
$mycolor->g = NULL;
$mycolor->b = array('foo', 'bar');

İşte bu nesne olmasını sağlar tam olarak ne olduğunu. $ MyColor geçerli bir durumda değil bir nesneye başvurur. Nasıl bir RGB nesnesi her üç değer, kırmızı, mavi ve yeşil vardır ve bunlar, 0 ile 255 arasındaki tüm sayılar olduğundan emin olabilirim?

final class RGB {

    private $r;
    private $g;
    private $b;

    public function __construct($r, $g, $b) {

        // are our arguments numbers?

        if (!is_numeric($r)) {
            throw new Exception('Value of red must be a number');
        }
        if (!is_numeric($g)) {
            throw new Exception('Value of green must be a number');
        }
        if (!is_numeric($b)) {
            throw new Exception('Value of blue must be a number');
        }

        // are our arguments within range 0-255?

        if ($r < 0 || $r > 255) {
            throw new Exception('Value of red must be 0-255');
        }
        if ($g < 0 || $g > 255) {
            throw new Exception('Value of green must be 0-255');
        }
        if ($b < 0 || $b > 255) {
            throw new Exception('Value of blue must be 0-255');
        }

        // our arguments are fine.

        $this->r = $r;
        $this->g = $g;
        $this->b = $b;

    }

    //*// Canadian support

    public function getColour() {

        return $this->getColor();

    }

    public function getColor() {

        return array($this->r, $this->g, $this->b);

    }

}

$mycolor = new RGB;  // error! missing three arguments
$mycolor->r = 'monkey'; // error! this field is private

// exception! the constructor complains about our values not being numbers
$mycolor2 = new RGB('monkey', NULL, array('foo', 'bar'));

// exception! the constructor complains our numbers are not in range
$mycolor3 = new RGB(300, 256, -10);

$mycolor4 = new RGB(255, 0, 0); // ahh... a nice shade of red
var_dump($mycolor4->getColor()); // we can read it out later when we need to

Lütfen yapıcı üç argüman gerektirir ve tüm üç 0 ile 255 arasında sayılardır sürece bir istisna atar, her zaman iyi değerler ile üye değişkenleri tanımlama olacaktır.

Ayrıca, kırmızı, mavi, yeşil ve üye değişkenler özel olduğundan emin olmalısınız. Aksi halde, kimse onlara istedikleri her şeyi yazabilirsiniz. Tabii ki, onlar özel, hiçbir kimse ya da onları okuyabilir. Bir salt okunur operasyonu oluşturmak için bizim için özel üye değişkenleri erişir getColor () yöntemini tanımlayabilirsiniz.

RGB nesnenin Bu sürümü her zaman geçerli bir devlet olacaktır.

Umarım bu OOP doğası üzerine biraz ışık tutuyor ve size gelen düşünmeye başlamak için bir yer verir.

  1. To build objects that act as neutral data containers I would use classic constructor __contruct() you can then use magic __get and __set to access properties. Another way in to inject data with db row object for instance , you can found more information on this by googling 'dependency injection'

  2. Sen bir ana sınıfı üzerinden en OOP dillerinde olarak başlayabilir, ancak web endişeleri için MVC yaygın olarak kullanılmaktadır.

Bir önceki cepten programlama deneyimi var mı?