14
PHP - Đã Tiến Bộ một bước OOP
Posted by neverdie0203 | Posted in PHP Nâng cao, Tin tức tổng hợp | Posted on 14-02-2009
Hệ thống thông tin Internet đã phát triển rộng, kèm theo đó là sự đáp ứng không ngừng của server và language tương ứng cho server. Hai hệ thống server quen thuộc hiện nay là Linux và Window ( Ngoài ra còn có iServer (hình như thế) của Apple sau này).
Hai hệ thống này đạt chuẩn riêng biệt, nhưng có lẽ người dùng đa số ưa chuộng Linux hơn vì một số lý do sau (theo cá nhân tôi):
+ Hệ thống uyển chuyển dễ xử lý: các plugin và add-on liên tục phát triển sau này đã giúp người quản trị có thể xử lý một cách nhẹ nhàng
+ Khả năng nhiểm virus (với mục đích tấng công) trên máy chủ rất khó.
+ Chạy trên nền tảng đa phần của Pearl, Python… và ko thể nhắc đến PHP và MYSQL
Điểm thứ ba này có giá trị ở một mức nào đó khi cặp đôi PHP và MySQL đang tấn công mạnh mẽ ASP và SQL Server khá mạnh. Đối thủ khó xứng tầm được với cũng vì ở lẽ PHP xử lý chuỗi quá nhanh và linh động trong khi thực chất ASP nằm trong lòng C# (một ngôn ngữ OOP khá phổ biến để dựng Software là chủ yếu) nên khó có thể đối đầu đc tính năng xử lý chuổi so với PHP. Thêm một điểm không nhỏ, MySQL dễ dàng triển khai các hệ thống lớn với giá thành khả dễ chịu - một điều hoàn toàn ngược lại với SQL Server.
Và nay, PHP tiến lên thêm một bậc OOP - Object Oriented Program - Lập trình hướng đối tượng<<< người ngoài có thể hiểu đơn giản là PHP có thể xây dựng những đối tượng tự nhiên thành một đối tượng cụ thể mà ngôn ngữ có thể hiểu như: con người, cây cối, một loài nào đó… với những đặc điểm chung cũng như riêng biệt. Trong bài này tôi xin giới thiệu sơ khai về một điểm nhỏ cũng khá quan trọng trong việc xây dựng đối tượng - PATTERN - MẪU HÌNH CƠ BẢN (có thể hiểu nôm na là thế)
Trong Pattern được chia ra 4 mẫu hình:
+ Strategy Pattern: mẫu hình chiến thuật (tạm dịch là thế - sẽ nói trong phần ftiếp)
+ Singleton Pattern: mẫu hình độc nhất (sẽ nói trong bài tiếp theo)
+ Observer Pattern: mẫu hình tổng thể (wait)
+ Factory Pattern: mẫu hình Đồng bộ (tạm dịch là thế vì chưa biết ở Tiếng Việt có ai đã dịch chưa vì tôi chưa đọc tài liệu tiếng Việt nào cả khi chạm PHP). Với mẫu hình này, các bạn có thể đồng bộ hóa một nhóm cá thể ở mức chung hay nói một cách đơn giản các bạn có thể phân định (phân loại - classify) từ những tập thể (interface - abstract class) chung thành những cá thể (instance) riêng biệt vào một nhóm (Object) đã định hình. Đây là điểm tôi sẽ trình bày trước trong bài này.
Factory Pattern
PHP chuyên cho phát triển website nên tôi lấy ví dụ thế này cho dễ hiểu: Phân quyền trong một website được phân phát quyền lực tuần tự: Administrator (quản lý), Moderator (Điều phái viên), Customer (người đã đăng ký), Guest (khách)
Và tất cả các nhóm (Một Class - Object) đã được mô hình hóa theo chuẩn OOP riêng nhưng chúng ta đều đặt chung chúng vào nhóm User (người dùng). Vì thế chúng ta sẽ khai triển tiên phong là nhóm User này.
abstract class User {
// Khởi tạo người dùng với một tên nhất định
function __construct($name)
{
$this->name = $name;
}
//Truy xuất tên người dùng
function getName()
{
return $this->name;
}
// Các quyền lực mà họ có thể chạm tới
function hasReadPermission()
{
return true;
}
function hasModifyPermission()
{
return false;
}
function hasDeletePermission()
{
return false;
}
function wantsFlashInterface()
{
return true;
}
protected $name = NULL;
}
Với nhóm này chúng ta sẽ bắt đầu phân loại chi tiết từng nhóm người dùng (ở đây chỉ dùng cho 3 nhóm để đơn giản hóa)
class GuestUser extends User {
}
class CustomerUser extends User {
function hasModifyPermission()
{
return true;
}
}
class AdminUser extends User {
function hasModifyPermission()
{
return true;
}
function hasDeletePermission()
{
return true;
}
function wantsFlashInterface()
{
return false;
}
}
Chúng ta đã chi tiết các nhóm này nhưng vấn đề đặt ra sẽ phân loại và quản lý chúng ra sao? Để giải quyết vấn đề này, chúng ta cần tạo ra một nhóm để đồng bộ hóa các nhóm này và sau đây là phần giải thích chi tiết
//Đây là lớp đồng bộ hóa mà ta sẽ dùng nó để xử lý các nhóm User
class UserFactory {
//Tôi khai báo tạm các user (xem như hệ thống website đã có sẵn các user này)
private static $users = array("Andi"=>"admin", "Stig"=>"guest",
"Derick"=>"customer");
//Đây chính là hàm đặc trưng của Factory Pattern.
//Hàm này tạo ra với mục đích kiểm soát các user đăng nhập vào với $name nhất định nào đó (ta sẽ test sau)
static function Create($name)
{
//Kiểm tra xem tên có trong hệ thống hay không
if (!isset(self::$users[$name])) {
// Error out because the user doesn’t exist
//Nếu không có thì thông báo user ko có ở trong hệ thống
print (”There isn’t have $name.”);
}
//NẾU CÓ (cái quan trọng đây)
//Một khi đã có thì chúng ta sẽ bắt đầu phân loại các user này ra thành từng nhóm
switch (self::$users[$name]) {
//Nếu tên nhập vào đã có trong hệ thống thì chúng ta sẽ lấy ra giá trị của tên thuộc nhóm nào
//Nếu lúc này đây ta lấy một tên là Derick thì rõ ràng biểu thức kiểm tra của ta sẽ là:
//$users["Derick"] << rõ ràng là có user này đã khai báo trong hệ thống bên trên
//Ngay lập tức ta sẽ tạo User này bằng new GuestUser($name) rồi trả về cho hệ thống; (name lúc này là Derick)
case “guest”: return new GuestUser($name);
case “customer”: return new CustomerUser($name);
case “admin”: return new AdminUser($name);
default: // Error out because the user kind doesn’t exist
}
}
}
Tôi xin viết thêm những phần mắm muối để nó thực thi:
//Kiểm tra giá trị True or False
function boolToStr($b)
{
if ($b == true) {
return "Yesn";
} else {
return "Non";
}
}
//Xem xét quyền hạn của từng user (Read, Modify, Delete)
function displayPermissions(User $obj)
{
print $obj->getName() . "'s permissions:n";
print "Read: " . boolToStr($obj->hasReadPermission());
print "Modify: " . boolToStr($obj->hasModifyPermission());
print "Delete: " . boolToStr($obj->hasDeletePermission());
}
function displayRequirements(User $obj)
{
if ($obj->wantsFlashInterface()) {
print $obj->getName() . " requires Flashn";
}
}
//Tạo một mãng các user và chạy thử xem sao
$logins = array("Andi", "Stig", "Derick", "neverdie0203");
foreach($logins as $login) {
displayPermissions(UserFactory::Create($login));
displayRequirements(UserFactory::Create($login));
}
Chỉ cần bạn đặt tất cả các code tôi đã viết trên đây vào một file *.php
?>
Thì nó sẽ dễ dàng xuất ra như thế này
Andi’s permissions: Read: Yes Modify: Yes Delete: Yes Stig’s permissions: Read: Yes Modify: No Delete: No Stig requires Flash Derick’s permissions: Read: Yes Modify: Yes Delete: No Derick requires Flash There isn’t have neverdie0203.





Bài này hướng vào PHP4?