초기의 PHP 는 사용자들의 요구에 맞게 다양한 C 라이브러리를 언어에 포함시켰으며 C 라이브러리 사용자를 고려하여 함수 이름 일치, 파라미터의 순서 일치등 최대한 호환성 확보에 노력을 기울였습니다.


이런 점은 기존 C 라이브러리 사용자들이 쉽게 PHP 에 적응할 수 있게 하는 장점이 있었지만 반대로 일관성이 없다는 단점을 만들게 되었습니다.

실제로 PHP 를 싫어하는 개발자들의 주요 이유중에 하나는 일관성 없는 문법과 라이브러리 사용이기도 합니다.


예로 html_entity_decode 함수와 쌍을 이루는 함수는 htmlentities 이며 문자를 소문자로 바꾸는 함수는 to 를 사용하여 strtolower 이지만 헥사 문자열을 바이너리로 바꾸는 함수는 hex2bin 입니다.

파일이 있는지 확인하는 함수는 file_exist 이지만 파일을 여는 함수는 fopen 입니다.


이런 일관성 결여는 PHP 를 사용할 때 개발자를 혼란스럽게 하고 생산성이 떨어지며 자주 쓰지 않는 함수를 사용할 경우 매번 매뉴얼을 찾게 만들고 코딩 실수를 유발하는 원인이 되었습니다.


라라벨은 기존 PHP 함수에 대해 일관성있는 이름의 래퍼를 제공하고 기능을 확장 시켰습니다. 예로 파일 시스템을 다루는 함수는 Storage 클래스에 통합하고 이를 통해 파일이 로컬에 있든 아마존 클라우드에 있든 상관없이 일관성있게 사용할 수 있습니다.

<?php
// 아마존 S3 클라우드 디스크 객체 반환
$s3disk = Storage::disk('s3');

// 로컬 디스크 객체 반환
$localDisk = Storage::disk('local');
 
// 로컬 디스크에서 file.jpg 존재 여부 확인
$exists = $localDisk ->exists('file.jpg');
 
// 아마존 스토리지 파일의 마지막 변경 일시 확인
$time = $s3disk->lastModified('file1.jpg');
PHP


또 사용할 때마다 혼란스러운 PHP 의 배열에 대해서 헬퍼 함수를 제공하고 있으므로 편리하게 사용할 수 있습니다. 기존 PHP 에서 배열에 요소를 추가할 경우 array_push() 를 사용하지만 key/value 구조를 바로 넣을 수는 없습니다.

array_add1.php

<?php
$array = ['foo' => 'bar'];
 
// 배열에 key => value 형식으로 요소 추가
array_push($array, 'key', 'value');
 
var_dump($array);
PHP

위 소스를 실행하면 의도와는 달리 keyvalue 라는 값이 각각 배열의 요소로 들어간 것을 확인할 수 있습니다.

$ php array_add1.php


.array(3) {
'foo' =>
string(3) "bar"
[0] =>
string(3) "key"
[1] =>
string(5) "value"
}

의도대로 동작하도록 코딩하려면 $array['key'] = 'value';  구문을 사용해야 합니다. 

이렇게 배열에 요소를 추가할 경우 array_push 를 사용하지만 배열에 key/value 요소를 추가할 경우 다른 문법을 사용해야 하는 건 코딩의 일관성을 떨어뜨리고 코딩 실수를 유발할수 있는 문제가 있습니다.


라라벨은 PHP 의 기본 함수중 일관성이 떨어지는 함수들에 대해 헬퍼(Helper) 함수를 제공하고 있습니다.

배열내 키가 존재하지 않을 경우 요소를 추가하는 array_add 헬퍼를 제공하므로 배열에 요소를 추가할 경우 다음과 같이 일관성 있게 코딩할 수 있습니다.

<?php
 
$array = ['foo' => 'bar'];
/**
array:2 [
  "foo" => "bar"
  "key" => "value"
]
*/
$array = array_add($array, 'key', 'value');
PHP


클래스와 메소드에 대해서는 언더바(_) 를 지양하고 카멜케이스(camelCase) 를 권장하고 있으므로 이에 익숙해지면 다른 개발자와 협업이 쉬워지며 가독성있고 간결한 코드를 작성할 수 있으며 이를 통해 생산성을 높이고 버그 발생 가능성을 줄일 수 있습니다.