Những cách để code PHP nhìn ngon nghẻ hơn – Vantien’s blog

Hello anh em. Hôm nay thì mình sẽ giới thiệu cho anh em một vài những cách (trick thì có vẻ đúng hơn) sẽ giúp cho bạn có thể code PHP ngon nghẻ hơn. Tất nhiên là nếu bạn không áp dụng thì code sẽ vẫn chạy bình thường nhưng nếu ai muốn kiểu trông nó xịn xò cũng như giúp bạn viết code nhanh, rõ ràng hơn thì có thể áp dụng nhé.

Sử dụng toán tử Null coalescing

Mình đảm bảo với các bạn là toán tử này cực kỳ hữu dụng luôn. Ít nhất là đối với mình, bởi vì mình rất hay sử dụng nó trong việc kiểm tra biến đã được khai báo hay chưa trước khi xử lý. Toán tử này xuất hiện từ phiên bản PHP 7.0 nên có thể bạn cũng biết nó đấy.

Giả sụ như bạn có một mảng như sau:

$someArray = ['one' => 'foo', 'two' => 'bar'];

Và bạn muốn kiểm tra xem một biến đã được khai báo hay chưa hay là kiểm tra xem phần tử của mảng này có tồn tại hay không. Nếu không thì trả về 1 chuỗi gì đó chẳng hạn. Mình chắc là các bạn hay dùng if … else hoặc là cú pháp như sau:

$one = isset($someArray['one'] ? $someArray['one'] : 'empty'; 
// 'foo'
$three = isset($someArray['three'] ? $someArray['three] : 'empty';
// 'empty'

Tuy nhiên, toán tử Null coalescing vô cùng hữu ích trong trường hợp này. Bạn chỉ cần làm như sau:

$one = $someArray['one'] ?? 'empty'; 
// 'foo'
$three = $someArray['three] ?? 'empty';
// 'empty'

Tất nhiên, nó cũng hoạt động với 1 biến chưa được khai báo nữa đấy nhé. Hãy thử xem sao.

Traits

Thằng cu trait này mình thấy nó được sử dụng rất nhiều. Mình tin chắc rằng bạn đã từng dùng qua nó (hoặc ít nhất là có thể là từng nhìn thấy nhưng không biết). Đầu tiên giới thiệu về em nó trước đã. Vậy trait là cái vẹo gì? Hiểu một cách đơn giản thì traits nó là một tập hợp các function mà chỉ cần 1 vài động tác nhỏ bạn đã có thể khiến cho những class khác sử dụng được những function đấy. Nó thì có vẻ khó hiểu nên là cùng xem ví dụ nhé:

Ví dụ như tin tức và sản phẩm đều thuộc về người dùng chẳng hạn. Vậy mình muốn lấy ra người đăng bài thì mình sẽ viết như sau:

class New
{
	public function getUser()
	{
		return $this->user;
	}
}

class Product
{
	public function getUser()
	{
		return $this->user;
	}
}

Ở đây bạn có thể thấy là function getUser đang bị trùng lặp đúng không. Giả dụ như có thêm nhiều thứ khác như sách, tag, danh mục,… cũng thuộc về người dùng và mình cũng cần lấy ra người dùng cho bọn nó thì sao? Như vậy code sẽ bị trùng lặp rất nhiều. Trait bước tới và…bùmmmmmm:

trait Userable
{
	public function getUser()
	{
		return $this->user;
	}
}

class New
{
	use Userable;
}

class Product
{
	use Userable;
}

Như vậy là dù có bao nhiêu thằng khác đi chăng nữa thì cũng không vấn đề gì cả đúng không. Rất nhanh và cũng dễ để maintain nữa đấy nhé.

À, lưu ý là Trait sẽ được ưu tiên hơn kế thừa đấy nhé.

array_map, array_filter

Mình cũng đã từng code Javascript một thời gian (NodeJS, Vuejs) nên là mình thấy là việc sử dụng function map, filter trong JS phổ biến hơn nhiều so với trong PHP. Mình thấy các project PHP mình tham gia thì người ta thường có xu hướng dùng vòng lặp các kiểu để xử lý mảng. Trong khi là 3 function này rất là hữu hiệu trong một vài các case xử lý mảng.

array_map()

Đầu tiên là array_map(), nó cho phép chúng ta lặp qua từng phần tử trong mảng, tương tác với phần tử đò và trả về một mảng mới. Ví dụ mình có một bài như sau:

Cho mảng [‘one’, ‘two’, ‘three’, ‘four’], hãy tạo ra một mảng mới với các phần tử là uppercase của mảng đó.

Nếu như dùng vòng lặp thông thường thì mình sẽ xử lý như sau:

$myArray = ['one', 'two', 'three', 'four']; 
$uppercaseArray = [];
foreach ($myArray as $item) { 
  $uppercaseArray[] = strtoupper($item);
}
//['ONE', 'TWO', 'THREE', 'FOUR']

Nếu như bạn dùng hàm array_map() trong PHP thì sẽ như sau:

$myArray = ['one', 'two', 'three', 'four']; 
$uppercaseArray = array_map(
	function($item) {
		return strtoupper($item);
	}, 
 	$myArray
);
//['ONE', 'TWO', 'THREE', 'FOUR']

array_filter()

array_filter đúng như tên của nó, nó cho phép chúng ta filter các phần tử trong mảng và sau đó trả về 1 mảng mới phù hợp với điều kiện.

Lại 1 ví dụ tiếp nhé. Bạn có 1 mảng số như sau: [1, 2, 3, 4, 5, 6, 7], giờ đây bài toán là trả về cho mình 1 mảng các số chia hết cho 2.

Nếu như dùng vòng lặp thông thường thì chúng ta sẽ code như sau:

$myArray = [1, 2, 3, 4, 5, 6, 7]; 
$filteredArray = [];
foreach ($myArray as $item) { 
	if ($item % 2 === 0) { 
		$filteredArray[] = $item;
	}
}
// [2, 4, 6]

Còn nếu như chúng ta dùng array_filter thì sao?

$myArray = [1, 2, 3, 4, 5, 6, 7]; 
$filteredArray = array_filter(
  $myArray,   
  function($item) { return $item % 2 === 0; }
);
// [2, 4, 6]

Destructuring arrays

Thật ra thì mình cũng ko biết dịch nó ra như thế nào nữa. Nếu như bạn biết hàm list() trong PHP thì hiểu đơn giản là nó có công dụng giống như hàm này nhưng ngắn gọn hơn.

Ví dụ bạn có 1 mảng bao gồm 2 mảng con khác là: mảng user và mảng product. Và bạn muốn gán 2 mảng này với 2 biến lần lượt là $users và $products. Hãy cùng xem nhé…

$array = [
    [
        'user1',
        'user2',
        'user3',
    ],
    [
        'product1',
        'product2',
        'product3',
    ],
];

Nếu như cách thông thường:

$users = $array[0];
$products = $array[1];

Nếu như sử dụng arrays destructuring thì sao?

[$users, $products] = $array;

Sao nào, vô cùng đơn giản và nhanh gọn đúng không. Hãy áp dụng nó nhiều hơn nhé!

Sử dụng finally cho try/catch

Chắc ai cũng đã sử dụng hay biết đến try/cacth rồi nhỉ. Nhưng mình tin rằng thằng cu finally này sẽ rất ít người biết đến đó.

Nó được đặt ở sau try/catch và tác dụng của nó là thực thi sau khi 1 trong 2 đứa nó được thực thi. Tức là finally sẽ chạy kể cả code có chạy thành công trong try hay vì một lý do gì đó mà code bị lỗi và bị vào catch.

Ví dụ bạn có 1 đoạn code đọc file và kể cả thành công hay thấy bại thì mình cũng phải close file đấy lại:

$file = fopen('log.txt', 'a');

try {
    fwrite($file, 'Throwing exception..');
    throw new \Exception();
} catch (\Exception $e) {
    echo 'Threw a RangeException: ' . $e->getMessage();
} finally {
    // Always make sure that we close the file
    echo 'Reached the finally block';
    fwrite($file, 'Reached the finally block');
    fclose($file);
}

Hết rồi

Mình mong rằng bài viết này sẽ giúp cho bạn có thể code PHP một cách ngon lành, nhanh chóng hay có thể là trông “ngầu hơn”.

Xin chào tạm biệt và hẹn gặp lại trong những bài viết lần sau!!!

Đừng quên xem nguồn: https://medium.com/@ger86/php-8-tricks-that-will-help-you-write-cleaner-code-374c71daffb6