Tag Archive valiable

PHP: ดูการทำงานสร้าง flowchart (backtrace)

ถ้าเรียนเขียน program มาคงจะคุ้นเคยกับ flowchart การทำงานของของโปรแกรม แต่ในชีวิตการทำงานจริงๆ โดยเฉพาะถ้าเขียน code โดยใช้ framework ต่างๆ จะไม่เป็นเหมือนที่ได้ออกแบบไว้เสมอไป เพราะว่าบางครั้งโปรแกรมจะทำงานให้เราเองโดยที่ไม่ได้สั่ง สาเหตุคือ มีการเรียกใช้ hook หรือ tricker ทำให้เกิด process ที่อาจจะไม่ทราบที่มา หรือต้องมาแก้งานของคนอื่นโดนที่ไม่มีเอกสารให้

นอกจากการใช้วิธี PHP: list included หรือ required ไฟล์ที่ใช้ ถ้าเราใช้ตัว framework ต่างๆ มักจะมีการเตรียม function ในการสร้าง backtrace ไว้ให้ แต่ถ้าไม่มีหรือเป็น code ที่เขียนด้วยตัวเอง ยังสามารถใช้ debug_backtrace ในการค้นหาที่มาที่ไปได้เช่น[code language=”php” title=”debug.debug_backtrace.php”]<?php

function getBacktrace()
{
$backtrace = debug_backtrace();
echo ‘<pre>’, print_r($backtrace, true), ‘</pre>’;
fwrite(fopen(‘logs_debug_backtrace.txt’, ‘a+’), "\n\n" . __FILE__ . ‘ :’ . __LINE__ . "\n\n" . print_r($backtrace, true));
}

function getPhpInfo($what)
{
phpinfo($what);

/* จะดูว่า ทำไม่ getPhpInfo ถึงทำงาน */
getBacktrace();
}

function index()
{
getPhpInfo(INFO_ENVIRONMENT);
}

index();[/code]เมื่อทดสอบดูจะได้ผลลัพธ์[code language=”text” title=”logs_debug_backtrace.txt”]Array
(
[0] => Array
(
[file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
[line] => 13
[function] => getBacktrace
[args] => Array
(
)

)

[1] => Array
(
[file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
[line] => 18
[function] => getPhpInfo
[args] => Array
(
[0] => 16
)

)

[2] => Array
(
[file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
[line] => 21
[function] => index
[args] => Array
(
)

)

)[/code]เพราะว่าเราเขียน function debug_backtrace() ไว้ใน function getBacktrace() อีกชั้น เพื่อที่ความง่ายในการค้นหา flow เมื่อต้องการดูว่า function หรือ class ที่เราสนใจมันมี flow มายังไงก็แค่ไปเรียกใน function ที่สงสัย เราก็จะได้ลำดับการทำงานย้อนกลับไป เราจะได้ทราบทั้งฟังก์ชั้น คลาส บรรทัด ไฟล์ แม้แต่ตัวแปรที่ส่งเข้าไปใน function นั้นๆ

แปลงชนิดตัวแปรใน PHP

PHP เป็นภาษาที่ยืดหยุ่นเรื่องตัวแปรมาก เราใช้ตัวแปรได้โดยไม่ต้องประกาศก่อน และประกาศตัวแปรได้โดยไม่ระบุประกาศชนิดของตัวแปร (variable’s type) ทำให้เขียนได้สะดวก เพราะ PHP จะเลือกชนิดของตัวแปรให้อัตโนมัติ แต่บางครั้งก็ก่อให้เกิดปัญหา เช่น สับสนระหว่าง ค่า 1 หรือ true บางครั้งอาจจะใช้วิธี คูณ หรือ บวกบังคับให้เป็นตัวเลข ความจริง PHPสามารถเปลี่ยนชนิดตัวแปรได้โดยการ casting ตัวแปร (PHP เรียกว่า Type Juggling) ทำโดยการระบุชนิดตัวแปรไปข้างหน้า เช่น[sourcecode language=”php”]<?php
$foo = 10; // $foo เป็น integer
$bar = (boolean) $foo; // $bar เป็น boolean
?>[/sourcecode]

คำสั่ง ชนิดตัวแปร
(int), (integer) integer
(bool), (boolean) boolean
(float), (double), (real) float
(string) string
(array) array
(object) object
(unset) NULL