2012-05-16 15 views
12

Tôi đã thấy một số dự án trong đó các lớp đang có và thiết lập các phương thức để thao tác chèn dữ liệu. Hãy để tôi có ví dụ tại đây:Có đáng để tạo và thiết lập các phương thức trong OOP?

class Student extends dbClass 
{ 
    private $TableID; 
    private $FullName; 
    private $Gender; 
    private $Address; 




    function setTableID($Value) 
    { 
     $this->TableID = $Value; 
    } 

    function getTableID() 
    { 
     return $this->TableID; 
    } 

    function setFullName($Value) 
    { 
     $this->FullName = $Value; 
    } 

    function getFullName() 
    { 
     return $this->FullName; 
    } 

    function setGender($Value) 
    { 
     $this->Gender = $Value; 
    } 

    function getGender() 
    { 
     return $this->Gender; 
    } 

    function setAddress($Value) 
    { 
     $this->Address = $Value; 
    } 

    function getAddress() 
    { 
     return $this->Address; 
    } 


    function UpdateStudent() 
    { 
     $sql = "UPDATE INTO usertable SET 
     FullName = '".$this->getFullName()."', 
     Gender = '".$this->getGender()."', 
     Address = '".$this->getAddress()."' 
     where TableID='".$this->getTableID()."'"; 
     $this->query($sql); 
    } 
} 

Đây là lớp mẫu mà tôi đã thấy. Và bên dưới là quy trình cách họ đang sử dụng:

$student = new Student; 
$student->setTableID = 1; 
$student->setFullName('My Name'); 
$student->setGender('Male'); 
$student->setAddress('this is my address'); 

$studen->UpdateStudent(); 

Có đáng làm theo cách này không? Cá nhân tôi nghĩ rằng nó vô ích để thiết lập lĩnh vực và sau đó nhận được và cập nhật hồ sơ trong đó. Nó thực sự mất rất nhiều thời gian để làm cho nó cho mỗi mô-đun. Cách tốt nhất để xử lý những điều như vậy là gì? Có bất kỳ bảo mật nào liên quan đến việc đó theo cách này không?

+1

Công cụ sửa đổi truy cập (như 'riêng tư ') thường bị hiểu sai là tính năng bảo mật. Trong hiện thân C++ hiện tại của chúng, chúng thực sự có ý định hạn chế tiếp xúc ABI (không phải API); đó không phải là có liên quan đến PHP và ngôn ngữ kịch bản thực sự. Do đó, những người định cư và getters cần thiết thường là một tác dụng phụ, nhưng nó không phải là rất hướng đối tượng. Xem thêm [PHP Getters và setters: tà ác hay ác quỷ cần thiết?] (Http://berryllium.nl/2011/02/getters-and-setters-evil-or-necessary-evil/) và [Java: Getters and setters are ác] (http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html) – mario

+0

có thể trùng lặp của [Có thực sự là sai không sử dụng setters và getters?] (http://stackoverflow.com/questions/808348/is-it-really-that-wrong-not-using-setters-and-getters) – mario

Trả lời

10

Có đáng làm theo cách này không?

Tùy theo.

Suy diễn một lĩnh vực từ người sử dụng bằng cách phơi bày một "thông minh" tài sản (ví dụ: getter và/hoặc setter) có hai nhược điểm:

  1. Bạn cần phải viết mã hơn; nếu tài sản không thực sự làm bất cứ điều gì thông minh, đây là mã mà không có gì hữu ích.
  2. Người dùng tài sản hơi bất tiện vì họ phải nhập thêm một chút nữa.

Và nó có một lợi thế:

  1. Trong tương lai, bạn có thể thêm logic để các thuộc tính ngay cả khi chẳng có ai trước khi mà không vi phạm của người dùng đang.

Nếu lợi thế này có ý nghĩa (ví dụ: bạn đang viết thư viện phần mềm có thể sử dụng lại) thì bạn nên viết thuộc tính thay vì các trường trống. Nếu không, bạn đang làm việc vì không có lợi ích.

Cách tốt nhất để xử lý điều đó là gì?

Bạn có thể ghi đè lên sự kỳ diệu __get__set chức năng (có lẽ trong một lớp cơ sở để bạn có thể kế thừa override cũng) tự động chuyển tiếp bất động sản truy cập để getter và setter của bạn. đang Giản:

public function __get($name) { 
    $getter = 'get'.$name; 
    if (method_exists($this, $getter)) { 
     return $this->$getter(); 
    } 

    $message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $getter); 
    throw new \OutOfRangeException($message); 
} 

public function __set($name, $value) { 
    $setter = 'set'.$name; 
    if (method_exists($this, $setter)) { 
     return $this->$setter($value); 
    } 

    $getter = 'get'.$name; 
    if (method_exists($this, $getter)) { 
     $message = sprintf('Implicit property "%2$s" of class "%1$s" cannot be set because it is read-only.', get_class($this), $name); 
    } 
    else { 
     $message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $setter); 
    } 
    throw new \OutOfRangeException($message); 
} 

Caveat emptor: Kể từ __get__set được ghi đè, __isset__unset nên được ghi đè cũng!

Có bất kỳ bảo mật nào liên quan đến việc đó theo cách này không?

Không, không có gì cả (giả sử bạn không chèn lỗi vô tình).

+0

Tôi không nghĩ sẽ có bất kỳ logic tương lai nào trong đó. Những người trong công ty mới của tôi sử dụng nó để thực hiện điều cơ sở dữ liệu. Họ nghĩ rằng nó an toàn. Tôi không biết làm thế nào là nó bảo vệ. –

+2

@SalmanKhimani: Mọi người rất xấu trong việc dự đoán tương lai. Nếu đó là mã công ty, hãy đi tìm kiếm và định vị và không nhìn lại. – Jon

1

Làm cho bộ định vị và getters giúp thực thi đóng gói OOP. Im không chắc chắn cho PHP, nhưng đối với nhiều ngôn ngữ khác (Java, C++), một IDE tốt (nhật thực/netbeans) sẽ tự động tạo ra các bộ định cư và getters cho bạn.

Nó có thể không rõ ràng ngay lập tức cho các loại đơn giản, nhưng nếu bất kỳ loại xử lý phức tạp hơn phải được thực hiện, sau đó nó trở nên rõ ràng hơn.

+0

Họ không thực sự cải thiện đóng gói OOP nhưng thay vì giải pháp cho việc thiếu * thuộc tính * bằng một ngôn ngữ. – ThiefMaster

+0

@ThiefMaster, tôi nghĩ rằng nó thực sự giúp đỡ nếu bất kỳ loại logic/xử lý là cần thiết để lưu trữ các giá trị. – Brady

+0

Có, nhưng chúng vẫn là một cách giải quyết khó chịu. Trong python, bạn có thể sử dụng các vars công cộng chẳng hạn và chỉ cần tạo một thuộc tính * (truy cập các hàm getter/setter tùy chỉnh) nếu bạn cần thêm logic. Trong C#, bạn tạo các thuộc tính và cho phép trình biên dịch tạo trình getter/setter "đơn giản" cho nó trong nội bộ (bạn không bao giờ thấy chúng và chúng không phải là các hàm thực sự mà bạn có thể gọi trực tiếp) và nếu bạn cần logic tùy chỉnh, bạn chỉ cần thực hiện các hàm đó tự mình. Tuy nhiên, truy cập tài sản - không có vấn đề gì nếu có getter/setters hay không - luôn luôn được thực hiện thông qua 'obj.prop' như một biến – ThiefMaster

5

Trong ngôn ngữ không có thuộc tính (thành viên công khai "biến" thực sự dẫn đến cuộc gọi chức năng) bằng cách sử dụng getter/setters thay vì biến công cộng thường được khuyến nghị. Nếu không, bạn không thể thêm logic (ví dụ: khi đặt biến) sau này nếu mọi người đã sử dụng trường đơn giản của bạn.

Vì PHP là ngôn ngữ như vậy (không may) câu trả lời là có, sử dụng chúng.

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