10/10/2018, 00:22

Everything is object!

Mọi thứ đều là đối tượng!
BossFTP viết 02:24 ngày 10/10/2018
Bác cũng là đối tượng!
sacroyant viết 02:26 ngày 10/10/2018
Được gửi bởi BossFTP
Bác cũng là đối tượng!
Bác ấy là đối tượng có thuộc tính "cần được theo dõi"
jiSh@n viết 02:25 ngày 10/10/2018
PHP Code:
$obj = new Object();
$obj->setUsername('cái nick đó');
$obj->setStatus('Thành viên cần được theo dõi'); 
cái nick đó viết 02:37 ngày 10/10/2018
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ũ.

Ví dụ:
PHP Code:
$frontMaster FrontMasterWidget::getInstance();
BodyWidget::getInstance()->addChild($frontMaster);
$frontMaster->addChild(HeaderTabsWidget::getInstance());
$frontMaster->addChild(MainContentWidget::getInstance()); 
Tại một trang nào đó:
PHP Code:
HeaderTabsWidget::getInstance()->setCurrentTab('some-code'); 
Ví dụ như vậy
TheHeTre viết 02:34 ngày 10/10/2018
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
cái nick đó viết 02:37 ngày 10/10/2018
Được gửi bởi TheHeTre
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
sacroyant viết 02:34 ngày 10/10/2018
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
TheHeTre viết 02:30 ngày 10/10/2018
Được gửi bởi cái nick đó
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?
cái nick đó viết 02:32 ngày 10/10/2018
Được gửi bởi sacroyant
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
Bài liên quan
0