Tuesday, July 29, 2008

Reference Magic


Php-er,

Kali ini gw akan bahas ttg reference variable. Ok, mungkin udah byk yg tau dan gunain. Moga aja ini bisa refresh akan kegunaan dan kehandalannya. Heheheeh oke emg hebat nya dimana seh? Hebatnya reference variable value nya bukan hasil copy, jadi seperti alias saja, dan ngebantu banget utk nulis code yg rapi.


Contoh:

---------------------------------------------------------------------------
function testReference(&$refVar){

$refVar++;
}

function testNonReference($nonRefVar){

$refVar++;
}

$var1 = 0;
$var2 = 0;

testReference($var1);

testNonReference($var2);

echo $var1;
echo $var2;

---------------------------------------------------------------------------
Output:
1
0




Gimana ngerti? Fungsi testReference tidak mengembalikan value tetapi $var1 dari 0 menjadi 1. Mengapa $var1 brubah dan $var2 tidak? Begini utk testReference parameter nya adalah &$refVar dimana refVar hanyalah "alias" dari $var1 jadi mereka itu terletak di alamat memory yg sama, ini bahasa susah nya, gampang nya lain nama tapi 1 item. Jadi apapun perubahan $var1 begitu pula dgn $refVar wonk mereka 1.

Lain hal nya $var2 dgn $nonRefVar sbg paramater nya testNonReference. Value dair $var2 di copy ke variable baru yg namanya $nonRefVar, jadi mereka lain nama lain item juga. Bahasa susah nya $var2 memliki alamat memory yg berbeda dgn $nonRefVar.
Dan apapun perubahan yg terjadi di $var2 tidak langsung mngubah $nonRefVar, bgt pun sebaliknya.

Kalo masih juga ga ngerti hummm... mending merujuk ke manual nya php.net smoga lo lbh bs ngerti dari baca manual ketimbang artikel gw. Anyway gw blm kasih liat kehebataanya ok ini dia. Yang pertama adalah reference tidak mengcopy value source variable nya ke variable yg dituju, disini adl si "alias"nya. Jadi mengurangi waktu proses pastinya dan reference bisa bantu kita utk coding lbh rapi.


Donlod oracleDb.php di artikel sebelumnya. Dan ini perbaikan utk lbh jadi rapi dan pendek.

kalo dulu deklarasi sendQuery(string $query, boolean $isFetch, boolean $isDebug)
maka skg akan digantikan. Oleh execFetchQuery(string $query, integer &$nrows, array &$result, boolean $isDebug = _IS_DEBUG)
dgn $isDebug default. Penggunaan nya

$query = "SELECT * ".
"FROM MY_DB ";
execFetchQuery($query,
$nrowsMyQuery,
$resultMyQuery);

if($nrowsMyQuery > 0){

echo $resultMyQuery["MY_FIELD"][0];
}else{

/* Bla bla bla... */
}


Thats the magic work, pertama $nrowsMyQuery di passed by reference jadi proses yg terjadi di dlm fungsi execFetchQuery() akan mempengaruhi langsung $nrowsMyQuery.
Dan execFetchQuery sendiri proses nya adalah:


function execFetchQuery($query,
&$nrows,
&$result,
$isDbg = _IS_DEBUG){

/* Bla bla bla..*/

$s = OCIParse($this->conn, $query);
$r = @OCIExecute($s, OCI_DEFAULT);

/* Bla bla bla..*/

$nrows = oci_fetch_all($s, $result);

/* Bla bla bla..*/
}


Di dlm fungsi nya ga ada nama $nrowsMyQuery dan fungsi hanya return value true utk success dan false kalo failed. Lohh jadi hasil yg di passed ke $nrowsMyQuery dan $resultMyQuery dari mana??? Nah liat tuh parameter fungsi nya &$nrows dan &$result.
Jadi $nrows adl "alias"nya dari $nrowsMyQuery dan jg utk $result. Gimana? Mantap!!!

Sekiranya article ini bisa membantu. Gbu...

Coding for life, coding with ethic.

No comments: