Em đang nói về vấn đề object-based trong ứng dụng PHP.
Vài framework em nghía qua thì mỗi file template (View) chỉ đơn giản là... một file template thay đổi thì ta lại phải mở code của nó ra sửa.
Thay vì vậy ta có thể tách ra thành từng đối tượng, cho nó các chức năng nào đó để phần khác của trang có thể giao tiếp
Trên framework của em mỗi phần view của 1 trang được chia thành nhiều phần nhỏ, mỗi phần là 1 đối tượng, em đặt tên là widget (theo Singleton pattern). Trước khi trang web hiện ra thì mọi đối tượng đều có thể tương tác với nhau, việc này khiến cho khả năng mở rộng dễ dàng hơn mà không cần phải sửa code cũ.
Trong code mình viết thường khởi tạo lớp Registry (hay có thể tên là Config, hoặc Setting). Lớp này cho phép gọi và khởi tạo các đối tượng dùng chung.
VD:
PHP Code:
$Config = new Config(); $Config->setVar***91;'DB', Database::getInstance($Config->getVar('dbInfo')); $Config->setVar('Session', new Session());
Trong lớp View hoặc Controller mình dùng dạng:
PHP Code:
class Controller { public $Config; public $DB;
function __construct() { $this->Config = Config::getInstance(); $this->DB = $this->Config->getVar('DB'); //do any thing } }
Có một điều là khi viết các Extend class, để gọi một đối tượng dài quá. Sau khi dùng Singleton cho class thì cái Zend Studio không tự Auto các thuộc tính, các hàm nên đau hết cả đầu để nhớ chúng (mặc dù đặt tên theo nguyên tắc).
Mọi người góp ý cách khởi tạo và dùng đối tượng của mình nhé. Và có giải pháp nào cho Zend ?
PS: Cái nick đó đưa ra giải pháp mà cũng khá nhiều người dùng và không có đặt vấn đề nào cả nên chịu không có ý kiến gì :p
Trong code mình viết thường khởi tạo lớp Registry (hay có thể tên là Config, hoặc Setting). Lớp này cho phép gọi và khởi tạo các đối tượng dùng chung.
VD:
PHP Code:
$Config = new Config();
$Config->setVar***91;'DB', Database::getInstance($Config->getVar('dbInfo'));
$Config->setVar('Session', new Session());
Trong lớp View hoặc Controller mình dùng dạng:
PHP Code:
class Controller
{
public $Config;
public $DB;
function __construct()
{
$this->Config = Config::getInstance();
$this->DB = $this->Config->getVar('DB');
//do any thing
}
}
Có một điều là khi viết các Extend class, để gọi một đối tượng dài quá. Sau khi dùng Singleton cho class thì cái Zend Studio không tự Auto các thuộc tính, các hàm nên đau hết cả đầu để nhớ chúng (mặc dù đặt tên theo nguyên tắc).
Mọi người góp ý cách khởi tạo và dùng đối tượng của mình nhé. Và có giải pháp nào cho Zend ?
PS: Cái nick đó đưa ra giải pháp mà cũng khá nhiều người dùng và không có đặt vấn đề nào cả nên chịu không có ý kiến gì :p
Vậy thì chắc do em chưa được biết framework nào vậy rồi
[=========> Bổ sung bài viết <=========]
Dùng Config để lưu các đối tượng global như của bác là ko hợp lí lắm :">, chúng chỉ nên dùng để lưu các giá trị thiết lập cho website.
Các đối tượng kia nên có 1 class khác với các hàm dùng riêng ví dụ như $bxp->getDb(), dùng cách này + phpDoc @return sẽ dễ nhìn hơn khi code
Theo tớ, ngôn ngữ trong template hướng đến sự đơn giản, sao cho người thiết kế giao diện dù không giỏi lập trình cũng xử lý được. Chứ lại "mô hình đối tượng hóa" nó thì khác gì tạo ra thêm 1 ngôn ngữ lập trình mới
Dùng Config để lưu các đối tượng global như của bác là ko hợp lí lắm :">, chúng chỉ nên dùng để lưu các giá trị thiết lập cho website.
Các đối tượng kia nên có 1 class khác với các hàm dùng riêng ví dụ như $bxp->getDb(), dùng cách này + phpDoc @return sẽ dễ nhìn hơn khi code
Giải pháp nào cho việc khai báo và sử dụng các lớp, các thông số config một cách tiết kiệm nhất? Ví dụ, các lớp thường dùng sẽ luôn được gọi và nhưng hàm, biến, lớp chỉ dùng hoặc ít dùng sẽ được gọi khi cần thiết mà vẫn giữ vững kiến trức OOP?
Theo tớ, ngôn ngữ trong template hướng đến sự đơn giản, sao cho người thiết kế giao diện dù không giỏi lập trình cũng xử lý được. Chứ lại "mô hình đối tượng hóa" nó thì khác gì tạo ra thêm 1 ngôn ngữ lập trình mới
Dùng mã PHP mà làm gì có ngôn ngữ nào mới , mình nghĩ biết vài cú pháp alternative của PHP như for.. endfor; if... endif... có lẽ cũng không tới mức phải giỏi nhỉ
Được gửi bởi TheHeTre
Giải pháp nào cho việc khai báo và sử dụng các lớp, các thông số config một cách tiết kiệm nhất? Ví dụ, các lớp thường dùng sẽ luôn được gọi và nhưng hàm, biến, lớp chỉ dùng hoặc ít dùng sẽ được gọi khi cần thiết mà vẫn giữ vững kiến trức OOP?
Không nhất thiết phải cố gắng giữ kiến trúc OOP làm gì nếu nó làm phiền Em dùng __autoload để giải quyết vấn đề khi nào cần class mới gọi và ko cần tìm kiếm để require, include...
Các config em thường để trong file .ini hoặc trong db với các field name/value, chỉ load 1 lần khi đối tượng init.
PHP Code:
class SysConfig { protected static $_configs = array();
public function __construct() { if (count(self::$_configs) < 1) { $this->loadConfigs(); } } }
Cái SysConfig đó phải là singleton nhá
Còn vấn đề "hàm, biến, lớp chỉ dùng hoặc ít dùng sẽ được gọi khi cần thiết" thì em cũng chưa nghĩ ra
$obj = new Object();
$obj->setUsername('cái nick đó');
$obj->setStatus('Thành viên cần được theo dõi');
Vài framework em nghía qua thì mỗi file template (View) chỉ đơn giản là... một file template thay đổi thì ta lại phải mở code của nó ra sửa.
Thay vì vậy ta có thể tách ra thành từng đối tượng, cho nó các chức năng nào đó để phần khác của trang có thể giao tiếp
Trên framework của em mỗi phần view của 1 trang được chia thành nhiều phần nhỏ, mỗi phần là 1 đối tượng, em đặt tên là widget (theo Singleton pattern). Trước khi trang web hiện ra thì mọi đối tượng đều có thể tương tác với nhau, việc này khiến cho khả năng mở rộng dễ dàng hơn mà không cần phải sửa code cũ.
Ví dụ:
$frontMaster = FrontMasterWidget::getInstance();
BodyWidget::getInstance()->addChild($frontMaster);
$frontMaster->addChild(HeaderTabsWidget::getInstance());
$frontMaster->addChild(MainContentWidget::getInstance());
HeaderTabsWidget::getInstance()->setCurrentTab('some-code');
VD:
$Config = new Config();
$Config->setVar***91;'DB', Database::getInstance($Config->getVar('dbInfo'));
$Config->setVar('Session', new Session());
class Controller
{
public $Config;
public $DB;
function __construct()
{
$this->Config = Config::getInstance();
$this->DB = $this->Config->getVar('DB');
//do any thing
}
}
Mọi người góp ý cách khởi tạo và dùng đối tượng của mình nhé. Và có giải pháp nào cho Zend ?
PS: Cái nick đó đưa ra giải pháp mà cũng khá nhiều người dùng và không có đặt vấn đề nào cả nên chịu không có ý kiến gì :p
[=========> Bổ sung bài viết <=========]
Dùng Config để lưu các đối tượng global như của bác là ko hợp lí lắm :">, chúng chỉ nên dùng để lưu các giá trị thiết lập cho website.
Các đối tượng kia nên có 1 class khác với các hàm dùng riêng ví dụ như $bxp->getDb(), dùng cách này + phpDoc @return sẽ dễ nhìn hơn khi code
Các config em thường để trong file .ini hoặc trong db với các field name/value, chỉ load 1 lần khi đối tượng init.
class SysConfig
{
protected static $_configs = array();
public function __construct()
{
if (count(self::$_configs) < 1) {
$this->loadConfigs();
}
}
}
Còn vấn đề "hàm, biến, lớp chỉ dùng hoặc ít dùng sẽ được gọi khi cần thiết" thì em cũng chưa nghĩ ra