Bài giảng Phát triển ứng dụng Web bằng PHP - Phần 5: PHP và hướng đối tượng - Dương Khai Phong
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phát triển ứng dụng Web bằng PHP - Phần 5: PHP và hướng đối tượng - Dương Khai Phong", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_phat_trien_ung_dung_web_bang_php_phan_5_php_va_huo.pdf
Nội dung text: Bài giảng Phát triển ứng dụng Web bằng PHP - Phần 5: PHP và hướng đối tượng - Dương Khai Phong
- • GVHD: Dương Khai Phong • Email: khaiphong@gmail.com • Website:
- 1/ Giới thiệu tổng quan Web 2/ Ngôn ngữ HTML và JavaScript 3/ Ngôn ngữ PHP căn bản 4/ Các đối tượng trong PHP 5/ PHP và hướng đối tượng 6/ PHP và cơ sở dữ liệu MySQL 7/ PHP và AJAX 8/ PHP và các hệ thống mã nguồn mở 9/ Triển khai ứng dụng PHP
- PHẦN 5:
- 1. Giới thiệu 2. Các vấn đề cơ bản hướng đối tượng trong PHP 3. Lớp abstract và lớp interfaces 4. Hàm include và require
- . OOP (Object Orient Programming) revolves around the concept of grouping code and data together in logical units called classes. This process is usually referred to as encapsulation, or information hiding, since its goal is that of dividing an application into separate entities whose internal components can change without altering their external interfaces. (ref: page 132 of ebook “phparchitects Zend PHP 5 Certification Study Guide”) . Programming techniques may include features such as abstraction, encapsulation, polymorphism, and inheritance.
- 1. Declaring a Class . Cú pháp khai báo lớp: class { // Your code is here } . Ví dụ: class foo { const BAR = "Hello World"; } echo foo::BAR;
- 1. Declaring a Class . Cú pháp khai báo lớp kế thừa: class a { function test(){ echo "a::test called";} function func(){echo "a::func called";} } class b extends a { function test(){echo "b::test called";} } class c extends b { function test(){parent::test();} } class d extends c { function test(){b::test();} } . Cú pháp xác định lớp đối tượng: if ($obj instanceof MyClass) { echo "\$obj is an instance of MyClass"; }
- 1. Declaring a Class . Cú pháp tạo đối tượng: 2. Instantiating an $myClassInstance = new myClass(); Object Lưu ý: các đối tượng trong PHP được sử dụng theo dạng tham chiếu . Ví dụ: $myClassInstance = new myClass(); $copyInstance = $myClassInstance(); // Cả 2 biến $myInstance và $copyInstance cùng trỏ tới một đối tượng thuộc myClass. 0fx01 $myClassInstance myClass $copyInstance
- 1. Declaring a Class . Phương thức và thuộc tính: 2. Instantiating an class myClass { Object function myFunction() { echo "You called myClass::myFunction"; } } // Access methods of class myClass $obj = new myClass(); $obj -> myFunction();
- 1. Declaring a Class . Con trỏ $this: 2. Instantiating an class myClass { Object function myFunction($data) { echo "The value is $data"; } function callMyFunction($data) { // Call myFunction() $this->myFunction($data); } } $obj = new myClass(); $obj->callMyFunction(123);
- 1. Declaring a Class . Cú pháp hàm khởi tạo: 2. Instantiating an class foo { Object function __construct() 3. Constructors { // PHP 5 new style constructor echo __METHOD__; } function foo() { // PHP 4 style constructor } } new foo();
- 1. Declaring a Class . Cú pháp hàm hủy: 2. Instantiating an class foo { Object function __construct() 3. Constructors { echo __METHOD__ . PHP_EOL; 4. Destructors } function __destruct() { echo __METHOD__; } } new foo();
- 1. Declaring a Class . Phạm vị truy cập: 2. Instantiating an Key Visibility Object public The resource can be accessed from any scope. 3. Constructors protected The resource can only be accessed from within 4. Destructors the class where it is defined and its descendants The resource can only be accessed from within 5. Visibility private the class where it is defined. The resource is accessible from any scope, but final cannot be overridden in descendant classes. . Ví dụ:
- 1. Declaring a Class . Ví dụ 1: kết quả của đoạn lệnh sau 2. Instantiating an class foo { Object public $foo = 'bar'; protected $baz = 'bat'; private $qux = 'bingo'; function __construct(){ 3. Constructors var_dump(get_object_vars($this)); } 4. Destructors } class bar extends foo { function __construct(){ 5. Visibility var_dump(get_object_vars($this)); } } new foo(); new bar();
- 1. Declaring a Class . Ví dụ 2: kết quả của đoạn lệnh sau 2. Instantiating an class foo { Object public $foo = 'bar'; protected $baz = 'bat'; private $qux = 'bingo'; function __construct(){ 3. Constructors $this->foo="pig"; var_dump(get_object_vars($this)); echo " "; 4. Destructors } } class bar extends foo { 5. Visibility function __construct(){ var_dump(get_object_vars($this)); echo " "; } } new foo(); new bar();
- 1. Declaring a Class . Ví dụ 2: kết quả của đoạn lệnh sau 2. Instantiating an class foo { Object public $foo = 'bar'; protected $baz = 'bat'; private $qux = 'bingo'; function __construct(){ 3. Constructors $this->foo="pig"; var_dump(get_object_vars($this)); 4. Destructors } } class bar extends foo { 5. Visibility function __construct(){ var_dump(get_object_vars($this)); } } new foo(); new bar();
- 1. Declaring a Class . Ví dụ 3: kết quả của đoạn lệnh sau 2. Instantiating an class foo { Object public $foo = 'bar'; protected $baz = 'bat'; private $qux = 'bingo'; function __construct(){ 3. Constructors $this->foo="pig"; var_dump(get_object_vars($this)); 4. Destructors } } class bar extends foo { 5. Visibility function __construct(){ var_dump(get_object_vars($this)); } } new foo(); new bar();
- 1. Declaring a Class . Ví dụ 3: kết quả của đoạn lệnh sau 2. Instantiating an class foo { Object public $foo = 'bar'; protected $baz = 'bat'; private $qux = 'bingo'; function __construct(){ 3. Constructors var_dump(get_object_vars($this)); echo " "; } 4. Destructors } class baz { function __construct() { 5. Visibility $foo = new foo(); var_dump(get_object_vars($foo)); echo " "; } } new foo(); new baz();
- 1. Declaring a Class . Cú pháp khai báo biến và phương thức tĩnh: 2. Instantiating an class foo { Object static $bar = "bat"; // output: static public function baz(){ bat 3. Constructors echo "Hello World"; Hello world } } 4. Destructors echo foo::$bar." "; foo::baz(); 5. Visibility . Cú pháp khai báo hằng trong lớp: 6. Constants, Static class foo { Methods and // output: Properties const BAR = "Hello World"; } Hello world echo foo::BAR;
- a. Giới thiệu Interface Go Interface Chim và máy bay Animal Go có cùng interface Run Fly nhưng cách Fly thức hoạt động Swim của Fly là khác nhau hoàn toàn Interface Run Transport
- b. Lớp trừu tượng . Khái niệm Lớp trừu tượng là một lớp cha cho tất cả các lớp có cùng bản chất. Do đó mỗi lớp dẫn xuất (lớp con) chỉ có thể kế thừa từ một lớp trừu tượng. Lớp trừu tượng không cho phép tạo instance (không thể tạo được các đối tượng thuộc lớp đó). . Cú pháp khai báo lớp trừu tượng abstractclass { [properties ] abstract function func_name( ); public function func_name( ); }
- b. Lớp trừu tượng . Ví dụ abstract class DataStore_Adapter { private $id; abstract function insert(); abstract function update(); public function save(){ if (!is_null($this->id)){ $this->update(); } else { $this->insert(); } } } class PDO_DataStore_Adapter extends DataStore_Adapter { public __construct($dsn){ // } function insert(){ // } function update(){ // } }
- c. Lớp interface . Khái niệm Lớp interface được xem như một mặt nạ cho tất cả các lớp cùng cách thức hoạt động nhưng có thể khác nhau về bản chất. Lớp dẫn xuất có thể kế thừa từ nhiều lớp interface để bổ sung đầy đủ cách thức hoạt động của mình (đa kế thừa - Multiple inheritance). . Cú pháp khai báo lớp interface interface class { }
- c. Lớp interface . Ví dụ interface DataStore_Adapter { public function insert(); public function update(); public function save(); public function newRecord($name = null); } class PDO_DataStore_Adapter implements DataStore_Adapter { public function insert(){ // } public function update(){ // } public function save(){ // } public function newRecord($name = null){ } }
- a. Công dụng . Giống nhau: Chèn file vào file hiện tại, nếu file được chèn có lỗi thì hiện thông báo lỗi . Khác nhau: Khi file được chèn bằng lệnh require() có lỗi thì trình biên dịch sẽ dừng lại, không dịch nữa và sẽ xuất hiện thông báo lỗi. Khi file được chèn bằng lệnh include() có lỗi thì trình biên dịch vẫn tiếp tục dịch cho đến hết, đồng thời cũng xuất hiện warning để cảnh báo file đó bị lỗi.
- b. Ví dụ . Giả sử 2 đoạn chương trình sau cùng sử dụng tập tin require_include.php không tồn tại như sau: Test include Test include ?>
- c. Hàm include_once và require_once . Là 2 hàm biến đổi của hàm include và require nhằm mục đích nếu tập tin đã được chèn trước đó thì không chèn nữa. . Ví dụ: giả sử có tập tin require_include_once.php như sau: "; ?> Test include_once
- ĐH CÔNG NGHỆ THÔNG TIN 28
- . Họ tên: . Mã SV: . Lớp: . Khoá: . Email: 01 02 19 20 A B C D
- Câu 1: Cho biết các phần tử được chứa trong mảng $a->array (đoạn lệnh thực hiện trong PHP5): my_value[] = $value; 6. } 7. function set_value ($value) { 8. $this->my_value[] = $value; 9. } 10. } 11. $a = new my_class('a'); 12. $a->my_value[] = 'b'; 13. $a->set_value ('c'); 14. $a->my_class('d'); ?> A. $a->array chứa các phần tử: a, b, c và d B. $a->array chứa các phần tử: a và d C. Đoạn lệnh sai ở dòng 3 D. Tất cả đều sai
- Câu 2: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): my_method1(123); 8. } 9. function my_method3 ($value) { 10. my_class::my_method1(456); 11. } 12. } 13. $obj = new my_class; 14. $obj->my_method3(123); ?> A. Đoạn lệnh xuất kết quả 123 B. Đoạn lệnh xuất kết quả 456 C. Đoạn lệnh sai ở dòng 7 D. Đoạn lệnh sai ở dòng 10
- Câu 3: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): my_var = $value; 6. } 7. } 8. $a =new my_class (10); 9. echo $a->my_var; ?> A. Đoạn lệnh báo lỗi B. Đoạn lệnh xuất kết quả 10 C. Đoạn lệnh xuất kết quả Null D. Đoạn lệnh không xuất kết quả nào hết.
- Câu 4: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): my_value= 5; 7. $b = $a; 8. $b->my_value= 10; 9. echo $a->my_value; ?> A. Đoạn lệnh xuất kết quả 5 B. Đoạn lệnh xuất kết quả 10 C. Đoạn lệnh xuất kết quả Null D. Đoạn lệnh không xuất kết quả nào hết.
- Câu 5: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): myvar = $x; 4. } 5. } 6. class b extends a { 7. var $myvar; 8. function b($x =2) { 9. $this->myvar = $x; 10. parent::a(); 11. } 12. } 13. $obj= new b; 14. echo $obj->myvar; ?> A. Đoạn lệnh xuất kết quả 1 B. Đoạn lệnh xuất kết quả 2 C. Đoạn lệnh báo lỗi do biến $myvar chưa khai báo D. Đoạn lệnh không xuất kết quả nào hết.
- Câu 6: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): A. Đoạn lệnh xuất kết quả “Parent called” B. Đoạn lệnh sai ở dòng số 7 C. Đoạn lệnh sai ở dòng số 10 D. Tất cả đều sai
- Câu 7: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): method1(); 14. $obj->method2(); ?> A. Đoạn lệnh xuất kết quả “15”và “15” B. Đoạn lệnh xuất kết quả “15”và một thông báo notice C. Đoạn lệnh sai ở dòng số 4 D. Đoạn lệnh sai ở dòng số 9
- Câu 8: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): myNumber = &$myNumber; 6. } 7. public function foo() { 8. echo $this->myNumber; 9. } 10. } 11. $obj =new myClass(); 12. $myNumber = 123; 13. $obj->foo(); ?> A. Đoạn lệnh sai ở dòng số 4 B. Đoạn lệnh sai ở dòng số 5 C. Đoạn lệnh sai ở dòng số 12 D. Đoạn lệnh xuất kết quả 123
- Câu 9: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): A. Đoạn lệnh xuất kết quả “Hi” B. Đoạn lệnh sai ở dòng số 1 C. Đoạn lệnh sai ở dòng số 2 D. Đoạn lệnh sai ở dòng số 1 và dòng số 2
- Câu 10: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): 1. c_test(); 8. } 9. } 10. class c extends p { 11. function c_test() { 12. print "3"; 13. } 14. } 15. $obj = new c; 16. $obj->p_test(); ?> A. Đoạn lệnh sai ở dòng số 7 B. Đoạn lệnh xuất kết quả 2 C. Đoạn lệnh xuất kết quả 3 D. Đoạn lệnh xuất kết quả 123
- Câu 11: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): Tập tin cMyMath.php Tập tin Test_cMyMath.php A. Đoạn lệnh xuất kết quả 9 B. Đoạn lệnh xuất kết quả null C. Đoạn lệnh sai ở dòng số 3 trong tập tin cMyMath.php D. Đoạn lệnh sai ở dòng số 3 trong tập tin Test_cMyMath.php
- Câu 12: Chọn phát biểu đúng thay cho từ key1 và key2 để đoạn lệnh sau xuất ra kết quả là 9 (đoạn lệnh thực hiện trong PHP5): Tập tin cMyMath.php Tập tin Test_cMyMath.php A. key1: public và key2: echo $obj->mysqrt(3); B. key1: để trống và key2: echo $obj->mysqrt(3); C. Cả A và B đều đúng D. Tất cả đều sai
- Câu 13: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): Tập tin cTest.php Tập tin Test_cTest.php myprint(); ?> A. Đoạn lệnh xuất kết quả “Hello” B. Đoạn lệnh xuất kết quả “Good bye” C. Đoạn lệnh không xuất kết quả nào hết D. Đoạn lệnh báo lỗi: Fatal error
- Câu 14: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): Tập tin cTest.php Tập tin Test_cTest.php myprint(); 5. } ?> A. Đoạn lệnh xuất kết quả “Hello” và báo lỗi Fatal Error B. Đoạn lệnh xuất kết quả “HelloHelloHello” C. Đoạn lệnh không xuất kết quả nào hết D. Đoạn lệnh báo lỗi: Fatal error
- Câu 15: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): Tập tin cTest.php Tập tin Test_cTest.php A. Đoạn lệnh xuất kết quả “Hello” B. Đoạn lệnh xuất kết quả “HelloHello” C. Đoạn lệnh báo lỗi: Fatal error D. Tất cả đều sai
- Câu 16: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): x=1;} 4. public function Foo($val){$x=$val;} 5. } 6. $obj = new Foo(3); 7. echo $obj->x; 8. ?> A. Đoạn lệnh xuất kết quả 1 B. Đoạn lệnh xuất kết quả 3 C. Đoạn lệnh không xuất kết quả nào hết D. Đoạn lệnh báo lỗi: Fatal error
- Câu 17: Chọn phát biểu đúng thay cho từ key để đoạn lệnh sau xuất ra kết quả là animal (đoạn lệnh thực hiện trong PHP5): type="animal";} 4. function getDescription(){return $type;} 5. } 6. class Cow extends Animal{ 7. private $breed; 8. }; 9. $obj = new Cow(); 10. key ?> A. echo $obj->type; B. echo $obj::type; C. Cả A và B đều đúng D. Tất cả đều sai
- Câu 18: Chọn phát biểu đúng thay cho từ key để đoạn lệnh sau xuất ra kết quả là vehicle (đoạn lệnh thực hiện trong PHP5): type=“vehicle";} 4. } 5. class Car extends Vehicle{ 6. function __construct(){ 7. key 8. echo $this->type; 9. } 10. }; 11. $obj = new Car(); ?> A. $type = “vehicle”; B. global $type = “vehicle”; C. parent::Vehicle(); D. Cả A và B đều đúng
- Câu 19: Cho biết kết quả đoạn lệnh (đoạn lệnh thực hiện trong PHP5): getValue() . "\n";} 4. } 5. class ConcreteClass1 extends AbstractClass{ 6. protected function getValue() {return "ConcreteClass1";} 7. } 8. class ConcreteClass2 extends AbstractClass{ 9. public function getValue() {return "ConcreteClass2";} 10. } 11. $class1 = new ConcreteClass1; $class1->printOut(); 12. $class2 = new ConcreteClass2; $class2->printOut(); ?> A. ConcreteClass1 ConcreteClass2 B. Đoạn lệnh báo lỗi dòng 3 vì trong lớp abstract chỉ chứa phương thức abstract C. Đoạn lệnh báo lỗi dòng 3 vì trong lớp abstract phương thức printOut() không được định nghĩa trước. D. Tất cả đều sai
- Câu 20: Chọn phát biểu đúng (đoạn lệnh thực hiện trong PHP5): A. Đoạn lệnh biên dịch bị lỗi ở dòng số 2 B. Đoạn lệnh biên dịch bị lỗi ở dòng số 6 C. Đoạn lệnh biên dịch thành công nhưng thực thi báo lỗi Fatal error D. Đoạn lệnh biên dịch thành công nhưng thực thi thông báo warning