PHP: Gerçek dünya OOP örneği

6 Cevap php

Ben OOP öğrenmeye çalışıyorum. Ben okuyorum kitaplarında sözde 'gerçek dünya' örnekler yardım değildir.

Gibi tüm örnekler Pet, Car, Human Artık bana yardım değildir. Ben, vb kayıt, kullanıcı profil sayfaları, ister GERÇEK YAŞAM örnekler gerekir

Örnek:

$user->userName = $_POST['userName'];//save username
$user->password = $_POST['password'];//save password
$user->saveUser();//insert in database

Ben de gördüm:

$user->user = (array) $_POST;

burada:

private $user = array();

Bir dizideki tüm bilgileri tutar.

Ve aynı sınıf yalanlar içinde

$user->getUser($uid);
// which sets the $this->user array equal to mysqli_fetch_assoc() using 
//the user id.

Birçok farklı php uygulamalar (kayıt, giriş, kullanıcı hesabı, vb) OOP uygularken herhangi bir gerçek dünya örnekleri var mı?

6 Cevap

OOP bir tek sınıf görünüyor ve nasıl işlediği hakkında gerçekten değil. Bir veya daha fazla sınıfların örneklerini birlikte nasıl çalıştığı hakkında.

Aslında bu ilkeyi gösteren gerçekten iyi bir iş yapmak, çünkü "Arabalar" ve "People" dayalı pek çok örneklerini görmek nedeni budur.

Benim düşünceme göre, OOP'deki en önemli dersler encapsulation ve polymorphism vardır.

Encapsulation: Coupling data and the logic that uses that data together in a concise, logical manner Polymorphism: The ability for one object to look-like and/or behave-like another.

Bu iyi bir gerçek dünyada örnek bir dizin yineleyici gibi bir şey olurdu. Nerede bu dizin nedir? Belki de, bir yerel klasör var belki bir FTP sunucusu gibi uzak bulunuyor. Kim bilir!

Bu kapsüllemesidir:

abstract class DirectoryIterator
{
  protected $root;

  public function __construct( $root )
  {
    $this->root = $root;
  }

  abstract public function getAll();
}

class LocalDirectoryIterator extends DirectoryIterator
{
  public function getAll()
  {
    // logic to get the current directory nodes and return them
  }
}

class FtpDirectoryIterator extends DirectoryIterator
{
  public function getAll()
  {
    // logic to get the current directory nodes and return them
  }
}

Her sınıf / nesnenin bir dizin listesi alınıyor kendi yöntemiyle sorumludur. Veriler (değişkenler) DTA kullanan mantığı (sınıf işlevleri, yani yöntem) kuple edilir.

Ben OOP sınıfların örneklerini birlikte çalışmak nasıl olduğunu, ve herhangi bir sınıf veya nesne nasıl söylediğini hatırlıyorum - ama hikaye bitmedi?

Tamam, bu nedenle bu verilerle bir şeyler yapalım - bu ekrana yazdırmak? Tabii. Ama nasıl? HTML? Düz metin? RSS? Kullanıcının bu ele alalım.

<?php

abstract class DirectoryRenderer
{
  protected $iterator;

  public function __construct( DirectoryIterator $iterator )
  {
    $this->iterator = $iterator;
  }

  public function render()
  {
    $dirs = $this->iterator->getAll();
    foreach ( $dirs as $dir )
    {
      $this->renderDirectory( $dir );
    }
  }

  abstract protected function renderDirectory( $directory );
}

class PlainTextDirectoryRenderer extends DirectoryRenderer
{
  protected function renderDirectory( $directory )
  {
    echo $directory, "\n";
  }
}

class HtmlDirectoryRenderer extends DirectoryRenderer
{
  protected function renderDirectory( $directory )
  {
    echo $directory, "<br>";
  }
}

Tamam, şimdi biz dizin listeleri geçme ve render için bir kaç sınıf ağaçlar var. Onları nasıl kullanabilirim?

// Print a remote directory as HTML
$data = new HtmlDirectoryRenderer( new FtpDirectoryIterator( 'ftp://example.com/path' ) );
$data->render();

// Print a local directory a plain text
$data = new PlainTextDirectoryRenderer( new LocalDirectoryIterator( '/home/pbailey' ) );
$data->render();

Şimdi, ben, ne düşündüğünüzü biliyorum "Ama Peter, bunu yapmak için bu büyük sınıf ağaçlar gerek yok!" o zaman sanıyorum çok gibi, nokta eksik olduğunuzu düşünüyorsanız ama "Car" ve "People" örnekleri ile olmuştur. Örneğin önemsiz ayrıntılar üzerinde odaklanmak etmeyin - yerine burada neler olduğunu anlamaya çalışın.

Bu genellikle bir contract olarak adlandırılır - bir (DirectoryRenderer) diğer kullanan (DirectoryIterator) beklenen bir şekilde iki sınıf ağaçları oluşturduk. DirectoryRenderer DirectoryIterator aldığı bir örneğinin hangi tip bakım, ne de onların işlenen nasıl DirectoryIterator bakım örneklerini yapmaz örneği.

Neden? Biz onlara bu şekilde dizayn ettik çünkü. Onlar sadece birbirinden takın ve işe. This is OOP in action.

"Aptallar için PHP ve MySQL günlük uygulamalar" gibi bir kitap satın alın.

Onun eski I [2005] biliyorum ama Usul hem de kullanıcı oturumları, Forum, Alışveriş sepetlerini, vb kavramları gösterir ve mysqli ile Object Oriented.

Bana Object Oriented PHP öğrenmek yardımcı oldu, ben çok okudu. İyi para değerinde.

OOP çok reuseable parçalar halinde programın bit gruplama gibi. Onun sınıfları içine fonksiyonları ambalaj onun sadece fikir seninle dürüst olmak o kadar da zor değil.

Aşağıda OOP şeyler gerçek dünyada küçük bir örnek:

CLASS DATABASE
CLASS SESSIONS
CLASS WEBFORMS
CLASS EMAIL

CLASS ACCOUNTS (Example Functions below)
FUNCTION SELECTACCOUNT
FUNCTION CHECKPASSWORD
FUNCTION CHECKUSERNAME
FUNCTION CREATEACCOUNT

PHP 6 zamankinden daha OOP fazla desteklemek için yeniden tasarlanmış olacak, bunu tutmak umuyoruz.

İyi Şanslar!

Astropanic dediği gibi, iyi bir PHP çerçevesinde veya kitaplığın kaynak koduna bakmak olabilir. I Zend Framework, çok modüler ve harika bir profesyonel tasarıma sahiptir öneririz. Ben nesne yönelimli PHP kod çok iyi bir parçası olduğunu söyleyebilirim.

Yine de, ben gerçekten bir şey öğretmek için yapılmış değildi çünkü, üretim kodu büyük bir parça öğrenmek o kadar kolay olmadığını düşünüyorum. Eğer gerçek dünya nesne yönelimli PHP kodu istiyorsanız Ancak, (ya da belki Symfony, CakePHP ya) Zend Framework muhtemelen gitmek için yoludur.

Ben OOP bilmiyorsanız eğer zend veya başka bir çerçeve içine kazma, şu anda uzakta herhangi çerçevesinde çok fazla olacağını kalmak tavsiye ederiz.

PHP OOP desteklenen çünkü, ha ha komik gibi ... komik çıkmak, ancak PHP, Java veya C # gibi bir cepten bir dil değildir.

Kısa bir örnek sadece ifademi altını çizmek:

// define class
class User {
// define properties and methods
public $name = "";
}
// instantiate class
$user = new User; // or new User() or new user, it's all the same
echo $user->name;

Eğer "fly" OOP yapmak istiyorsanız ancak aşağıdakileri yapabilirsiniz:

$user = (object) array('name' => 'Peter');

ve daha sonra

$user->name;

ama sen java veya c # değil aynı uzanacak gibi OOP kullanabilirsiniz - ve aklınızdaki, WordPress ve Drupal gibi popüler sistemleri saf cepten değil! ama siz de PHP miras ve diğer classing cepten şeyler yapabilirsiniz.

Ben PHP OOP uzağa gitmiş değil, ama daha ben içine almak daha kolay olur. Eğer cepten nasıl çalıştığını anlamak için nesneler örnekler sadece vardır. Ben anlamak ve daha önce de, OOP özellikleri ve yöntemleri (normal değişkenler ve fonksiyonlar) ile ilgili sadece bir. Benim öğreticiler örnekleri uygulayarak gerçek OOP kendimi programlı ve mutlaka gerçek dünyada olmak zorunda değildi. Bu tıpkı kaşık beslenen olduğunu ve OOP anlamak asla ve unutmak kolay olurdu. Benim tavsiyem anlamak için öğrenmek. Eğer anlarsanız, her şeyi yapabilir ve OOP gücünü fark eder. Ben bu kitabı indirilen ve ben siz de gerektiğini düşünüyorum. Ama bu sadece birisi sizin için uygulamalar inşa gibi ...

Aptallar için kitap PHP ve MySQL günlük Apps Here bir bağlantı

Ben bu soru zaten cevap olduğunu biliyorum iken ben burada değer ekleyebilirsiniz sanki, ben hissediyorum.

Ben OOP öğrenmek için bir programlama dili olarak PHP kullanmak gerektiğine inanmıyorum. Eğer web uygulamaları için OOP öğrenmek istiyorsanız, gerçekten C # veya Java bakıyor olmalıdır. Eğer OOP öğrendim, o zaman PHP için bu bilgiyi uygulayabilirsiniz. Ben OOP olduğunu öğrenmek için kullanılan bir kitabın bir örneği Big Java by Cay S. Horstmann

Neden bunu söylüyorsun?? Örnekler milyonlarca şeyler yapmak için nasıl PHP tam anlamıyla vardır çünkü ancak pek düzgün program nasıl örnekleridir. Bunun ötesinde, PHP, Java seviyor ile kabul olmaz birçok kısayol, almasına izin veriyor. Bir Java kafa ile PHP programlama eğer gibi, o zaman güçlü bir programcı olacağına inanıyoruz. OOP bir programlama paradigma, dile özgü değildir.

PHP kullanarak OOP öğrenmek gerekiyorsa, o zaman github kamu depolarında bazı gerçek kaynak koduna bakmak öneriyoruz. Siz packagist.org onları arayabilirsiniz. Onlar iyi bir kamu depo varsa, bunlar nasıl besteci paketleri kullanmak için size göstermek istiyorum bir readme.md dosyayı içerecektir. örneğin https://github.com/moltin/laravel-cart Eğer uygulama kullanmak mümkün olacak bir alışveriş sepeti paketinin bir örnektir. Eğer paketler ne anlamak için paket kaynak koduna bakmak gerekmez nasıl fark. Paket yazılmıştır ve nasıl çalışır umurumda değil, ama sadece bunları kullanmak için nasıl bilmeniz gerekir böylece onları kullanmak. Bu OOP hakkında tam olarak ne olduğunu.

Ben alışveriş sepeti sınıf sepetinize bir öğe ekler nasıl umurumda değil, ben sadece yeni bir sepeti oluşturmak ve buna bir şey eklemek istiyorum.

Ne yapıyorsun ancak cepten nasıl çalıştığını anlamak için bir araç olarak kaynak koduna dalış olduğunu.

Bu daha fazla ve belki de daha önemlisi, web uygulama geliştirme için, ben MVC tasarım deseni araştırma olacaktır.

MVC tasarım Desen Model, View, Controller için duruyor. Bir web uygulaması durumunda, model veritabanı modelleme için sorumlu olduğu, görünüm kullanıcıya içerik görüntüleme sorumludur. Kontrolör modeli ile etkileşim ve kullanıcı giriş işleme sorumludur.

Ben o zaman yerel makinede Laravel Framework veya diğer "iyi, modern bir çerçeve" yüklemeye çalışın gerektiğini düşünüyorum. Modern çerçeveler makinenizde PHP Java seviyor alacağı benzer gerçek OOP destek anlamına 5.3 + bir minimum PHP sürümünü gerektirir çünkü neden ben modern diyorsun.

Nasıl laravel web uygulamaları oluşturmak için size gösterecektir birçok dersler vardır. Hemen, size bir denetleyicisi oluşturduğunuzda, bir BaseController uzatmak olduğunu göreceksiniz. Bir Modeli oluşturduğunuzda, Eloquent uzatmak. Bu zaten kodu Polimorfizmi kullanıyor anlamına gelir. Sen sınıfları kullanarak, onlar kapsüllü edildiğini göreceksiniz, ve her sınıfın belirli bir role sahip olduğunu göreceksiniz.

Eğer veritabanı ile etkileşim istiyorum zaman, başlangıçta denetleyici yöntemleri içinde bir new Model nesne oluşturmak olacaktır. Daha fazlasını öğrenmek için başlangıç ​​olarak, daha sonra modeller dökümü ve yerine arabirimleri için depoları ve program oluşturmak için öğrenme, kontrolör içine bağımlılıkları nasıl enjekte öğrenmeye başlayacaktır.

Yeni başlayanlar için Laravel öğrenme üzerine bir iyi kitap Dale Rees tarafından https://leanpub.com/codebright olacaktır. Ben yaklaşık 2 hafta önce bir Laravel Meetup Dale araya geldi.

Daha yetkin inşaat web uygulamaları olmak gibi daha fazla bu, size programlama aşağıdaki ilkeleri uygulamak öğrenmek başlayacak:

  • Tek Sorumluluk Prensibi
  • Açık Kapalı Prensibi
  • Liskov Değişiklik Prensibi
  • Arayüz Segragation Prensibi
  • Bağımlılık İnversiyon Prensibi