ใช้ function end, explode แล้วแจ้ง Error “Strict Standards: Only variables should be passed by reference”

ปัญหานี้โดยปกติแล้ว PHP ต่ำกว่า 5.3 จะไม่เจอนะครับ มันจะมาเจอตอนหลัง เนื่องจากมัน strict หรือพูดเป็นภาษาบ้านๆว่า มัน “เข้มงวด” กับการกำหนดค่าตัวแปร และการเรียกใช้งาน function ซึ่งโดยมากจะเกิดกับโค๊ดในลักษณะนี้ครับ

<?php
$name = '201406171524485d53.jpg';

$extension = end(explode('.', $name));

echo $extension;
?>

วิธีแก้ไขคือ ให้แยกเอา explode กับ end ออกจากกันครับ แบบตัวอย่างนี้

<?php
$name = '201406171524485d53.jpg';

$ext = explode('.', $name);

$extension = end($ext);

echo $extension;
?>

ซึ่งถ้าลองดูรายละเอียดของ function explode() จะพบว่าค่าที่คืนกลับมาเป็น array เช่นเดียวกับ function split() ที่ถูกถอดออกใน PHP 5.3

explode

(PHP 4, PHP 5)
explode — Split a string by string

Description 

array explode ( string $delimiter , string $string [, int $limit ] )
Returns an array of strings, each of which is a substring of string formed by splitting it on boundaries formed by the string delimiter.

split

(PHP 4, PHP 5)
split — Split string into array by regular expression

Description 

array split ( string $pattern , string $string [, int $limit = -1 ] )
Splits a string into array by regular expression.

Warning

This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.

ซึ่ง การใช้ function end() จำเป็นต้องเป็นตัวแปรแบบ Array เท่านั้น เพราะมันมีการระบุ pointer ตัวสุดท้ายของ Array  สาเหตุที่แจ้ง error แบบนี้เพราะมันไม่ตรวจสอบค่าที่อยู่ใน function end() แต่ถ้าพบว่าไม่ใช่ Array มันจะแจ้งออกมาทันที แม้ว่าเราจะมีการ return ค่าออกมาเป็น Array แล้วก็ตาม ทางที่ดีคือเขียนให้ถูกหลักเกณฑ์ที่เขากำหนดไว้ดีที่สุดครับ