MasterScripter

PHP 7 – כל מה שצריך לדעת וקצת יותר

ב3 בדצמבר 2015 צוות הפיתוח של PHP שחרר רשמית את PHP 7, הגרסא החדשה של השפה המוכרת. לאחר מסע שארך כמעט שנתיים, וכלל פיתוח וגרסאת בטא שנטעה תקוות גדולות, PHP 7 כאן – ומאז יציאתה נדמה כי כולם מדברים עליה ללא הפסקה. בפוסט הבא תמצאו את כל מה שאתם צריכים לדעת על PHP 7, ואפילו יותר.

הקדמה

בשביל להבין את המשמעות האמיתית מאחורי השחרור של PHP 7, נתחיל עם כמה נתונים מעניינים (לעצלנים – מי שגולש במחשב יכול לדלג ישר לאינפוגרפיקה..)

  • PHP היא שפת התכנות השישית הכי פופולרית בעולם.
  • 82.3% מהאתרים בעולם כיום משתמשים בPHP בצד השרת שלהם.
  • יש בערך כ-5 מיליון מפתחי PHP ברחבי העולם.
  • בתחום הווב, PHP הינה השפה הפופולרית ביותר, עם יותר מפי 2 אחוזי שימוש מהשפה השנייה לה – ASP.NET.

 

אינפוגרפיקה בנושא פופולריות ושימוש ב- PHP 7

אז אחרי שביססנו את הפופולריות והשימוש הגבוה בPHP, קבלו עוד נתון מדהים:
מאז 2004 (!) לא יצא עדכון גרסא משמעותי לPHP כמו PHP 7.

PHP 7 – איך הכל התחיל

PHP 7 פותחה במהלך השנים 2014 ו-2015 ע"י צוות פיתוח בהובלתם של דימיטרי סטוגוב, קסינצ'ן הוי וניקיטה פופוב.
במקור, המטרה הייתה לבצע אופטימיזציה לביצועים של PHP באמצעות שיפורים ובנייה מחודשת של חלקים ממנוע הZend, תוך שמירה על תאימות שפה מירבית(מה שנקרא, בלי שינויים קיצוניים..)

בתחילתה, קיבלה הגרסא המשופרת את השם PHPNG – PHP Next Generation. בהמשך, עקב ההצלחה המרשימה בביצועים של PHPNG כמו גם השינויים המהותיים שבוצעו במנוע, הוחלט כי מנוע הZend יקבל שם חדש לאחר השיפורים – Zend 3.

בנוסף, בעקבות הפרוטוקולים של פיתוח גרסאות PHP, נקבע כי השינויים שנעשו בPHPNG הינם משמעותיים מידי על מנת לשחרר אותה כגרסאת 5 חדשה – ולכן הוחלט שPHPNG תהיה בעצם מה שאנחנו מכנים היום כ- PHP 7.

מכיוון שרק בגרסאות חדשות ניתן "לשבור" תאימות קוד לגרסאות קודמות, הוחלט לנצל את ההזדמנות של יציאת גרסא חדשה, ולבצע שינויים נרחבים אף יותר, אשר יפורטו בהרחבה בהמשך פוסט זה, והיו ניתנים לביצוע רק על ידי שבירת תאימות הקוד מגרסאות ישנות יותר.

לאן נעלמה PHP 6?

רבים שואלים למה הגרסא החדשה נקראת PHP 7, שכן גרסאת PHP העדכנית היא 5.6 – אז איפה לעזאזל PHP 6 בכל הסיפור הזה?

הנה אנקדוטה קטנה – PHP 6 הייתה גרסא שפותחה אך מעולם לא שוחררה. מטרתה העיקרית הייתה לפתור את בעיית הקידוד של תווים בין לאומיים.
בין הסיבות לגניזה של גרסאת PHP 6 היו העובדה שקידוד התווים הבין לאומיים הוטמע כבר בגרסא 5.3 מקביל לפיתוח של PHP 6, ובעיקר ויכוחים רבים על אילו פיצ'רים צריכה הגרסא החדשה להכיל.
על אף הגניזה, רבות נלמד מתהליך הפיתוח והנפילה של PHP 6, ואת המסקנות ניתן לראות בגרסאת PHP 7 – בעיקר בתחום תהליך ההחלטה על כניסתם של פיצ'רים חדשים לגרסא.
כאשר הגיעו למסקנה שPHPNG תקבל גרסא משלה, הוחלט לתת לה את השם PHP 7 ולא PHP 6 בעיקר על מנת למנוע בלבול, ולא לקשר אותה לגרסא שנגנזה.

אז מה נשתנה בPHP 7?

אלו הם הפיצ'רים והשינויים העיקריים, אך לא היחידים, שתמצאו בPHP 7:

  • שיפור ביצועים מהותי, שמוביל למהירות גבוהה פי 2 מ- PHP 5.6
  • שימוש מופחת משמעותית בזיכרון (Memory Usage)
  • תחביר מופשט יותר (Abstract Syntax Tree)
  • תמיכה במערכות 64 ביט
  • היררכיית חריגות משופרת (Exception Hierarchy)
  • שגיאות קריטיות (Fatal Errors) רבות הפכו לחריגות (Exceptions)
  • מחולל מספרים רנדומליים מאובטח (Secure random number generator)
  • הסרה של SAPIs ותוספות (Extensions) ישנות ולא נתמכות
  • אופרטור NULL מאוחד (The null coalescing operator)
  • אופרטור חללית (Spaceship Operator)
  • הצהרות סוג ספציפיות עבור משתנים והחזרת משתנים (Return and Scalar Type Declarations)
  • תמיכה בקידוד Unicode, כולל אימוג'י ותווים בין לאומיים
  • קלאסים אנונימיים (Anonymous Classes)

את רשימת התוספות והשינויים המלאה ניתן למצוא באתר הרשמי של PHP, והסברים מפורטים ניתן למצוא ברפרנס הבא מתוך GitHub.

שיפור ביצועים – הכפלת המהירות

היתרון הכי גדול של PHP 7 הוא גם הסיבה שבגינה הוחלט להוציא אל הפועל את פיתוח הגרסא – שיפור המהירות. התוצאות הצליחו הרבה מעבר למצופה, והבדיקות האחרונות מגלות שבממוצע, שימוש בPHP 7 מוביל להכפלת המהירות ובמקרים רבים אף יותר!

המשמעות היא שלא רק שהקוד שתכתבו יבוצע מהר יותר, גם מספר הבקשות שPHP 7 יכול לבצע בשניה הוכפל.

תשמחו לשמוע שהבדיקות המדוברות בוצעו על מערכות רבות, ביניהן גם מערכות קוד פתוח פופולריות כדוגמת WordPress ו-Drupal. בהתחשב בנתון ש25% מהאתרים באינטרנט מבוססים על WordPress, הרי שהכפלת המהירות בPHP 7 היא דבר מדהים עם השפעה נרחבת על הגולש הממוצע.

אופרטור NULL מאוחד – Null Coalescing Operator

אופרטור NULL מאוחד הוא אופרטור חדש ויעיל במיוחד אשר ניתן להשתמש בו באמצעות שני סימני שאלה (??). האופרטור מיועד לבדיקה האם אובייקט קיים, והחזרת ערך ברירת מחדל במקרה והוא איננו קיים:

אופרטור חללית – Spaceship Operator

אופרטור החללית, או בשמו הרשמי "אופרטור ההשוואה המשולבת" (Combined Comparison Operator), נקרא גם "אופרטור שלושת הכיוונים" (Three-way Comparison Opeator) והוא כבר פופולרי בשפות שונות. השימוש בו נעשה באמצעות "<=>" (דומה לחללית..). האופרטור מחזיר 0 אם הערכים שווים, -1 אם הערך הימני גדול יותר, ו 1 אם הערך השמאלי גדול יותר:

מקרה תוצאה
$a = 1, $b = 2 1
$a = 1, $b = 1 0
$a = 2, $b = 1 -1

שימו לב כי לא ניתן לשרשר את האופרטור החדש:

הצהרת סוג ספציפי של משתנים – Type Declartions

עד היום בPHP 5.6, יכולנו להגדיר באופן ספציפי רק את סוג המשתנה שאנחנו מקבלים כפרמטר בפונקציה, כשאנחנו מוגבלים לשני סוגים של משתנים: Class Name ו- Array:

השינוי בPHP 7 הוא כפול –  גם ניתן להגדיר באופן ספציפי עוד סוגים של משתנים, וגם אנחנו יכולים להגדיר באופן ספציפי את סוג המשתנה בפרמטר המוחזר מהפונקציה(Return).

במשתנים שהפונקציה מקבלת – Scalar Type Declarations

בפרמטרים שהפונקציה מקבלת, סוגי ההגדרה הספציפית הורחבו, ועכשיו ניתן גם להגדיר – int, float , ו- boolean, נוסף על string ו- class name שיכולנו עד היום.
כאשר נמצאים במצב Strict Mode, המשתנים חייבים להיות תואמים לסוג ההכרזה – ותתקבל שגיאה במקרה שהם לא תואמים את סוג ההכרזה.
במידה ולא מפעילים Strict Mode, הPHP יבצע המרה של משתנים, לדוגמא:

לפני המרה אחרי המרה
$a = "1 week" $a = 1

חשוב לציין כי במקרה הזה ובניגוד לStrict Mode, לא תתקבל שגיאה – אלא התראה בלבד.

 

במשתנים שהפונקציה מחזירה – Return Type Declarations

כמו בפרמטרים שהפונקציה מקבלת, גם באלו שהיא מחזירה ניתן להגדיר מראש את סוג הפרמטר באופן ספציפי. היתרונות בהגדרה כזאת הן הביטחון שהערך שיתקבל מהפונקציה הוא בסוג הרצוי, כמו גם הסדר והנראות בקוד.
ע"מ להגדיר, נוסיף לאחר הפונקציה נקודתיים ואת סוג המשתנה –   "function() : type" :

שוב, כמו במקרה של פרמטרים שהפונקציה מקבלת, במצב Strict Mode תתקבל התראה במידה והפרמטרים אינם מהסוג שהוכרז.

לעומת זאת, ללא מצב Strict Mode, הPHP יעשה הסבה לפרמטרים שהתקבלו ע"מ שיתאימו לסוג שהוכרז.

התמודדות עם שגיאות – Error Handling

PHP 7 שיפרה משמעותית את ההתמודדות עם שגיאות קריטיות(Fatal Errors). עד היום, בשגיאה קריטית היה מופיע בדרך כלל מסך לבן ריק ומבלבל, והסקריפט היה עוצר. בPHP 7 לעומת זאת, כאשר מתרחשת שגיאה קריטית אשר ניתן להתאושש ממנה(Recoverable), תתקבל חריגה(Exception) והסקריפט לא יעצור. חשוב לציין שעדיין קיימות שגיאות קריטיות בPHP 7 אשר יעצרו את הסקריפט, כמו למשל אם נגמר הזיכרון. בנוסף, חריגות שלא נתפסו(Uncaught) ימשיכו להיות שגיאות קריטיות, כמו בPHP 5.6.
סוגים אחרים של שגיאות, כגון אזהרות והתראות, נשארו ללא שינוי.

השיפור המשמעותי בPHP 7 הוא הThrowable Class. במקום להשתמש בקלאסים שונים עבור try/catch של שגיאות וחריגות, ניתן להשתמש בשני המקרים בThrowable.

ההיררכיה החדשה החדשה של Throwable נראית כך:

  • Throwable
    • Error
      • ArithmeticError
        • DivisionByZeroError
      • AssertionError
      • ParseError
      • TypeError
    • Exception

חשוב לציין כי ההיררכיה אינה יורשת מ-Exception, על מנת לשמור על תאימות קוד בגרסאות קודמות.

שגיאות בPHP 7

בתחום השגיאות, PHP 7 ספציפית יותר בסוג השגיאה המתקבלת, ואלו הן סוגי השגיאות האפשריות:

TypeError – תתקבל כאשר מועבר לפונקציה פרמטר אשר לא תואם את סוג הפרמטר שהוכרז (Type Declaration), או כאשר ערך שמוחזר מפונקציה לא תואם את סוג הערך שהוכרז, או כאשר מועבר מס' משתנים גדול מהמצופה לפונקציה(בStrict Mode בלבד).

ParseError – תתקבל כאשר מתרחשת שגיאה סמנטית בניתוח קוד PHP, כמו למשל בשימוש בפונקציה eval().

ArithmeticError– תתקבל כאשר מתרחשת שגיאה בזמן ביצוע פעולות מתמטיות.

AssertionError – תתקבל כאשר פונקציית assert() נכשלת.

קלאסים אנונימיים – Anonymous Classes

Classים אנונימיים הם דבר מוכר בשפות תכנות אחרות, והעקרון מאחוריהם די פשוט – Class ללא שם. הפונקציונליות של הClass האנונימי זהה לזו של Class רגיל, והשימוש הנפוץ בהם הוא בעבור יצירה פשוטה של אובייקטים אשר השימוש בהם הוא חד פעמי.

בדיוק כמו Classים רגילים, Classים אנונימיים יכולים להשתמש בקונסטרקטורים, להרחיב Classים אחרים, וכו'.

חשוב לזכור ששימוש בClass אנונימי בתוך Class רגיל אינו נותן לClass האנונימי גישה לדברים אשר הוגדרו private או protected, ועל מנת לתת לו גישה יש לדאוג שהוא ירחיב את הClass הרגיל:

שימוש קבוצתי בפונקציה USE

עד היום, על מנת לייבא Classים תחת אותו Namespace, היה צורך לקרוא לפונקציה use שוב ושוב. בPHP 7, ניתן לקרוא לכל הClassים הרצויים תחת אותו Namespace בשימוש אחד:

 

תמיכה בUnicode, אימוג'ים ותווים בין לאומיים

בPHP 7 נוספה לנו היכולת לקודד UTF-8 Unicode, בכל תצורת פלט שהיא(מרכאות כפולות או בודדות), באמצעות שימוש ב"\u".
שימו לב שמעבר לתווים בין לאומיים, הקידוד תומך גם באימוג'י!

עושים סדר – ממה נפטרנו?

נוסף על כל הדברים המרשימים והחשובים שהתווספו לPHP 7, ראוי לציין שאחת המטרות העיקריות של PHP 7 הייתה גם לעשות "סדר בארון" – להפטר מדברים שכבר אין להם תמיכה או שלא נמצאים בשימוש ומכבידים על השפה. כל הדברים שהוסרו לא נמצאים בשימוש כבר בPHP 5, אולם משתמשי גרסאות קודמות ל5 עלולים לחוות בעיות במעבר לPHP 7 במידה ועשו שימוש באחד הפיצ'רים שהוסרו.

בין הדברים שהוסרו ניתן למצוא את תגי הPHP האלטרנטיביים(<script language = "php"> וכו'), כמו גם את השימוש באותו שם של פרמטר בפונקציה:

את הרשימה המלאה של כלל הדברים שהוסרו בPHP 7 תוכלו למצוא בלינקים הבאים:
פונקציות ופונקציונליות שהוסרו
SAPIs והרחבות (Extensions) שהוסרו

3 תוספות פחות מוכרות לPHP 7

חוץ מהפיצ'רים הרבים שהוזכרו כאן, יש גם כאלה שהם קצת פחות פופולריים – ועדיין שווה להכיר אותם. קבלו 3 פיצ'רים מגניבים ופחות ידועים:

חלוקת Integerים – intdiv()

באופן די מוזר, אין דרך לחלק שני Integerים בצורה נכונה. עד היום, כשחילקנו שני Integerים והתוצאה שנתקבלה לא הייתה שלמה, PHP הפכה את התוצאה לINT.

ברוב המוחץ של המקרים – זה מספיק, אבל כשמתעסקים עם חישובים מורכבים – הדיוק הוא משמעותי.

הפונקציה החדשה intdiv() עושה בדיוק את זה:

חלוקה ב0

גם במקרה של חלוקה ב0, ההתנהגות של PHP עד היום הייתה מוזרה – אזהרה הייתה מתקבלת, והערך המוחזר היה false. לא כך כך "עושה הגיון" שעבור פעולה מתמטית נקבל ערך בוליאני, לא?
השינוי בPHP 7 הוא בערך המוחזר. עדיין נקבל את אותה האזהרה, אך הערך המוחזר יהיה מתמטי,  בהתאם לערך המשתנה שחולק ב0:

ובנוסף, נסיון לחלוקת שארית ב0, תחזיר שגיאת חלוקה ב0:

הגדרת מערך קבוע – Constant Array

אחרון חביב – בPHP 5.6 ניתנה לנו האפשרות להגדיר מערך קבוע בעזרת constant:

בPHP 7, קיבלנו את אותה הפונקציונליות גם בפונקציה define():

המעבר לPHP7

על אף העובדה שPHP 7 היא הגרסא החדשה המלאה הראשונה מאז 2004 (ואולי דווקא בגלל העובדה הזו), נעשו מאמצים רבים על ידי צוות הפיתוח להפוך את המעבר לPHP 7 לקל ונוח ככל האפשר.
PHP 7 מתרכזת בעיקר בהסרת פונקציונליות ורכיבים ישנים אשר אינם נמצאים בשימוש יותר, כמו גם בשיפור הרציפות של השפה.

למרות זאת, יש מספר קטן של חוסר התאמות ופיצ'רים חדשים אשר ראוי לקחת בחשבון, ואם תשאלו אותי – אני ממליץ לעשות טסטים בסביבת הפיתוח לפני שמעבירים פרוייקט סופית לPHP7.

הנושאים העיקריים אליהם צריך להקדיש תשומת לב הם:

בעיות תאימות לגרסאות קודמות עקב שינויים:

  • שינויים בהתמודדות עם שגיאות וחריגות
  • שינויים בהתמודדות עם משתנים מסויימים
  • שינויים בפונקציית foreach()
  • שינויים מסויימים בהתמודדות עם integer, string
  • פונקציות אחדות אשר הוסרו
  • שינויים כלליים אשר עשויים לגרור בעיות תאימות

פונקציות ששונו:

  • debug_zval_dump()
  • dirname()
  • getrusage()
  • mktime() ו- gmmktime()
  • preg_replace()
  • setlocale()
  • exec(), system() ו- passthru()
  • substr()

Extensions ו- SAPIs שהוסרו:

  • ereg
  • mssql
  • mysql
  • sybase_ct
  • aolserver
  • apache
  • apache_hooks
  • apache2filter
  • caudium
  • continuity
  • isapi
  • milter
  • nsapi
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • tux
  • webjames

אני אדגיש שוב כי אין זה מדריך מעבר מPHP 5.6 לPHP 7, אלא רק סיכום תמציתי של עיקרי הדברים.
במידה ואתם חושבים לעבור לPHP 7, ראו זאת כחובה לקרוא את מדריך המעבר הרשמי של PHP.
את הורדת הגרסא תמצאו כאן (כרגע בגרסא 7.0.6).

עדיין מתלבטים אם לעבור לPHP 7?

חברת Badoo, אשר המוצר העיקרי שלה הוא אתר היכרויות מצליח(281 בדירוג אלכסה), החליטה להעביר את כלל האחזקות האינטרנטיות שלה אל PHP 7(אתר ההיכרויות, בלוג הטכנלוגיה, וכו'). התהליך לקח מס' שבועות בו נעשו בדיקות רציפות בסביבת הפיתוח. לטענת חברת Badoo, בסיום תהליך המיגרציה השימוש בCPU הצטמצם ב50%, מה שהוביל לשחרורם של פחות או יותר 300 שרתים. בחישוב מהיר, על פי עלויות השרתים והאחסון של Badoo, הם הצליחו לחסוך מיליון דולר(!), נוסף על 100,000 דולר שנתיים באחסון.

סיכום

אז מה היה לנו כאן? הבנו את אחוזי השימוש והפופולריות של שפת PHP ברחבי העולם, למדנו למה עברו למעלה מעשר שנים מאז שהיה עדכון גרסא משמעותי כמו PHP 7, ומה קרה לPHP 6.

עברנו על השינויים והפיצ'רים החדשים העיקריים בPHP 7, כמו גם על עוד שלושה פחות מוכרים..

הדגשנו לאילו דברים כדאי לתת את תשומת הלב כאשר עוברים גרסא, וכמובן שגם גילינו איך חברת Badoo חסכה יותר ממיליון דולר רק על המעבר לPHP 7.

PHP 7 אומנם יציבה, אך נמצאת בחיתוליה. הערכות טוענות שיעברו שנים עד שהיא תיטמע באופן סופי – ולמרות זאת, היא טומנת בחובה תקווה גדולה. אם אני צריך להכריע בשאלה האם לעבור כבר לPHP 7, אז אני ממליץ חד משמעית לעבור, וכמה שיותר מהר (במידת האפשר..).
מעבר לעובדה שאתם תהנו יותר מהכתיבה בה, התוצאות שלה מדברות בעד עצמן.
במידה ומשהו בפוסט לא היה ברור, או שיש לכם שאלות/הערות נוספות, אל תהססו להגיב כאן או לשלוח מייל, ואני מבטיח שתיענו בהקדם 🙂

אם הגעת עד לפה, הגיע הזמן להירשם לניוזלטר!

Summary
Article Name
PHP 7 - כל מה שצריך לדעת וקצת יותר
Description
מידע כללי וסיקור אודות הפיצ'רים החדשים והמעניינים בPHP 7, והאם שווה כבר לעבור אליה
Author
Publisher Name
MasterScripter
Publisher Logo
תגיות: ,
אודות 
יזם בוטסטראפ, מתכנת ומנהל מוצר. שותף מייסד בקבוצת סיזן שמספקת שירותי פיתוח וליווי טכנולוגי לחברות וארגונים, וב-edge אתגרים בחינוך שמפתחת מוצרים דיגיטליים לבתי ספר. המייסד של PBC - מועדון ספרים מקצועי.

8 תגובות

  1. שמעון

    16 ביוני 2016 - 20:34
    תגובה

    אין פה איפה לעשות לייק. אז.
    לייק

  2. רז

    22 ביוני 2016 - 20:48
    תגובה

    אהבתי!

  3. אורן

    19 באוגוסט 2016 - 2:03
    תגובה

    היי שלומי, אשמח לקבל ממך המלצה – האם נכון/כדאי לדעתך ללמוד php היום, לפיתוח אתרי אינטרנט(/אפליקציות ווב), לאור הפופולריות הגוברת של nodejs (כאשר אני מכיר קצת js) ?
    ואם כן מה תהיה הדרך היסודית והטובה ללימוד השפה ?

    • שלומי זק

      27 בדצמבר 2016 - 10:34
      תגובה

      הי אורן,
      באיחור של ארבעה חודשים (הייתי בחו"ל בזמן שכתבת את התגובה, ואיכשהוא זה נפל בין הכיסאות..)
      אבל בתקווה שעדיין תראה את זה ועדיין תמצא את התשובה שלי רלוונטית –
      קודם כל כן! אני עדיין חושב שכדאי ללמוד PHP היום, על אף הפופולריות הגוברת של NODEJS ובאופן כללי אל מול גישות שנוטות להעביר את צד השרת לג'אווהסקריפט. כי על אף שהג'אווהסקריפט כצד שרת היא בהחלט טרנד פופולרי, עדיין הרוב המוחץ של פיתוחי הווב נעשים/נעשו/מתבססים על PHP כצד שרת, ומרבית מערכות הCMS שנמצאות בשוק הן עדיין בPHP. אם אפשר ללמוד את שניהם – זה אידאלי, אך אם אתה חייב לבחור אחד, חד משמעית לך על PHP.
      לגבי איך – זה החלק הקשה. בגדול, מתחילים בקטן – לעקוב אחרי מדריך כזה או אחר, למשל בW3SCHOOL. אחר כך, הייתי מתחיל לנסות קצת דברים בעצמי, ואולי אפילו קופץ למים – לוקח פרימוורק נבחר (קודיגנייטר, לארבל, וכו' וכו'), לומד אותו לעומק ומנסה להתחיל לפתח דברים.
      אתה יותר ממוזמן להיות איתי בקשר במייל ולהמשיך להתייעץ לאורך לימודיך (וגם אחרי 😉 )
      מקווה שתסלח לי על האיחור..

  4. אלעזר

    7 באוגוסט 2018 - 20:07
    תגובה

    היי אורן.
    אני ממש חייב את עצתך! אתה נשמע לי אחד שמבין בתחום…

    • אלעזר

      8 באוגוסט 2018 - 0:26
      תגובה

      *שלומי

  5. איתי

    15 בדצמבר 2020 - 11:37
    תגובה

    וואו! כל הכבוד….
    ממתינים לסקירה חדשה עבור PHP 8 🙂

השאר/י תגובה לאלעזר

לבטל

האימייל לא יוצג באתר. שדות החובה מסומנים *