使用變數讀取 property 取代 if else

傳統我們會使用 if else 判斷,讀取不同的 property,但由於 ECMAScript 與 PHP 動態語言的特性,我們可以將要讀取的 property 名稱以變數表示,直接以該變數讀取 property。

Version


ECMAScript 5
PHP 7.0

ECMAScript


if else
傳統若要根據不同的條件,讀取不同 property,我們會使用 if else方式 :

1
2
3
4
5
6
7
8
9
10
11
12
13
function User(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

var type = 'first';

var user = new User('Sam', 'Xiao');
if (type === 'first') {
console.log(user.firstName);
} else {
console.log(user.lastName);
}

第 9 行

1
2
3
4
5
if (type === 'first') {
console.log(user.firstName);
} else {
console.log(user.lastName);
}

使用 if else 去判斷變數值,讀取不同 property。

Variable
若將 property 名稱使用變數表示,則不需使用 if else 判斷 :

1
2
3
4
5
6
7
8
9
10
11
function User(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

var type = 'first';

var user = new User('Sam', 'Xiao');
propName = (type === 'first') ? 'firstName' : 'lastName';

console.log(user[propName]);

第 9 行

1
2
3
propName = (type === 'first') ? 'firstName' : 'lastName';

console.log(user[propName]);

判斷 type,並將要讀取的 property 名稱存入 propName 變數。

在 ECMAScript,若要執行物件的 method,有以下3種方式 :

  1. object.property
  2. object[‘property’] : 其中 ‘property’ 是字串
  3. object[property] : 其中 property 是變數

因為第 3 種方式,我們可以將 property 名稱以變數方式傳入 []

PHP


PHP 也可以達到類似 ECMAScript 的功能。

if else
傳統若要根據不同的條件,讀取不同 property,我們會使用 if else方式 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class User
{

/** @var string */
public $firstName;
/** @var string */
public $lastName;

/**
* User constructor.
* @param string $firstName
* @param string $lastName
*/

public function __construct(string $firstName, string $lastName)
{

$this->firstName = $firstName;
$this->lastName = $lastName;
}
}

$type = 'first';

$user = new User('Sam', 'Xiao');
if ($type === 'first') {
echo($user->firstName);
} else {
echo($user->lastName);
}

第 23 行

1
2
3
4
5
if ($type === 'first') {
echo($user->firstName);
} else {
echo($user->lastName);
}

使用 if else 去判斷變數值,讀取不同 property。

Variable
若將 property 名稱使用變數表示,則不需使用 if else判斷 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class User
{

/** @var string */
public $firstName;
/** @var string */
public $lastName;

/**
* User constructor.
* @param string $firstName
* @param string $lastName
*/

public function __construct(string $firstName, string $lastName)
{

$this->firstName = $firstName;
$this->lastName = $lastName;
}
}

$type = 'first';

$user = new User('Sam', 'Xiao');
$propName = ($type === 'first') ? 'firstName' : 'lastName';

echo($user->$propName);

第 23 行

1
2
3
$propName = ($type === 'first') ? 'firstName' : 'lastName';

echo($user->$propName);

判斷 $type,並將要讀取的 property 名稱存入 $propName 變數。

在 PHP,允許我們在 -> 之後直接加上變數,代表要執行的 property。

Conclusion


  • ECMAScript 與 PHP 都允許我們將欲讀取的 propety 名稱以變數表示。
  • 因為 property 名稱是字串,所以我們可以將 property 名稱存在設定檔內,如 config/app.php,將來若因為需求改變,須改變讀取的 property 時,只需修改設定檔即可,並透過 config::get() 讀取 property 名稱,原來程式碼完全不用修改,達到開放封閉原則的要求。

Sample Code


完整的範例可以在我的 GitHub 上找到。

2016-06-07