GORAGOD.com

ทำความเข้าใจเกี่ยวกับการใช้งานหน่วยความจำของ PHP

ตัวแปรของ PHP ทั่วไปจะมีการจองหน่วยความจำ และเก็บข้อมูล ลงในหน่วยความจำที่ตำแหน่งของหน่วยความจำที่จองไว้ ซึ่งการถ่ายโอนค่าของตวแปร จะเป็นการจองหน่วยความจำใหม่ และสำเนาข้อมูลไปยังตำแหน่งของหน่วยความจำใหม่ด้วย เช่น
$a = 'test';
$b = $a;

คำสั่งด้านบนจะมีการจองหน่วยความจำ 2 ตำแหน่ง คือตำแหน่ง $a เก็บข้อมูล test และตำแหน่ง $b เก็บข้อมูล test เหมือนกัน นั่นหมายความว่าจะมีการใช้หน่วยความจำเพิ่มขึ้นเท่าตัว ตามขนาดของข้อมูล
$a = 'test';
$b = &$a;

คำสั่งด้านบน เครื่องหมาย & จะทำให้ตัวแปร $b ชี้ไปยังหน่วยความจำที่ตำแหน่งของ $a เลย ทำให้ตัวแปรทั้งสองตัว เหมือนเป็นตัวแปรเดียวกันที่ชื่อต่างกัน และจะไม่มีการจองหน่วยความจำเพิ่ม
$a = new testClass;
$b = $a;

ในกรณีที่เป็นตัวแปรประเภท Object การสำเนาข้อมูล จะเป็นการชี้ไปยังตำแหน่งของหน่วยความจำโดยตรง (เหมือนการใช้ &) ดังนั้นมันจะไม่มีการใช้หน่วยความจำเพิ่ม

แล้วมันสำคัญยังไง
การถ่ายโอนตัวแปรของ PHP ปกติจะมีการใช้หน่วยความจำเพิ่มอีกเท่าตัว ตามขนาดของข้อมูล ยกตัวอย่างเช่นตัวแปรที่เก็บค่า config ซึ่งอาจมีข้อมูลในตัวแปรจำนวนมาก การถ่ายโอนข้อมูลไปยังตัวแปรใหม่ จะทำให้เกิดการใช้หน่วยความจำเพิ่ม ซึ่งเป็นสาเหตุหลักที่ทำให้แอพพลิเคชั่นของเราใช้หน่วยความจำมาก ซึ่งการเขียนโปรแกรมสมัยใหม่ที่มักจะมีการส่งค่าไปยังฟังก์ชั่นต่างๆ การส่งค่าไปแต่ละครั้งก็จะก่อให้เกิดการใช้หน่วยความจำเพิ่มขึ้น

การแก้ปัญหา ก็อาจจะใช้วิธีการสำเนาข้อมูลด้วยวิธี & หรือการใช้ตัวแปร ประเภท Object แทน แต่มันก็มีข้อเสียนะครับ
เนื่องจากการใช้ตัวแปรที่ตำแหน่งของหน่วยความจำเดียวกัน การแก้ไขข้อมูลของตัวแปร จะทำให้ตัวแปรที่เกี่ยวข้องทั้งหมดมีค่าเปลี่ยนแปลงไปด้วย เพราะมันคือ "ข้อมูลเดียวกัน" ดังนั้นการนำไปใช้ให้คำนึงถึงข้อนี้ด้วย

ตัวแปรประเภท Object จะมีลักษณะการใช้งานที่เข้าใจได้ง่ายกว่าตัวแปรประเภทอื่น (โดยเฉพาะการใช้ &) เนืองจากเรามักจะเข้าใจเป็นสากลอยู่แล้ว ว่าถ้าเราแก้ไข property ของ $b แล้ว property ของ $a จะเปลี่ยนแปลงไปตามด้วย ดังนั้นการนำไปใช้จะง่ายกว่า

จึงเป็นข้อสรุปว่า การออกแบบแอพพลิเคชั่นในลักษณะของ Object เช่นพวก MVC ทั้งหลาย จะมีการใช้หน่วยความจำน้อยกว่าการออกแบบทั่วไป ยกเว้นการออกแบบธรรมดาที่มีการคำนึงถึงการใช้หน่วยความจำของแอพพลิเคชั่นตั้งแต่ต้นแล้ว