OOP ve PHP hakkında biraz karıştı

5 Cevap php

Ben çok önce usul tarzı ile programlanmış ve bu birkaç ay içinde ben OOP gitmeye karar verdik.

OOP ve PHP hakkında biraz karışık Im. Benim veritabanında Kategoriler tablosunu ve Sayfaları tablo var diyelim. Ben bir sayfa sınıf ve kategori sınıf yapmak istiyorum.

Ben kategori hakkında bilgi gösterdi sayfası olurdu ve kategoriye ait sayfaların bir listesi var olacağını söylüyorlar. Bunu nasıl OOP şekilde uygulamak istiyorsunuz?

Ben kategori sınıfı olan tüm sayfaları içeren yeni bir özellik (dizi) sahip olacağını düşündüm. Peki o zaman ben `konusunda kafam karıştı kısım geliyor. Ben veritabanından doğru categoryID tüm sayfaları almak istiyorum ve ben bir Page-nesne olarak tüm satırları örneğini gereken bir yöntem var mıdır?

Yoksa Sayfalar-sınıfında Kategori sınıf ve getAllPages-yöntemi ve ben Kategori-sınıfa tüm sayfaları ayarlamak olacağını yöntemi ile bir setPages-yöntem olmalıdır.

Ha Im kaybetti. : D

5 Cevap

Bir Sayfa sınıf oluşturmak.

Kategori sınıf oluşturmak. Onun özelliklerinden biri $ sayfaları (veya benzeri) adlı sayfa nesneler bir dizi olmalıdır.

Denilen Kategori sınıfında bir yöntem oluşturun getPages() hangi $ sayfaların dizi dönecektir. Eğer isterseniz, bu o çağrıldığında DB sayfaları alır ve nitelik $ sayfalarında bunları önbelleğe bir "tembel yükleme" yöntemi olabilir. Kategori nesne oluşturulduğunda ya da tüm Page nesneleri yükleyebilirsiniz. Çağrı.

İhtiyacınız olan ya da isterseniz setPages($newArray) denilen Kategori sınıfında bir yöntem oluşturun. Bu yöntem, $ yeni_dizi parametresinin değeri ile $ sayfa dizi özelliği üzerine yazmak için kullanılmalıdır.

setx () yöntemleri (geleneksel) DB aramalarını ya da diğer veri yaratma programlarının başlaması için değil, niteliklerin değerlerini ayarlamak için kullanılır. Onlar bu zaman çoğu gibi bakacağız:

public function setPages($newArray)
{
    // data checking here to make sure $newArray is valid
    $this->pages = $newArray;
}

Veritabanlarını ve OOP karıştırma gibi görünüyor. Ben ilk bir nesne yönelimli bir şekilde sınıfları modellemek ve daha sonra veritabanı hakkında endişe öneririm. Sorunuzu yanıtlamak için, kesinlikle her sayfa ve her kategori için benzersiz bir nesne olmalıdır.

Veritabanı parçası için, sana Veri Mapper deseni (http://martinfowler.com/eaaCatalog/dataMapper.html) veya ORM (http://en.wikipedia.org/wiki/Object-relational_mapping) desen kullanmanızı tavsiye ederim.

Sen veritabanındaki tüm sayfaları ve veri yüklemek zorunda değilsiniz. Ortak bir çözüm sözde Aktif kayıtları kullanmaktır. Bir veritabanı satırı başına bir nesne. Örneğin:

class Page
{
var $id;
var $title;
var $txt;
function __construct($id) {...} // load from database
function save() {...} // save to database edited data
}

Örneğin, sınıf Record oluşturabilirsiniz:

class Record
{
var $tablename; // table name
var $row; // associative array - represents a row from a database

function __construct($tablename, $id)
// standard use cases with database
function save(); // will save a row to the database table
function load(); // will retrieve a row from the database table
function delete();
}

Kullanımı:

$page = new Record('page', 10);
echo $page['title'];

This is very simple solution only for example. See CodeIgniter Active Records for better example.

Nesne yönelimli programlama dili olarak düşünmek gibi spesifik değildir geniş bir konudur.

You have an excellent tutorial for OOP in PHP and I'd suggest to you to go here and read it: OOP Part 1 and OOP Part 2.

PHP geliştirme için ben kesinlikle sizin için bir gelişme OOP tarzı anahtarını öneririm:

  1. Daha az kod yazmak olacaktır.
  2. Onu korumak için daha kolay olacaktır.
  3. Bu genişletmek için daha kolay olacaktır.

Ben bu gibi yapardı yüzden eğer doğru olacaktır:

Örneğin:

$category = new Category();
$category->setPages(); // This would get all the pages (with the right categoryID) from the database and istantiate every row as an object to an array in the Category-class.

Sonra ben gibi yapabilirsiniz:

foreach($category->getPages() as $page) {
     echo $page->getName()."<br>";
}