[แปล] มีอะไรใหม่ใน php7

เหมือนเดือนสองเดือนที่แล้วจะมีงาน PHP Conf Asia 2015 ที่สิงคโปร์ โดยในงานมี Rasmus Lerdorf ผู้คิดค้นภาษา php ขึ้นมาพูดด้วย

ส่วนตัวเราไม่ได้ดูนะ แต่ไปอ่านสไลด์เอา (ดูได้ที่นี่) หลักๆ ก็คือฟีเจอร์ใหม่ๆ ใน php เวอร์ชั่นที่ 7 ซึ่งมีการเปลี่ยนแปลงเยอะพอสมควร

http://talks.php.net/singapore15#/

PHPเกิด ขึ้นมาในสมัยก่อนที่คนสร้างเว็บถ้าอยากทำ Dynamic Page หรือเว็บที่ตอบโต้กับผู้ใช้ได้ก็ต้องเขียน CGI ด้วยภาษา Perl ซึ่งคนส่วนใหญ่ก็ทำมันไม่ได้หรอก Rusmusจึงเขียนตัวแปลงสคริปต์ด้วยภาษา C แล้วจึงเกิดเป็น PHP ขึ้นมา

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

การปฏิวัติในโลก PHP

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

ซึ่งเหตุการณ์นี้มีมาแล้ว 3 ครั้ง

  • PHP 4 –> PHP 5  – มีการปรับปรุงโครงสร้างใหม่หมด และวางโครงของ OOP แบบใหม่
  • PHP 5.2 –> PHP 5.3  – namespace / closures (Anonymous function) / static / GB และอีกเยอะเลยที่จะทำให้ชีวิตดีขึ้น
  • PHP 6 ก็ดันตายก่อนคลอด
  • ล่าสุดจึงเป็น PHP เวอร์ชั่น 7

PHP 4 --> PHP 5

  • พวกฟังก์ชันเกี่ยวกับการต่อ database MySQL เช่น mysql_xxx นั่นเก่าไปแล้ว ไม่ค่อยปลอดภัยด้วย แล้วที่สำคัญคือมันถูกตัดออกไปแล้วใน PHP 5.5
  • global_register (การเรียกใช้ GET POST ในฐานะตัวแปรตรงๆ เลย) ที่ถูกตั้งให้ปิดการทำงานเป็นค่าdefaultใน PHP 5.3 แล้วตัดออกไปเลยใน PHP 5.5 ด้วยเหตุผลด้านความปลอดภัย
  • มีฟังก์ชั่นหลายตัวที่โดนประกาศเลิกใช้ ที่เห็นหน้าค่าตากันบ่อยๆ ก็เช่น split() และ ereg()
  • คลาสของOOP ยังไม่สมบูรณ์เท่าไหร่ ใช้ static ไม่ได้ สร้างปัญหาให้การเขียนโค้ด ใช้extendsได้ แต่ดันใช้ได้ไม่เต็มที่เพราะติดปัญหา static ไม่มี (มีแต่ self ให้ใช้)

PHP 5.2 --> PHP 5.3

  • เป็น OOP ที่สมบูรณ์แล้ว
  • เขียน Closures (Anonymous Function) ได้แล้ว คือมอง function เป็นตัวแปรได้
  • namespace ซึ่งช่วยให้การตั้งชื่อและจัดหมู่ Class-Object ทำได้ง่ายขึ้น (ถ้าเทียบกับภาษา Java มันเหมือน package อ่ะนะ)

ระบบแคช 2 ชั้น

PHP เป็นภาษาแบบ interpreter ซึ่งนั่นเป็นจุดอ่อนของการเร่งความเร็วการทำงานของ PHP เลยเพราะมันต้องแปลความใหม่ทุกรอบที่รัน (สู้ compiler ที่คอมไพล์รอบเดียวแล้วที่เหลือรันอย่างเดียวไม่ได้)

ยิ่ง ตอนหลังมี HHVM ปล่อยออกมา PHPก็ยิ่งต้องปาดเหงื่อหนักขึ้นกว่าเดิม PHP7เลยต้องมีฟีเจอร์ที่ออกมารับมือเรื่องนี้โดยเฉพาะ ตั้งแต่การปรับโครงสร้าง memory ให้ใช้น้อยลง ทำงานได้เร็วขึ้น และมี OpCodeเป็นแคชชั้นที่สองให้ (เทียบง่ายๆ ก็นึกถึงไฟล์ .class ใน Java ล่ะนะ)

จาก รูปจะเห็นว่าไฟล์ index.php นั้นจะถูกอ่านไปแล้วสร้างเป็นไฟล์ index.php.bin เอาไว้ ซึ่งรอบต่อไปการอ่านจากไฟล์ .bin (แคชชั้นแรก) ก็จะทำให้เร็วขึ้นประมาณ 4 เท่า แต่มีการเริ่มด้วยระบบ SHM OpCache คือถ้า interpreter อ่านโค้ดไปรันแล้วยังเก็บไว้ได้อยู่ ก็จะรันจากตรงนั้นเลย (แคชชั้นที่สอง) ซึ่งก็จะเร็วขึ้นอีก 10 เท่าจากของเดิม

Abstract Syntax Tree

ตรง นี้ไม่ได้ช่วยให้เราเขียนง่ายขึ้น แต่ถ้าใครรู้เรื่อง Compiler จะรู้ว่าทุกภาษาจะมีการสร้าง AST ขึ้นมา .. เจ้า AST นี้ไม่ได้ช่วยโปรแกรมเมอร์แต่อย่างใด แต่ทำให้โปรแกรมพวก IDE หรือ Code Analysis อ่านโค้ดเราออกได้ง่ายขึ้น ลองนึกถึงพวกIDEภาษาJavaดูนะ มันจะฉลาดกว่า PHP ปัจจุบัน

Return Type

หนึ่งในเรื่องที่น่าดีใจจนน้ำตาไหล (ฮา) ในที่สุด function ของ PHP ก็ประกาศ return type ได้แล้ว ยะฮู้ว์

** คือต้องบอกกันก่อนว่าปกติ PHP เป็นภาษาที่ไม่สนเรื่อง data type ในระยะแรกๆ ก็เป็นสิ่งที่ทำให้ภาษามันใช้ง่ายจนโด่งดังมาจนถึงทุกวันนี้ แต่มันก็กลายเป็นบาปติดตัวชิ้นใหญ่ เพราะการไม่มี type ทำให้ภาษามันเช็กอะไรๆ ยากมาก

Strict Scalar Type

ต่อ เนื่องจากหัวข้อที่แล้ว นอกจากการประกาศ return type ได้แล้ว ยังประกาศ type ให้ตัวแปรแบบฟิกไปเลยได้อีกด้วย แต่ฟีเจอร์นี้จะถูกปิดการใช้งานไว้เป็นค่าเริ่มต้น ถ้าอยากได้จะต้องเปิดเองด้วยคำสั่ง declare(strict_types=1) เพื่อไม่ให้โค้ดเก่าๆ ระเบิดพังเอา

Anonymous Class

เป็น การประกาศ class แบบไม่ตั้งชื่อ ส่วนใหญ่จะใช้มากในการเขียนโปรแกรมแบบ OOP เพื่อลดการสร้างคลาสใหม่จำนวนมากๆ ที่ใช้งานแค่ครั้งเดียว

Null Coalesce Operator

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

Spaceship Operator

อันนี้ก็คล้ายๆ ข้อที่แล้ว แต่เอามาเสริมให้เขียนโค้ดในรูป compareTo ได้สะดวกขึ้นอีกหน่อย (คิดว่าไม่น่าจะได้ใช้เยอะ)

Exceptions on Fatals

อัน นี้ล่ะของเด็ดของจริง! ปกติ try-catch ของ PHP นี่เรียกว่าแทบจะไร้ประโยชน์เลย เพราะมันกัน error ได้ไม่ครบทุกเคส ซึ่งเคสใหญ่ๆ นี่ก็คือเจ้า Fatals Error!!

แต่ตอนนี้มันกันได้แล้ว ตบมือให้3ที!

Added Closure Call

ฟังก์ ชั่นการเรียกให้ function ทำงาน ดูๆ ไปน่าจะอารมณ์คล้ายๆ กับ .call() กับ .apply() ใน JavaScript แลดูซับซ้อน คงต้องลองใช้จริงๆ ดูก่อนถึงจะบอกได้ว่ามันจะดีหรือทำให้ปวดหัวหนักกว่าเดิม

Deprecated Function

ตามมาด้วยรายชื่อ function ที่ถูกประกาศเลิกใช้งานที่ยาว ย๊าววว ยาว

- ext/ereg (use ext/pcre instead)
- preg_replace() eval modifier (use preg_replace_callback() instead)
- ext/mysql (use ext/mysqli or ext/pdo_mysql instead)
- Assignment of new by reference
- Scoped calls of non-static methods from incompatible $this context
 
- dl() in php-fpm
- set_magic_quotes_runtime() and magic_quotes_runtime()
- set_socket_blocking() (use stream_set_blocking() instead)
- mcrypt_generic_end() (use mcrypt_generic_deinit() instead)
- mcrypt_ecb, mcrypt_cbc, mcrypt_cfb and mcrypt_ofb
  (use mcrypt_encrypt() and mcrypt_decrypt() instead)
- datefmt_set_timezone_id() and IntlDateFormatter::setTimeZoneID()
  (use datefmt_set_timezone() or IntlDateFormatter::setTimeZone() instead)
 
- xsl.security_prefs (use XsltProcessor::setSecurityPrefs() instead)
- iconv.input_encoding, iconv.output_encoding, iconv.internal_encoding,
  mbstring.http_input, mbstring.http_output and mbstring.internal_encoding
  (use php.input_encoding, php.internal_encoding and php.output_encoding instead)
 
- $is_dst parameter of the mktime() and gmmktime() functions
- # style comments in ini files (use ; style comments instead)
- String category names in setlocale() (use LC_* constants instead)
- Unsafe curl file uploads (use CurlFile instead)
- PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT driver option
  (use PDO::ATTR_EMULATE_PREPARES instead)
- CN_match and SNI_server_name stream context option (use peer_name instead)
แต่ที่น่าจะทำโปรแกรมเมอร์ที่ดูแลระบบเก่าๆ กระอักเลือดมากที่สุดน่าจะเป็น
  • mysql_xxx ฟังก์ชั่นสำหรับเชื่อมต่อ MySQL ที่ใช้มานานมาก ตอนนี้ต้องไปใช้ mysqli_xxx หรือพวก PDO แทนแล้ว
  • ereg ฟังก์ชั่นสำหรับหาแพทเทิล Regular Expression ตอนนี้ต้องเปลี่ยนไปใช้ preg_match พวกนั้นแทน
  • split ตัวตัดสตริงที่ตอนนี้เปลี่ยนไปใช้ explode() / implode() แทนแล้ว

Size of Internal Structure

เพื่อปรับให้ภาษามันเร็วขึ้น PHP7ลงไปแก้ถึงชั้นโครงสร้างภาษากันเลย โดยปรับให้โครงสร้างข้อมูลในส่วนของ zval จาก 24 -> 16 bytes/ hashtable 72 -> 56 bytes นั้นทำให้เวลารันโค้ดกิน memory น้อยลงเยอะ

ด้าน Performance

มีการบอกว่าตัวโค้ด PHP ที่เขียนมานั้นยังทำให้มันสปีดอัพ! ได้เพิ่มอีกนะ

วิธีการก็คือทำ Optimize Code หรือจูนการทำงานของ PHP ให้เข้ากับโค้ดของเรานั่นแหละสำหรับระบบที่ต้องการ performance แบบสุดๆ (น่าจะคล้ายๆ กับการทำ Weight Training เพราะตัวอย่างในนั้นบอกว่าเอาโค้ด index.php มาลองรัน 1000 ครั้งแล้วจูน PHP ให้เข้ากับโค้ดส่วนนี้)

** มีการเทียบ performance ของ PHP7 กับ CMS และFramework ดังๆ อื่นๆ ด้วย แต่ไม่ได้เอามาแปะนะ เพราะเดี๋ยวจะยาวเกินไป สามารถดูกราฟได้ที่ลิงค์ที่กะไว้ด้านบนเลย

สรุป...

PHP7 เหมือนเป็นการปฏิรูปภาษาใหม่ อะไรที่ไม่ดีและค้างคามาหลายเวอร์ชั่น ก็ได้เวลาชำระล้างกันในเวอร์ชั่นนี้ แล้วเมื่อตามลบบาปที่ค้างมาพวกนั้นไปแล้วก็ถือโอกาสปรับเปลี่ยนโครงสร้างหลักๆ ของภาษาซะเลย ทำให้จากภาษาที่เกิดมาเป็น script เล็กๆ กลายเป็นภาษาที่มีโครงสร้างดี ทัดเทียมกับภาษาอื่นๆ ซะที

โดยตอนนี้ทาง Rusmus ได้ทำ Vagrant Box เอาไว้ให้ด้วยสำหรับ clone ชุดพัฒนาไปลองเล่นด้วย ภายในมีคอมไพเลอร์ของ PHP7 ให้ ถ้าใครอยากเล่นก็ไปโหลดกันมาดู และถ้ามีบั๊กก็ report ด้วยล่ะ เขาจะได้แก้กันก่อน PHP7 จะ Release จริง

แต่เรื่องใหญ่ที่สุดน่าจะเป็นระบบของเว็บที่ตอนนี้รัน PHP เวอร์ชั่นเก่าๆ อยู่ การจะmigrateไปใช้ PHP7น่าจะยากอยู่ ถ้าเว็บเล็กๆ ยังไม่ค่อยเท่าไหร่ แต่ถ้าเป็นเว็บใหญ่ๆ ที่เขียนโค้ดเอาไว้ไม่ค่อยดีเท่าไหร่ เรียกว่าไม่น่าจะ migrate ได้เลยล่ะ (ก็แทบจะต้องเขียนใหม่ทั้งหมด จริงๆ เขียนใหม่ยังอาจจะง่ายกว่าเลย)

10496 Total Views 3 Views Today
Ta

Ta

สิ่งมีชีวิตตัวอ้วนๆ กลมๆ เคลื่อนที่ไปไหนโดยการกลิ้ง .. ถนัดการดำรงชีวิตโดยไม่โดนแสงแดด
ปัจจุบันเป็น Senior Software Engineer อยู่ที่ Centrillion Technology
งานอดิเรกคือ เขียนโปรแกรม อ่านหนังสือ เขียนบทความ วาดรูป และ เล่นแบดมินตัน

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *