ICTsharing - Blog chia sẻ kiến thức về ICT: PHP nâng cao

Hot

Post Top Ad

Hiển thị các bài đăng có nhãn PHP nâng cao. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn PHP nâng cao. Hiển thị tất cả bài đăng

Thứ Hai, 12 tháng 8, 2019

Tìm file đã sửa mới nhất trong thư mục PHP

09:20 0
Có rất nhiều dự án cần xử lý file trong php. Mình cũng đang gặp phải và đã trích bài toán này ra để lưu trữ vào blog này cho mình sử dụng về sau hoặc cho ai đó cần.

Bài toán:
Tìm file mới nhất của các file trong thư mục và hiển thị tên file và thời gian mới nhất của file bằng PHP.


Các bước:
1. Mở thư mục
2. Mở file
3. So sánh thời gian của file để lấy ra file mới nhất và thời gian mới nhất.
4. Đóng file
5. Hiển thị ra kết quả.

Đây là hình ảnh của thư mục mình muốn lấy:




Đoạn code file php:
<?php
$directory= "D:\backup\aws\Invoice";
$smallest_time=0;
$latest_file='';
if ($handle = opendir($directory)) {
    while (false !== ($file = readdir($handle))) {
        $time=filemtime($directory.'/'.$file);
        if (is_file($directory.'/'.$file)) {
            if ($time > $smallest_time) {
                $latest_file = $file;
                $smallest_time = $time;
            }
        }
    }
    closedir($handle);
$lastModified = date("Y/m/d H:i:s", $smallest_time); 
}
echo $latest_file.' - '.$lastModified;

Kết quả:




Hy vọng bài toán này sẽ giúp ích được cho các bạn.

Tham khảo thêm cách tìm thời gian mới nhất của file trong thư mục bằng PHP:

            $lastestTimeUserCoordination = array_values(File::allfiles(storage_path($backupInsertPath))); 
            $fixTime = 0;             
            foreach($lastestTimeUserCoordination  as $lastestTime){                 
                $currentModified  = filemtime($lastestTime);               
                if($fixTime < $currentModified ){
                    $fixTime = $currentModified ;
                    
                }                
            }
            $lastModified = date("Y年m月d日 H時i分s秒", $fixTime); 
Xem thêm

Thứ Sáu, 4 tháng 1, 2019

Mô hình abstract trong hướng đối tượng PHP - Bài 9

17:40 0
Trong môi trường team work, khi làm việc với nhiều lập trình viên. Phải làm sao để có thể đồng nhất các vấn đề ?. Làm sao để đưa ra những chuẩn mực chung nhằm ràng buộc các lập trình viên trong dự án phải làm theo ?. Mô hình trừu tượng (abstract) sẽ giúp bạn làm những điều đó một cách dễ dàng.

Abstract là gì? 
Lớp trừu tượng là lớp chứa các phương thức trừu tượng. Các lớp kế thừa lớp trừu tượng phải thực thi các phương thức trừu tượng của lớp trừu tượng.


Xem thêm

Kỹ thuật lazy loading trong lập trình hướng đối tượng PHP - Bài 8

16:53 0
Lazy loading là kỹ thuật quan trọng trong các mô hình PHP Framework hiện nay. Nhiệm vụ của chúng là hỗ trợ chúng ta nạp 1 thư viện nào đó một cách tự động mà không cần phải require chúng trên đầu của mỗi trang.
Trước khi tìm hiểu chúng ta xem qua hai ví dụ dưới đây nhé.

Tạo file vd06.php có nội dung sau:


Tạo thêm file ABC.php cùng thư mục với file vd06.php nhé


Sau đó chúng ta chạy file vd06.php trên localhost được kết quả như sau:
Xin chào các bạn! đã xem ictsharing.com
Thật kỳ diệu phải không nào?
Vậy tại sao lại vậy các bạn hiểu thế này nhé:
 Khi truy cập vào vd06.php -> Khi khởi tạo hàm $a = new ABC thì ngay lập tức kích hoạt hàm __autoload($url) trường hợp này autoload sẽ lấy tên ABC để đưa vào trong như một biến $url khi đó chúng ta require cái biến $url chính là file ABC.php .
Bên cạnh đó, bên trong trang ABC có phương thức test, nhiệm vụ của phương thức test này là show ra "Xin chào các bạn! đã xem ictsharing.com". 
Như vậy chúng ta sử dụng autoload không cần phải require một file nào đó như cách lập trình thông thường. 
Với cách lập trình thông thường khi cần sử dụng đối tượng nào đó chúng ta phải reguire file chứa phương thức đó. Như vậy chỉ sử dụng một đối tượng mà phải load cả file đó thì tốn rất nhiều tài nguyên thay vì sử dụng autoload.

=> Bản chất của autoload là chỉ khi chúng ta khởi tạo đối tượng thì nó mới chạy, điều đó có nghĩa khi chúng ta khởi tạo nó mới đi làm việc. Khi nào cần file nào thì mới làm việc chứ không phải chúng ta require hết một loạt file trước như cách lập trình thông thường.

Phương pháp này được sử dụng phổ biến ở các framework như codeigniter hay laravel ... sau này chúng ta học tới sẽ rõ hơn.


=> Như vậy Lazi loading là gì?
Là phương pháp tử động nạp file từ bên ngoài vào khi khởi tạo đối tượng, để sử dụng phương pháp này phải tuân thủ một số các chuẩn mực như đặt tên... Nếu không sẽ không sử dụng được.

Cú pháp là:
 function __autoload(){    // do something     }

Xem thêm

Clone - Đối tượng nhân bản trong hướng đối tượng PHP - Bài 7

16:10 0
Ở phần này, ta tiếp tục tìm hiểu qua về khái niệm nhân bản, đồng thời hiểu được bản chất của vấn đề. Tại sao lại phải sử dụng từ khóa clone trong ứng dụng ?
Ví dụ dưới đây sẽ cho ta hiểu hơn nhé:


Kết quả là 500. Tại sao lại bằng 500 thì trên hình mình đã giải thích rồi các bạn đọc qua hình nhé.

Để hiểu thực tế thì liên tưởng như sau:
 Tôi đi thuê một ngôi nhà có giá trị 1000$ sau đó bạn tôi qua chơi uống rượu phê lấy búa đập một bức tưởng mất 500$. Trong trường hợp này thì bạn tôi cũng như tôi phải mất 500$ đền cho nhà chủ vì đều làm ảnh hưởng tới ngôi nhà đó. Nhưng thực tế bài toán phải giải là thằng nào đập thằng đó phải đền chứ.

Vậy làm sao để khắc phục nó thì thằng b buộc phải khởi tạo thêm đối tượng làm tốn rất nhiều tài nguyên dẫn tới ứng dụng chạy chậm.
$b = new ABC;
Dẫn tới không khả thi.

=> Để giải quyết bài toàn này chúng ta cần phải sử dụng bài toán đối tượng nhân bản Clone trong lập trình hướng đối tượng.

Ví dụ:


Kết quả là 1000

Ví dụ 2:


Kết quả là: ictsharing.com chứ không phải là ictsharing do hành động bị set_name thứ 2 đè vào.

Khi ta thêm từ khóa clone vào thì lúc này b làm gì thì kệ b giá trị a ban đầu không thay đổi vẫn là ictsharing. 
Xem code trên hình sau:

Thông qua 2 ví dụ trên hy vọng sẽ giúp các bạn hiểu hơn về nhân bản clone trong php. Giúp tiết kiệm tài nguyên hơn khi chúng ta làm việc.

Xem thêm

Khái niệm static và const trong PHP - Bài 6

15:25 0
Ở phần này, ta sẽ tìm hiểu về phương thức tĩnh, thuộc tĩnh trong hướng đối tượng. Qua đó ta cũng phân biệt được sự khác nhau giữa thuộc tính thường và thuộc tính tĩnh. Đồng thời cũng nắm thêm về khái niệm hằng trong hướng đối tượng sẽ vận dụng như thế nào.

Phương thức tĩnh - Thuộc tính tĩnh - Hằng

Ta khai báo: 
Static $name  // biến là thuộc tính tĩnh
Static function test(){   ...  } // phương thức tĩnh
 Để có thể sử dụng và truy cập được các thuộc tính hay phương thức tĩnh ta phải sử dụng từ khóa:
Self::$name;
Self::test(); 
 Đó cũng là sự khác biệt giữa các thuộc tính và phương thức thường với tĩnh.

 => Sự khác biệt giữa thuộc tính - phương thức tĩnh với thường là gì?
- Bản chất thuộc tính tĩnh là chúng ta có thể truy xuất mà không cần khởi tạo một đối tượng chỉ cần chúng ta biết tên lớp:
ABC::$name;
ABC::test();
 - Phương thức thường và thuộc tính thường khi chúng ta muốn sử dụng bắt buộc phải khởi tạo đối tượng và từ đối tượng mới có thể truy cập được các phương thức và thuộc tính này.

Ví dụ:

(*) Phương thức và thuộc tính thông thường


Kết quả: ABCDABCD

(*) Phương thức và thuộc tính TĨNH
Đối với phương thức và thuộc tĩnh tĩnh chúng ta không cần phải khởi tạo đối tượng như hình dưới đây

Như vậy thuộc tính tĩnh khác thuộc tính thường ở những điểm sau:
 - Thuộc tính tĩnh khi muốn truy cập, sử dụng các phương thức khác phải sử dụng từ khóa Self, thay vì thuộc tính thường sử dụng từ khóa This.
 - Bản thân thuộc tính tĩnh không cần khởi tạo đối tượng vẫn có thể truy cập được những thuộc tĩnh này, thậm chí phương thức cũng vậy.

Vậy khi nào chúng ta nên sử dụng thuộc tính tĩnh?
- Khi thuộc tính hay một phương thức mà chúng ta có nhu cầu sử dụng nhiều, khi chúng ta sử dụng mỗi lần lại phải khởi tạo nhiều lần tốn rất nhiều tài nguyên thì chúng ta phải gán nó về thuộc tính hay phương thức tĩnh để giải quyết bài toán một cách dễ dàng.

Hằng thì sao?
 Chúng ta sử dụng từ khóa const để khai báo Hằng.
ví dụ:
 const RED;
muốn sử dụng Hằng trong những phương thức thì chúng ta dùng từ khóa Self giống như thuộc tính tĩnh.
Self:RED;
ví dụ:
 ABC::RED;
 ==> Vậy Hằng và thuộc tính tĩnh khác nhau ở điểm nào?
- Thuộc tính tĩnh thì dấu * vẫn là một thuộc tính, khi nó là thuộc tính thì nó vẫn có thể thay đổi được.
- Trong đó Hằng là loại giá trị bất biến mà nó không thể thay đổi được.

Ví dụ cách sử dụng Hằng:


Xem thêm

Thứ Năm, 3 tháng 1, 2019

Từ khóa parent và final trong hướng đối tượng PHP - Bài 5

18:15 0
Tiếp theo, Chúng ta sẽ nói tới 2 từ khóa quan trọng là parentfinal. Thông qua việc vận dụng 2 từ khóa này, chúng ta sẽ hiểu được thêm về khái niệm ghi đè trong hướng đối tượng ra sao.

(*) parent :
Parent::Ten_phuong_thuc();

Khi chưa có từ khóa Parent này sẽ cho ra kết quả là:
Teacher
Nó sẽ ưu tiên nhận lớp gần nó nhất, Ngược lại khi có thêm parent vào thì nó sẽ nhận thêm cả lớp cha.

Kết quả là:
ictsharing.comTeacher
 Như vậy từ khóa Parent là từ khóa khắc phục sự kiện ghi đè xẩy ra và chỉ có tác dụng một cấp cha.

(*) final : Hạn chế tối đa việc ghi đè
- Khi chúng ta khai báo một phương thức là final thì không có một phương thức nào có thể override(ghi đè lại được).
Như ví dụ trên, nếu chúng ta cho từ khóa final vào thì nó sẽ hiểu rằng đó là lớp cuối cùng rồi không được kế thừa nữa từ đó dẫn tới bị lỗi.


Kết quả trả về sẽ báo không được ghi đè:
 Fatal error: Class BCD may not inherit from final class (ABC) in E:\xampp\htdocs\hocphp\hocmvc\vd03.php on line 24

 Vậy phần này chúng ta nắm được cách ghi đè và cách chống ghi đè.
=> Final là không cho phép phương thức đó bị ghi đè, nghĩa là chỉ cần ở lớp cha có từ khóa final là lớp đó sẽ không được kế thừa và ghi đè.

Nghĩa là: Cho phép phương thức nào đó là phương thức cuối cùng. Cho phép lớp nào đó là lớp cuối cùng

Xem thêm

Kế thừa trong hướng đối tượng PHP - Bài 4

17:38 0
Tiếp tục ở phần này. Ta tìm hiểu về sự kế thừa trong hướng đối tượng, kế thừa chính là yếu tố quan trọng và đóng vai trò mấu chốt của hướng đối tượng. Vận dụng sự kế thừa như nào để đạt được hiểu quả cao nhất trong việc viết ứng dụng.

Cú pháp:
 Class con extends cha{      }
Điểm nhấn:
 - Khi lớp con kế thừa lớp cha, thì có thể sử dụng lại tất cả những phương thức và thuộc tính của lớp cha. Miễn là chúng không mang cơ chế private.
 - Chỉ có lớp con mới có thể sử dụng được những thuộc tính và phương thức của lớp cha. Một lớp con chỉ có thể kế thừa được một lớp Cha.

Ví dụ:

Kết quả sau khi chạy là:
ABCDBCDECDEFDEFI

Xem thêm

Các cơ chế trong hướng đối tượng - Bài 3

17:17 0
Ở phần này, ta sẽ cùng tìm hiểu về 3 cơ chế quan trọng trong hướng đối tượng là public, protected, private. Qua đó ta phân biệt sự khác nhau giữa chúng đồng thời có thể vận dụng chúng một cách hiệu quả khi làm việc với hướng đối tượng.

(*) Public: 
 Có thể sử dụng những đối tượng để truy cập vào phương thức và thuộc tính mang cơ chế này. Dĩ nhiên nó hỗ trợ sự kế thừa.

(*) protected:
 Không thể sử dụng những đối tượng để truy cập vào các phương thức và thuộc tính, nó hỗ trợ sự kế thừa.

(*) Private:
Không thể sử dụng những đối tượng để truy cập vào các phương thức và thuộc tính, không hỗ trợ sự kế thừa.

Ví dụ:

Khi chạy ra kết quả là: ABCD

Thay đổi thành:
 echo $a->bcd
Kết quả lỗi
Fatal error: Uncaught Error: Cannot access protected property ABC::$bcd in E:\xampp\htdocs\hocphp\hocmvc\vd02.php:28 Stack trace: #0 {main} thrown in E:\xampp\htdocs\hocphp\hocmvc\vd02.php on line 28
Thay đổi thành:
 echo $a->cde
Kết quả lại càng không thể truy cập được vì là private
Fatal error: Uncaught Error: Cannot access private property ABC::$cde in E:\xampp\htdocs\hocphp\hocmvc\vd02.php:28 Stack trace: #0 {main} thrown in E:\xampp\htdocs\hocphp\hocmvc\vd02.php on line 28

Mỗi cơ chế có cách sử dụng riêng, khi sử dụng các bạn chú ý để sử dụng nó phù hợp hơn
Xem thêm

Lập trình hướng đối tượng trong PHP - bài 1

16:22 0
Sự có mặt của lập trình hướng đối tượng, đã giúp cho ngôn ngữ PHP trở nên linh động và uyển chuyển hơn rất nhiều so với phương pháp lập trình thủ tục. Với cách viết và làm việc theo hướng đối tượng sẽ phần nào giúp cho mã nguồn của bạn trở nên trong sáng. Và quan trọng nhất vẫn là tính dễ mở rộng, phát triển ứng dụng.

Lập trình hướng đối tượng cũng là bài học quan trọng nhất trong toàn khóa học PHP Nâng cao, vì nó mở ra kiến thức nền cho việc nghiên cứu các kiến thức cao hơn như làm việc với các PHP Framework.

==> Vậy tại sao phải lập trình hướng đối tượng?
Khi chúng ta làm một dự án lớn mà không sử dụng lập trình hướng đối tượng thì rất khó để cùng nhau làm việc. Lập trình hướng đối tượng sẽ giúp ráp code lại với nhanh dễ dàng hơn.
Ngoài ra, đối với phương pháp lập trình thông thường thì việc nâng cấp rất khó khăn. 

Tóm lại lập trình hướng đối tượng qua các từ khóa:
 + Dễ mở rộng
 + Dễ nâng cấp
 + Thao tác chuẩn mực

I. Khái niệm:
- Lập trình hướng đối tượng (gọi tắt là OOP - object-oriented programming) là một kĩ thuật lập trình hỗ trợ công nghệ đối tượng. Nếu như trước kia là các kiểu lập trình hướng thủ tục, hướng modun,.. thì giờ đây thế giới đang hướng về sử dụng hướng đối tượng. Nếu như trước đây chúng ta lập trình với hướng thủ tục thì sẽ chia thành các hàm để xử lý, thì giờ đây khi sử dụng hướng đối tượng thì chúng ta sẽ chia ra thành các đối tượng để xử lý.

VD: Mình sẽ ví dụ với mọi người về một bài toán lấy ra tên tuổi của một nhân viên bằng hai phương pháp:

Lập trình hướng thủ tục.
function getPersonnel()
{
    $name = 'Vu Van A';
    $age = 32;
    return $name . '-' . $age;
}
Lập trình hướng đối tượng -OOP
<?php

class Personnel
{
    private $name = 'Vu Van A';
    private $age = 32;

    public function getPersonnel()
    {
        return $this->name . '-' . $this->age;
    }
}
(*) Thuộc tính (đặc điểm để nhận dạng ra sự vật):
  Là những biến được khởi tạo trong một lớp có kèm theo những cơ chế.

(*) Phương thức (hành động):
 Là những hàm được khởi tạo trọng một lớp và có kèm theo những cớ chế.

(*) Lớp (Tổng hợp đóng gói):
 Là sự đóng gói các phương thức và thuộc tính với nhau.

(*) Đối tượng:
 Là sự thể hiện lại của một lớp.

II. Ưu điểm
-Vì lập trình hướng đối tượng ra đời sau nên nó khắc phục được tất cả các điểm yếu của các phương pháp lập trình trước đó. Cụ thể nó các ưu điểm sau:
  • Dễ dàng quản lý code khi có sự thay đổi chương trình.
  • Dễ mở rộng dự án.
  • Tiết kiệm được tài nguyên đáng kể cho hệ thống.
  • Có tính bảo mật cao.
  • Có tính tái sử dụng cao.

Xem thêm

Hàm khởi tạo và hủy trong hướng đối tượng - bài 2

16:16 0

Tiếp tục ở phần này, chúng ta sẽ cùng tìm hiểu về khái niệm __construct() và __destruct(). Đây được xem là 2 hàm magic method, là dạng phương thức đặc biệt, chúng sẽ tự động được gọi khi các bạn tiến hành khởi tạo 1 đối tượng.

1. Hàm  __construct()
- Phương thức khởi tạo là một phương thức mà khi chúng ta khởi tạo một class thì nó luôn được gọi kèm theo. Phương thức khởi tạo cũng sử dụng được đầy đủ chức năng của các phương thức bình thường khác trong class và trong một class có thể có hoặc không có phương thức khởi tạo.

- Trong PHP có hỗ trợ chúng ta 2 cách khai báo phương thức khởi tạo:

Cách 1: Khai báo trùng với tên của class (PHP version > 7x không hỗ trợ nữa).
VD:
class Abc
{
    //Khai báo phương thức khởi tạo
    public function Abc()
    {
        echo 'Class ABC được khởi tạo';
    }
}

new Abc();
//kết quả: Class Abc được khởi tạo
Cách 2: Khai báo phương thức có tên  __construct()
VD:
class Abc
{
    public function __construct()
    {
        echo 'Class Abc được khởi tạo';
    }
}

new Abc();
//kết quả: Class Foo được khởi tạo
2. Hàm  __destruct()


- Phương thức hủy trong class sẽ được gọi khi class đó được hủy. Nó thường dùng để giải phóng tài nguyên của một class và trong một class có thể có hoặc không có phương thức hủy.
- Để khai báo phương thức hủy trong class thì chúng ta chỉ cần khai báo phương thức có name là __destruct().
VD:
class Abc
{
    public function __destruct()
    {
        echo 'Class Abc được hủy';
    }
}

$abc = new Abc();
//kết quả: Class Abc được hủy
Khi mà một class có đầy đủ phương thức khởi tạo và phương thức hủy thì sẽ như sau:
class Abc
{
    public function __construct()
    {
        echo 'Class Abc được khởi tạo';
    }

    public function getMessage()
    {
        echo 'Đây là class Abc';
    }

    public function __destruct()
    {
        echo 'Class Abc được hủy';
    }
}

$abc = new Abc();
//kết quả: Class Abc được khởi tạo
$abc->getMessage();
//kết quả: Đây là class Abc
//kết quả: Class Abc được hủy
3. Phương thức khởi tạo và Hủy trong kế thừa
- Khi một class có phương thức khởi tạo và phương thức hủy kế thừa từ một class cũng có phương thức khởi tạo và phương thức hủy thì phương thức khởi tạo và phương thức hủy sẽ nhận của class được kế thừa.
VD:
class Bar
{
    public function __construct()
    {
        echo 'Class Bar được khởi tạo';
    }

    public function __destruct()
    {
        echo 'Class Bar được hủy';
    }
}

class Foo extends Bar
{
    public function __construct()
    {
        echo 'Class Foo được khởi tạo';
    }

    public function __destruct()
    {
        echo 'Class Foo được hủy';
    }
}

$foo = new Foo();
//Kết quả: Class Foo được khởi tạo
//kết quả: Class Foo được hủy
- Nếu như bạn muốn sử dụng được phương thức khởi tạo và phương thức hủy trong class cha thì bạn chỉ cần gọi lại phương thức đó của lớp cha.
VD:
class Bar
{
    public function __construct()
    {
        echo 'Class Bar được khởi tạo';
    }

    public function __destruct()
    {
        echo 'Class Bar được hủy';
    }
}

class Foo extends Bar
{
    public function __construct()
    {
        //gọi phương thức khởi tạo của class cha
        parent::__construct();
        echo 'Class Foo được khởi tạo';
    }

    public function __destruct()
    {
        //gọi phương thức hủy của class cha
        parent::__destruct();
        echo 'Class Foo được hủy';
    }
}

$foo = new Foo();
//Kết quả: Class Bar được khởi tạo
//Kết quả: Class Foo được khởi tạo
//kết quả: Class Bar được hủy
//kết quả: Class Foo được hủy
==> Trong thực tế thì phương thức khởi tạo được sử dụng rất nhiều còn phương thức hủy thì hầu như không sử dụng.
Xem thêm

Post Top Ad

Your Ad Spot