2011-09-01 29 views
7

Tôi đang tạo một số đối tượng có thể tái sử dụng trong php và tôi muốn biết whats là cách tốt nhất để xây dựng chúng. Dưới đây tôi có 2 ví dụ về các cách khác nhau để làm điều này.Trong PHP, làm thế nào để bạn tạo các đối tượng tái sử dụng ?, có cách nào tốt nhất cho việc này không? Bạn thích cái nào hơn?

Class Uploader{ 
    public $Filename; 
    public $Directory; 

    function upload(){ 
     upload_file($this->Filename, $this->Directory) 
    } 
} 

// Then use the class above like this. 
$u = new Uploader; 
$u->Filename = 'foo.png'; // Set all the props 
$u->Directory = 'bar/' //^^^^
$u->upload();    // Then Execute 

Hoặc nó sẽ được tốt hơn để làm điều này ...

Class Uploader { 
    function uploader($filename, $directory){ 
     upload_file($filename, $directory) 
    } 
} 

// Then use the class above like this. 
$u = new Uploader; 
$u->uploader('foo.png', 'bar/') // Obviously much less code, All in One. 

Out of hai phương pháp này, cái nào được ưa chuộng, là của họ một sự khác biệt tốc độ hay bất kỳ loại tăng của việc sử dụng một khác?
Tôi thích ví dụ số 1, nhưng thực tiễn của họ là tốt nhất?

+0

Bạn chắc chắn sử dụng một cách kỳ lạ để xác định một lớp học. Có gì sai với dấu ngoặc, giống như phần còn lại của chúng ta sử dụng :) – TJHeuvel

+0

Nó có lẽ chỉ là ví dụ của bạn, nhưng cả hai dường như sai với tôi: Gói một hàm tĩnh trong một hàm trong một lớp có vẻ không hữu ích lắm. Nếu bạn đang sử dụng php 5.3+, bạn có thể sử dụng không gian tên cho các công cụ như thế. – jeroen

Trả lời

7

Tại sao bạn không thể làm cả hai?

class Uploader 
{ 
    public 
    $filename, 
    $directory; 

    public function __construct($name = '', $dir = '', $autoUpload = false) 
    { 
    $this->filename = $name; 
    $this->directory = $dir; 
    if ($autoUpload) 
    { 
     $this->upload() 
    } 
    } 

    public function upload() 
    { 
    //check your values 
    ...code... 
    upload_file($this->filename, $this->directory); 
    } 
} 

Với kỹ thuật này, bạn có thể tự động tải lên một tập tin đơn giản với:

$uploader = new Uploader($name, $dir, true); 

hoặc bạn có thể tự xây dựng các đối tượng với:

$uploader = new Uploader(); 
$uploader->filename = $name; 
$uploader->directory = $dir; 
$uploader->upload(); 
+0

Tôi không nghĩ về điều đó, đó là một ý tưởng rất hay. – Anil

+0

Làm việc trong hàm tạo thường không phải là một ý tưởng hay. – igorw

+1

@ strongw, đó là về điều vô lý nhất mà tôi từng đọc. Hàm tạo có nghĩa là * xây dựng * đối tượng. Có tất cả các loại công việc có thể và * nên * được thực hiện trong các nhà xây dựng. – zzzzBov

6

Phương pháp một là phương pháp tiếp cận OO cổ điển, nơi đối tượng bạn tạo chứa dữ liệu và phương pháp để hành động dựa trên dữ liệu đó. Phương pháp hai chỉ đơn giản là tạo ra một thư viện tiện ích của các hàm trong một lớp. Phương pháp hai chắc chắn là nhanh hơn, nhưng ít OO trong cách tiếp cận của nó. Nếu bạn đang quay để tái sử dụng, tôi sẽ thực sự đi với phương pháp một. Nếu đó là hiệu suất bạn muốn, bỏ qua sử dụng các lớp hoàn toàn và viết một thư viện chức năng.

4

Daniel Pereira đúng về hiệu suất.

Để trộn hai ví dụ (Biến & tái sử dụng), bạn có thể thử:

Class Uploader{ 
    public $Filename; 
    public $Directory; 

    function Uploader($this->Filename, $this->Directory){ 
     upload_file($this->Filename, $this->Directory); 
    } 
} 
$a = new Uploader('foo.png','bar'); 
echo $a->Filename; //foo.png 
echo $a->Directory; //bar 

Nó phải thực sự (vì một sai lầm):

Class Uploader{ 
     public $Filename; 
     public $Directory; 

     function Uploader($Filename, $Directory){ 
      $this->Filename = $Filename; 
      $this->Directory = $Directory; 
      upload_file($this->Filename, $this->Directory); 
     } 
    } 
+0

Chỉ vì tò mò, bạn có thể đặt thuộc tính được bảo vệ/riêng tư như thế này không? – gilden

+0

Có bạn có thể! Nhưng hãy nhớ rằng bạn sẽ không thể gọi chúng bằng một tên đơn giản '$ a-> Filename' ... – Franquis

+0

+1 cho mẹo tiện dụng. Tôi không phải sử dụng các biến riêng biệt để gán các giá trị trong các phương thức của mình nữa! Tôi tự hỏi nếu nó không được biết đến hay được coi là thực hành xấu. – gilden

2

Nếu bạn muốn làm đúng OO, ví dụ đầu tiên là khá tốt. Một đề xuất khác sẽ là:

Class Uploader{ 
    private $Filename; 
    private $Directory; 

    function upload(){ 
     upload_file($this->Filename, $this->Directory) 
    } 

} 

Sau đó, bạn có thể tạo phương thức setFileName và setDirectory để bạn trừu tượng hóa cài đặt của các trường đó sau này.

Bạn cũng có thể tạo một hàm tạo với các trường trong đó. Nhiều cách để giải quyết vấn đề này.

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