2009-08-27 48 views
43

Tôi đang cố gắng học OOP. Cái gọi là ví dụ 'thế giới thực' trong những cuốn sách tôi đang đọc không giúp ích gì.PHP: Ví dụ OOP thực tế

Tất cả các ví dụ như Pet, Car, Human không giúp ích gì cho tôi nữa. Tôi cần những ví dụ thực tế đời sống mà muốn đăng ký, trang lý lịch thành viên vv

Một ví dụ:

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

Tôi cũng thấy:

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

nơi:

private $user = array(); 

Giữ tất cả thông tin trong một mảng.

Và trong cùng một lớp nằm

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

Có những ví dụ thực tế triển khai OOP trong nhiều ứng dụng khác nhau php (đăng ký, đăng nhập, tài khoản người dùng, vv)?

+0

** Vui lòng xem thêm: ** "So sánh không đối sánh biệt ngữ OOP so với thủ tục": http://stackoverflow.com/questions/1530868 – dreftymac

Trả lời

77

OOP không chỉ về cách một lớp duy nhất trông và hoạt động. Đó cũng là cách các cá thể của một hoặc nhiều lớp làm việc cùng nhau.

Đó là lý do tại sao bạn thấy rất nhiều ví dụ dựa trên "Ô tô" và "Mọi người" bởi vì họ thực sự làm một công việc thực sự tốt để minh họa nguyên tắc này.

Theo tôi, các bài học quan trọng nhất trong OOP là đóng góiđa hình.

Đóng gói: dữ liệu nối và logic mà hành động trên dữ liệu đó lại với nhau một cách ngắn gọn, hợp lý Polymorphism: Khả năng cho một đối tượng để nhìn giống như và/hoặc cư xử như nhau.

Ví dụ thực tế tốt về điều này sẽ giống như một trình lặp thư mục. Thư mục này ở đâu? Có thể đó là một thư mục cục bộ, có thể nó ở xa giống như một máy chủ FTP. Ai biết!

Dưới đây là một cây lớp cơ bản thể hiện đóng gói:

<?php 

interface DirectoryIteratorInterface 
{ 
    /** 
    * @return \Traversable|array 
    */ 
    public function listDirs(); 
} 

abstract class AbstractDirectoryIterator implements DirectoryIteratorInterface 
{ 
    protected $root; 

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

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

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

Mỗi lớp/đối tượng chịu trách nhiệm về phương pháp riêng của mình lấy một danh sách thư mục. Dữ liệu (các biến) được kết hợp với logic (các hàm lớp, tức là các phương thức) sử dụng dữ liệu.

Nhưng câu chuyện chưa kết thúc - hãy nhớ cách tôi nói OOP là về cách các cá thể của các lớp làm việc cùng nhau, và không phải bất kỳ lớp hoặc đối tượng đơn lẻ nào?

Ok, vậy hãy làm gì đó với dữ liệu này - in nó lên màn hình? Chắc chắn rồi. Nhưng bằng cách nào? HTML? Văn bản thô? RSS? Hãy giải quyết điều đó.

<?php 

interface DirectoryRendererInterface 
{ 
    public function render(); 
} 

abstract class AbstractDirectoryRenderer implements DirectoryRendererInterface 
{ 
    protected $iterator; 

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

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

    abstract protected function renderDirectory($directory); 
} 

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

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

Ok, bây giờ chúng tôi có một vài lớp cây để duyệt qua và hiển thị danh sách thư mục. Chúng ta sử dụng chúng như thế nào?

// 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(); 

Bây giờ, tôi biết bạn đang nghĩ gì, "Nhưng Peter, tôi không cần những cây lớn này để làm điều này!" nhưng nếu bạn nghĩ rằng sau đó bạn đang thiếu điểm, giống như tôi nghi ngờ bạn đã được với các ví dụ "xe hơi" và "người". Đừng tập trung vào các minutiae của ví dụ - thay vì cố gắng hiểu những gì đang xảy ra ở đây.

Chúng tôi đã tạo hai cây lớp trong đó một (*DirectoryRenderer) sử dụng khác (*DirectoryIterator) theo cách mong đợi - điều này thường được gọi là hợp đồng . Ví dụ về *DirectoryRenderer không quan tâm đến loại cá thể nào của *DirectoryIterator mà nó nhận được, cũng như không thực hiện các trường hợp của *DirectoryIterator về cách chúng được hiển thị.

Tại sao? Bởi vì chúng tôi đã thiết kế chúng theo cách đó. Họ chỉ cắm vào nhau và làm việc. Đây là OOP đang hoạt động.

+11

+2 nếu tôi có thể !! –

+0

có một số ví dụ cho người dùng không ?? tôi muốn một ví dụ về quản lý và xác thực. nếu có ai biết về một nơi nào đó, tôi sẽ đánh giá cao nó. – iLevi

+0

@Peter Bailey Thật không may câu hỏi của tôi đã được đóng lại, nhưng tôi sẽ rất vui mừng nếu bạn có thể giúp tôi với [câu hỏi này (liên kết ở đây)] (http://stackoverflow.com/questions/14221240/practical-way-to-implement -oop-in-php-cho-người dùng # comment19725375_14221240) – iLevi

1

Như astropanic đã nói, bạn có thể xem mã nguồn của một khung hoặc thư viện PHP tốt. Tôi khuyên bạn nên Zend Framework, nó rất mô-đun và có một thiết kế tuyệt vời, chuyên nghiệp. Tôi sẽ nói nó là một đoạn mã PHP hướng đối tượng rất tốt.

Tuy nhiên, tôi nghĩ rằng không dễ dàng để học hỏi từ một đoạn mã sản xuất khổng lồ, vì nó không thực sự được thực hiện để dạy cho bạn bất cứ điều gì. Nhưng nếu bạn muốn mã PHP hướng đối tượng trong thế giới thực, khung công tác Zend (hoặc Symfony, hoặc có thể là CakePHP) có lẽ là cách để đi.

1

Tôi khuyên bạn nên tránh xa mọi khung công tác tại thời điểm này, nếu bạn không biết OOP, việc đào sâu vào zend hoặc bất kỳ khung công tác nào khác sẽ là quá nhiều.

OOP PHP bị bỏ buồn cười ... như ha ha vui nhộn, vì nó được hỗ trợ, nhưng PHP không phải là ngôn ngữ OOP như java hoặc C#.

dụ ngắn chỉ để nhấn mạnh tuyên bố của tôi:

// 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; 

nhưng nếu bạn muốn làm OOP "on the fly" bạn có thể làm như sau:

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

và sau đó

$user->name; 

nhưng bạn có thể sử dụng OOP như bạn sẽ làm trong java hoặc C# nhưng không cùng mở rộng - và lưu ý, các hệ thống phổ biến như wordpress và drupal không phải là OOP tinh khiết! nhưng bạn có thể làm thừa kế và phân loại các công cụ OOP khác trong PHP.

+13

Tôi xin lỗi, nhưng mảng '$ user = (đối tượng) ('name' => 'Peter'); '* KHÔNG * OOP - hoặc thậm chí khi bạn nói" OOP on the fly ". đó chỉ là một vật thể. Sử dụng các đối tượng! = OOP. Rõ ràng việc sử dụng các đối tượng là một phần không thể tách rời của OOP, nhưng nó có nghĩa là * WAY * nhiều hơn thế. –

7

Mua sách như "Ứng dụng hàng ngày cho PHP và Mysql dành cho người giả".

Cũ tôi biết [2005] nhưng nó hiển thị các khái niệm về Đăng nhập người dùng, Diễn đàn, Giỏ hàng mua sắm, v.v. trong cả hai thủ tục và hướng đối tượng với Mysqli.

Nó đã giúp tôi tìm hiểu hướng đối tượng PHP, tôi đã nghiên cứu rất nhiều. Cũng đáng tiền.

OOP giống như nhóm các bit chương trình của bạn thành các phần có thể sử dụng lại được. Nó không phải là khó để trung thực với bạn của nó chỉ là ý tưởng đóng gói các chức năng của bạn vào các lớp học.

dụ nhỏ

Bất động thế giới của OOP thứ dưới đây:

CLASS DATABASE
CLASS PHIÊN
WebForms CLASS
CLASS EMAIL

TÀI KHOẢN CLASS (Ví dụ hàm dưới)
CHỨC NĂNG SELECTACCOUNT
CHỨC NĂNG CHECKPASSWORD
FUNCTION CHECKUSERNAME
FUNCTION CREATEACCOUNT

Tôi hy vọng bạn tiếp tục, PHP 6 sẽ được thiết kế lại để hỗ trợ OOP hơn bao giờ hết.

Chúc may mắn!

1

Tôi đã không đi xa trong PHP OOP, nhưng tôi càng hiểu rõ nó trở nên dễ dàng hơn. Các ví dụ đối tượng là chỉ có cho bạn để hiểu làm thế nào OOP hoạt động. Tôi hiểu và đã trải qua điều này trước đây, OOP chỉ là về các thuộc tính và phương thức (các biến và hàm bình thường). Tôi lập trình trong thực tế OOP bản thân mình áp dụng các ví dụ từ hướng dẫn của tôi và không nhất thiết phải ở trong thế giới thực. Điều đó giống như thìa được cho ăn và bạn sẽ không bao giờ hiểu OOP và sẽ dễ quên. Lời khuyên của tôi học cách hiểu. Nếu bạn hiểu, bạn có thể làm bất cứ điều gì và sẽ nhận ra sức mạnh của OOP. Tôi đã tải xuống cuốn sách này và tôi nghĩ bạn cũng nên làm như vậy. Nhưng điều đó cũng giống như một người nào đó xây dựng các ứng dụng cho bạn ...

Here một liên kết đến PHP sách và Apps hàng ngày Mysql For Dummies

1

Trong khi tôi biết rằng câu hỏi này đã được trả lời rồi, tôi cảm thấy như thể Tôi có thể thêm giá trị ở đây.

Tôi không tin rằng bạn nên sử dụng PHP làm ngôn ngữ lập trình để tìm hiểu OOP. Nếu bạn muốn tìm hiểu OOP cho các ứng dụng web, bạn thực sự nên xem xét C# hoặc Java. Một khi bạn đã học được OOP, thì bạn có thể áp dụng kiến ​​thức này cho PHP. Một ví dụ về cuốn sách tôi đã từng học OOP là Big Java by Cay S. Horstmann

Tại sao tôi nói điều này ??? Bởi vì có hàng triệu ví dụ về PHP về cách làm công cụ, tuy nhiên không nhiều ví dụ về cách lập trình đúng cách. Hơn nữa, PHP cho phép bạn thực hiện nhiều lối tắt, điều này sẽ không thể chấp nhận được với những thứ như Java. Như vậy, nếu bạn lập trình PHP với một đầu Java, thì tôi tin rằng bạn sẽ là một lập trình viên mạnh mẽ hơn. OOP không phải là ngôn ngữ cụ thể, nó là một mô hình lập trình.

Nếu bạn phải học OOP sử dụng PHP, thì tôi khuyên bạn nên xem xét một số mã nguồn thực trong kho lưu trữ công cộng của github. Bạn có thể tìm kiếm chúng trong packagist.org. Nếu chúng là một kho lưu trữ công cộng phong nha, chúng sẽ chứa một tệp readme.md sẽ chỉ cho bạn cách sử dụng các gói trình soạn thảo. ví dụ: https://github.com/moltin/laravel-cart là ví dụ về gói giỏ hàng mà bạn có thể sử dụng trong ứng dụng của mình. Lưu ý cách bạn không cần phải xem mã nguồn của gói để hiểu những gì các gói làm. Gói đã được viết và bạn không quan tâm đến cách chúng hoạt động, nhưng bạn sử dụng chúng để bạn chỉ cần biết cách sử dụng chúng. Đây chính xác là những gì OOP nói về.

Tôi không quan tâm cách lớp giỏ hàng thêm mục vào giỏ hàng, tôi chỉ muốn tạo một giỏ hàng mới và thêm thứ gì đó vào giỏ hàng đó.

Tuy nhiên, những gì bạn đang làm là đi sâu vào mã nguồn làm công cụ để hiểu cách hoạt động của OOP.

Thêm vào đó, và có lẽ quan trọng hơn, để phát triển ứng dụng web, tôi sẽ nghiên cứu mẫu thiết kế MVC.

Thiết kế MVC Mẫu viết tắt của Mô hình, Chế độ xem, Bộ điều khiển. Trong trường hợp ứng dụng web, Mô hình chịu trách nhiệm lập mô hình cơ sở dữ liệu, chế độ xem có trách nhiệm hiển thị nội dung cho người dùng. Bộ điều khiển chịu trách nhiệm tương tác với mô hình và xử lý đầu vào của người dùng.

Sau đó, tôi nghĩ bạn nên thử cài đặt Laravel Framework hoặc "khung hiện đại phong nha" khác trên máy cục bộ của bạn. Tại sao tôi nói hiện đại, bởi vì các khung công tác hiện đại đòi hỏi một phiên bản PHP tối thiểu 5.3+ có nghĩa là PHP trên máy của bạn sẽ hỗ trợ OOP thực tương tự với cái mà bạn sẽ nhận được từ những thứ như Java.

Có nhiều hướng dẫn sẽ chỉ cho bạn cách xây dựng ứng dụng web trong laravel. Ngay lập tức, bạn sẽ thấy rằng khi bạn tạo một bộ điều khiển, bạn mở rộng một BaseController. Khi bạn tạo một Mô hình, bạn mở rộng Eloquent. Điều này có nghĩa là bạn sẽ sử dụng Đa hình trong mã của bạn. Bạn sẽ thấy rằng bằng cách sử dụng các lớp, chúng được đóng gói, và bạn sẽ thấy rằng mỗi lớp có một vai trò cụ thể.

Khi bạn muốn tương tác với cơ sở dữ liệu, ban đầu bạn sẽ tạo đối tượng new Model trong các phương pháp điều khiển. Khi bạn bắt đầu tìm hiểu thêm, bạn sẽ bắt đầu học cách chèn các phụ thuộc vào bộ điều khiển, sau đó học cách kết xuất các mô hình của bạn và tạo các kho lưu trữ và chương trình cho các giao diện thay thế.

Sách phong nha về việc học Laravel cho người mới bắt đầu sẽ là https://leanpub.com/codebright bởi Dale Rees. Tôi đã gặp Dale tại một buổi họp mặt Laravel khoảng 2 tuần trước.

Tiếp tục vào đó, khi bạn trở nên các ứng dụng xây dựng web thành thạo hơn, bạn sẽ bắt đầu học cách áp dụng các nguyên tắc sau đây để lập trình của bạn:

  • Nguyên tắc đơn Trách nhiệm
  • Closed Nguyên tắc
  • Nguyên tắc thay thế Liskov
  • Nguyên tắc phân đoạn giao diện
  • Nguyên tắc đảo ngược phụ thuộc
0

Tôi cũng khuyên bạn nên xem trình bao bọc của mình Arrayzy. Đó là một mảng PHP dễ sử dụng trong thư viện OOP.

Vì vậy, nếu bạn làm việc với chức năng mảng PHP mẹ đẻ - bạn có thể làm những điều tương tự trong OOP và Arrayzy giúp bạn với nó, ví dụ:

// Functional programming: 
$array = ['a', 'b', 'c']; 
$resultArray = array_merge($array, ['c', 'd']); 

// Object-oriented programming: 
$obj = Arrayzy\MutableArray::create(['a', 'b', 'c']); 
$obj->mergeWith(['c', 'd']); 
$resultArray = $obj->toArray(); 

Trong cả hai trường hợp mảng kết quả sẽ là:

Array(
    0 => 'a' 
    1 => 'b' 
    2 => 'c' 
    3 => 'c' 
    4 => 'd' 
) 

Kiểm tra phương thức mergeWith này (hoặc cách khác) hoạt động dưới mui xe.

Tôi nghĩ rằng đây là một ví dụ tốt đẹp đó cho thấy rằng hầu hết mọi thứ chức năng mã bạn có thể thay thế với OOP mã như trong thư viện này. Nhưng với OOP, bạn nhận được nhiều hơn nữa và bạn cũng có thể kiểm tra câu hỏi Functional programming vs OOP để tìm hiểu thêm chi tiết điểm yếu và đạo cụ của nó là gì.

Các vấn đề liên quan