מדריך PHP עם דוגמאות להרצה
מדריך ומקור עיון חינמי ל-PHP 8: מערכים, foreach, פונקציות מחרוזות, תאריכים, טפסים, מחלקות ושגיאות. כל דוגמה רצה בתוך העמוד, ודוגמאות שמדפיסות HTML מציגות את העמוד עם טפסים שאפשר לשלוח.
להתחיל מסלול PHP מודרךצעדים ראשונים
- מה זה PHP?PHP היא שפת סקריפטים בצד השרת: קובץ PHP רץ על שרת האינטרנט ושולח לדפדפן את ה-HTML שהוא בונה. היא מפעילה את WordPress ואת Laravel וחלק גדול מהאינטרנט, והיא גם מריצה סקריפטים משורת הפקודה.
- התקנת PHPמתקינים PHP בפקודה אחת: winget ב-Windows, Homebrew ב-macOS, apt או dnf ב-Linux. אחר כך מריצים php -v בטרמינל כדי לבדוק שהכול עובד ואיזו גרסה מותקנת.
- הרצת PHPמריצים קובץ PHP מהטרמינל עם php index.php, או מגישים תיקייה לדפדפן עם השרת המובנה של PHP: php -S localhost:8000. לאף אחת מהדרכים לא צריך Apache או XAMPP.
- echo ו-printecho מדפיסה מחרוזת אחת או יותר: echo "Hello, $name"; או echo $a, $b;. זו הדרך הרגילה לשלוח טקסט או HTML לדף. print עושה אותו דבר עם ערך אחד ומחזירה 1; <?= $x ?> היא הצורה המקוצרת בתוך HTML.
- הצגת שגיאותכדי להציג את כל שגיאות PHP, שימו ini_set('display_errors', '1'); ו-error_reporting(E_ALL); בראש הסקריפט, או הגדירו display_errors = On ו-error_reporting = E_ALL ב-php.ini. בסביבת ייצור, רשמו שגיאות ללוג במקום להציג אותן.
- PHP מול PythonPHP נבנתה בשביל האינטרנט: קובץ רץ בכל בקשה ומדפיס דף, והיא מפעילה את WordPress ואת Laravel. Python היא שפה כללית שעושה גם פיתוח ווב (Django, Flask) ושולטת במדעי הנתונים, באוטומציה ובלמידת מכונה.
- PHP מול JavaScriptPHP רצה על השרת ושולחת לדפדפן HTML מוכן. JavaScript רצה בדפדפן, שם היא משנה את הדף אחרי שהוא נטען, וגם על השרת עם Node.js. רוב האתרים משתמשים בשתיהן: PHP לבניית דפים ו-API, ו-JavaScript לאינטראקציה.
יסודות
- משתניםמשתנה ב-PHP מתחיל ב-$ ונוצר בהשמה: $name = "Ada";. אין מילת מפתח להגדרה ואין טיפוס קבוע. פונקציות לא רואות משתנים מבחוץ אלא אם מעבירים אותם, משתמשים ב-global או לוכדים אותם; static שומרת ערך בין קריאות.
- טיפוסי נתוניםב-PHP יש עשרה טיפוסים: ארבעה סקלריים (int, float, string, bool), ארבעה מורכבים (array, object, callable, iterable) ושניים מיוחדים (null, resource). var_dump($x) מציגה את הטיפוס והערך, ו-gettype($x) מחזירה את שם הטיפוס.
- מחרוזותמשרשרים מחרוזות ב-PHP עם אופרטור הנקודה ("Hello, " . $name) או שמים משתנים ישירות בתוך מירכאות כפולות ("Hello, $name"). גרשיים בודדים מדפיסים טקסט כפי שנכתב. כאן תלמדו שרשור, .=, אינטרפולציה של מערכים ואובייקטים ושינוי אותיות עם strtoupper, strtolower, ucfirst ו-ucwords.
- Heredoc ו-Nowdocheredoc ב-PHP הוא מחרוזת מרובת שורות שמתחילה ב-<<<EOT ומסתיימת ב-EOT; היא מחליפה משתנים כמו מחרוזת במירכאות כפולות. nowdoc, <<<'EOT', שומר את הטקסט בדיוק כפי שנכתב. כאן תלמדו את התחביר, כללי ההזחה, אינטרפולציה של מערכים ואובייקטים ותבניות HTML.
- אופרטוריםאופרטורים ב-PHP פועלים על ערכים: +, -, *, /, %, ** לחשבון, =, +=, .=, ??= להשמה, &&, ||, ! ו-xor ללוגיקה, . לשרשור מחרוזות, ==, ===, <=> להשוואה ו-++, -- להגדלה. כאן תלמדו כל קבוצה עם דוגמאות להרצה, וגם את מלכודת הקדימות של and מול &&.
- אופרטורי השוואהPHP משווה ערכים עם == (שווים אחרי המרת טיפוסים), === (ערך שווה ואותו טיפוס), != ו-!==, < > <= >= ואופרטור החללית <=>. למדו מתי == ממיר טיפוסים, מה השתנה ב-PHP 8, וראו כל השוואה רופפת ומחמירה בטבלה אחת.
- אופרטור טרנריהאופרטור הטרנרי ב-PHP הוא if/else בשורה אחת: $result = $condition ? 'yes' : 'no';. למדו את הטרנרי המקוצר ?: (אופרטור אלביס), במה הוא שונה מ-??, למה טרנרי מקונן צריך סוגריים מאז PHP 8, ומתי match היא הבחירה הנקייה יותר.
- Null coalescing ??אופרטור ה-null coalescing ב-PHP מחזיר את הצד השמאלי שלו אלא אם הוא null או לא מוגדר: $name = $_GET['name'] ?? 'Guest';. הוא אף פעם לא מזהיר על משתנה או מפתח מערך חסרים. למדו שרשראות ??, את ההצבה ??=, ?? מול ?:, ואת האופרטור nullsafe ?->.
- המרת טיפוסיםממירים מחרוזת PHP למספר שלם עם (int) $str או intval($str); (int) "42" הוא 42 ו-(int) "12abc" הוא 12. למדו המרה ל-int, float, bool, string ו-array, מחרוזות מספריות, intval עם בסיס, settype, ואיך לאמת קלט במקום לקבל 0 בשקט.
- קבועיםקבוע ב-PHP הוא שם לערך שלא יכול להשתנות: const MAX_USERS = 100; או define('MAX_USERS', 100);. למדו define מול const, מערכים קבועים, קבועי מחלקה עם self::, בדיקה עם defined(), וקבועי הקסם __LINE__, __FILE__, __DIR__ ו-__CLASS__.
- isset()isset($var) מחזירה true כשמשתנה קיים ואינו null, ו-false אחרת, בלי שום אזהרה. היא בודקת גם מפתחות מערך ומאפייני אובייקטים: isset($user['email']). למדו isset עם כמה משתנים, מפתחות מקוננים, isset מול empty, isset מול array_key_exists ובדיקת שליחת טפסים.
- empty()empty($var) מחזירה true כשמשתנה חסר או שקרי: null, false, 0, 0.0, "", "0" או []. היא אף פעם לא מזהירה על משתנים או מפתחות לא מוגדרים. למדו למה "0" נחשב ריק, איך לבדוק בדיוק מחרוזת או מערך ריקים, empty מול isset ואימות קלט מטפסים.
- מתמטיקה ועיגולround($x, 2) מעגלת לשתי ספרות אחרי הנקודה, floor() תמיד מעגלת למטה ו-ceil() תמיד מעגלת למעלה. וגם intdiv(), האופרטור %, ** לחזקות, abs(), max(), min() ו-random_int() למספרים אקראיים.
בקרת זרימה
- if, elseif, elseif (condition) { ... } מריץ בלוק רק כשהתנאי מתקיים, elseif בודק את התנאי הבא, ו-else רץ כששום תנאי לא התאים. כולל elseif מול else if, && ו-||, ערכים אמיתיים ותחביר if: endif; לתבניות HTML.
- משפט switchswitch ($value) משווה ערך אחד מול רשימת תוויות case ומריץ את הקוד מההתאמה הראשונה ועד break. כולל כמה case לבלוק אחד, נפילה, default, switch(true), ולמה switch משתמש בהשוואה רופפת ==.
- ביטוי matchmatch ($x) { 1, 2 => 'low', default => 'other' } משווה ערך עם === מחמיר, מחזיר את התוצאה של הזרוע הראשונה שמתאימה, וזורק UnhandledMatchError כששום דבר לא מתאים. כולל match מול switch, match(true) ו-match עם enums.
- לולאת forfor ($i = 0; $i < 10; $i++) { ... } מריצה בלוק מספר קבוע של פעמים: ערך התחלה, תנאי שנבדק לפני כל סבב וצעד. כולל מעבר על מערך לפי אינדקס, ספירה לאחור, לולאות מקוננות, break ו-continue.
- לולאת whilewhile (condition) { ... } חוזרת על בלוק כל עוד התנאי מתקיים, ובודקת אותו לפני כל סבב. do { ... } while (condition); בודקת אחרי, ולכן היא תמיד רצה לפחות פעם אחת. כולל while (true) עם break, קריאת קובץ שורה אחר שורה והימנעות מלולאות אינסופיות.
- לולאת foreachforeach ($array as $value) עוברת על כל איבר במערך, ו-foreach ($array as $key => $value) נותנת גם את המפתח. כולל קבלת האינדקס, שינוי ערכים דרך הפניה ומלכודת ה-unset(), break ו-continue, מערכים מקוננים, list() בתוך foreach ובניית HTML.
מערכים
- מערכיםמערך ב-PHP הוא רשימה מסודרת של ערכים, כל אחד שמור תחת מפתח: $fruits = ['apple', 'banana']; נקרא כ-$fruits[0]. למדו איך יוצרים מערכים, קוראים ומשנים איברים, עוברים עליהם בלולאה, מדפיסים אותם, ובאיזו פונקציית מערך להשתמש.
- מערכים אסוציאטיבייםמערך אסוציאטיבי ב-PHP שומר ערכים תחת מפתחות שאתם נותנים להם שם: $user = ['name' => 'Ada', 'age' => 36]; נקרא כ-$user['name']. למדו איך מוסיפים, משנים ומסירים זוגות, עוברים על מפתחות וערכים, מקבלים את כל המפתחות או הערכים, בודקים מפתח וממיינים לפי מפתח או ערך.
- מערכים רב ממדייםמערך רב ממדי ב-PHP הוא מערך שהאיברים שלו הם מערכים, וקוראים אותו עם זוג סוגריים לכל רמה: $grid[1][2] או $users[0]['name']. למדו איך יוצרים מערכים מקוננים, קוראים ומשנים ערכים עמוקים, עוברים עם foreach מקונן, בונים טבלת HTML, שולפים עמודה וממיינים שורות.
- array_push()array_push($arr, $value) מוסיפה ערך אחד או יותר לסוף מערך; $arr[] = $value עושה את אותו הדבר לערך אחד ומהיר יותר. למדו איך מוסיפים לסוף, להתחלה או לאמצע של מערך, מוסיפים מפתח וערך, ונמנעים מהבאג הקלאסי של ערך ההחזרה.
- count()count($arr) מחזירה את מספר האיברים במערך PHP, ולכן count(['a', 'b', 'c']) הוא 3. למדו איך סופרים מערכים מקוננים עם COUNT_RECURSIVE, מה הקשר בין sizeof() ל-count(), איך סופרים ערכים שמתאימים לתנאי, ולמה count(null) זורקת TypeError מאז PHP 8.
- in_array()in_array($needle, $haystack) מחזירה true כשהערך נמצא במערך. העבירו true כארגומנט השלישי לבדיקה מחמירה, in_array('1', $ids, true), כך שגם הטיפוסים חייבים להתאים. למדו את הדגל המחמיר, חיפוש בלי תלות באותיות גדולות וקטנות, בדיקת כמה ערכים, מערכים מקוננים והחלופה המהירה עם isset.
- array_search()array_search($value, $array) מחזירה את המפתח של האיבר הראשון ששווה ל-$value, או false כשאין כזה. כיוון שהמפתח יכול להיות 0, תמיד בדקו את התוצאה עם !== false. למדו חיפוש מחמיר, מציאת כל ההתאמות, חיפוש במערך רב ממדי עם array_column וחיפוש בלי תלות באותיות גדולות וקטנות.
- array_key_exists()array_key_exists('key', $array) מחזירה true כשלמערך יש את המפתח הזה, גם אם הערך שלו null. isset($array['key']) מהירה יותר אבל מחזירה false לערך null. למדו את ההבדל, key_exists(), מפתחות מקוננים, בדיקת כמה מפתחות, ולמה אובייקטים צריכים property_exists().
- array_merge()array_merge($a, $b) מחברת מערכים לאחד: ערכים עם מפתחות מספריים מתווספים וממוספרים מחדש, ובמפתחות מחרוזת המערך המאוחר מנצח. למדו במה array_merge שונה מהאופרטור + ומתחביר הפריסה [...$a, ...$b], איך ממזגים רשימה של מערכים, ומתי array_merge_recursive או array_replace מתאימות יותר.
- array_map()array_map($callback, $array) קוראת ל-callback על כל איבר ומחזירה מערך חדש של התוצאות. למדו פונקציות חץ, מפתחות, מיפוי של כמה מערכים בבת אחת, ומתי array_walk או foreach מתאימות יותר.
- array_filter()array_filter($array, $callback) שומרת את האיברים שעבורם ה-callback מחזיר true. למדו איך מסירים ערכים ריקים, מסננים לפי מפתח עם ARRAY_FILTER_USE_KEY, ממספרים מחדש את התוצאה עם array_values, ומסכמים עם array_reduce.
- מיון מערכיםsort($array) ממיינת רשימה במקום, asort ו-ksort ממיינות מערך אסוציאטיבי לפי ערך או לפי מפתח, ו-usort ממיינת עם השוואה משלכם. למדו את כולן, מיינו מערך רב ממדי לפי עמודה, והימנעו מהטעות הקלאסית $sorted = sort($arr).
- הסרה ממערךunset($array[$key]) מסירה איבר לפי מפתח, array_splice מסירה לפי מיקום וממספרת מחדש, ו-array_diff מסירה לפי ערך. למדו כל אחת מהן, איך ממספרים מחדש אחר כך, ואת המלכודת של array_search שמוחקת את האיבר הלא נכון.
- array_slice()array_slice($array, $offset, $length) מחזירה עותק של חלק ממערך בלי לשנות את המקור. למדו היסטים שליליים לפריטים האחרונים, preserve_keys, חלוקה לדפים של רשימה, ובמה היא שונה מ-array_splice.
- array_unique()array_unique($array) מסירה ערכים כפולים ושומרת את המופע הראשון של כל אחד, עם המפתח המקורי שלו. למדו איך ממספרים מחדש את התוצאה, מסירים כפילויות בלי תלות באותיות גדולות וקטנות, הופכים מערך רב ממדי לייחודי, וסופרים או מוצאים את הכפילויות.
- array_column()array_column($rows, 'email') מחזירה את שדה האימייל של כל שורה כמערך שטוח. למדו את ארגומנט מפתח האינדקס, מתן מפתחות לשורות לפי id, שימוש עם אובייקטים ומציאת שורה עם array_search.
- פירוק מערכים ו-list()[$a, $b] = $array מציב את שני האיברים הראשונים ב-$a וב-$b בשורה אחת, ו-['name' => $name] = $user עושה את אותו הדבר לפי מפתח. list() הוא הכתיב הישן. כולל דילוג על איברים, החלפת משתנים, כמה ערכי החזרה, פירוק בתוך foreach ואופרטור הפריסה ...
מחרוזות
- explode()explode(',', $string) מפצלת מחרוזת בכל פסיק ומחזירה את החלקים כמערך. למדו את פרמטר ה-limit, פיצול לפי ירידת שורה, trim לחלקים, ומתי str_split או preg_split הן הכלי הטוב יותר.
- implode()implode(', ', $array) מחברת את ערכי המערך למחרוזת אחת עם מפריד ביניהם. למדו implode עם מפתחות, מערכים אסוציאטיביים, בניית רשימות HTML וההבדל בין implode ל-join.
- str_replace()str_replace($search, $replace, $subject) מחליפה כל מופע של $search ב-$replace. למדו מערכים של ערכי חיפוש והחלפה, ספירת החלפות, str_ireplace שלא תלויה ברישיות, והחלפה של המופע הראשון בלבד.
- substr()substr($string, $offset, $length) מחזירה חלק ממחרוזת. למדו היסטים שליליים, קבלת התווים הראשונים או האחרונים, mb_substr לטקסט יפני ולטקסט UTF-8 אחר, substr_count וקיצור טקסט עם שלוש נקודות.
- strpos()strpos($haystack, $needle) מחזירה את המיקום של המופע הראשון של $needle, או false אם הוא לא נמצא. למדו את בדיקת !== false, stripos שלא תלויה ברישיות, ההתאמה האחרונה עם strrpos ומציאת כל המופעים.
- str_contains()str_contains($haystack, $needle) מחזירה true אם $needle מופיעה איפשהו ב-$haystack. למדו את הגרסה שלא תלויה ברישיות, את str_starts_with ו-str_ends_with, בדיקה של כמה מילים, ואת הגרסה עם strpos ל-PHP 7.
- trim()trim($string) מסירה רווחים, טאבים וירידות שורה משני הקצוות של מחרוזת; ltrim() ו-rtrim() מנקות צד אחד. למדו איך מסירים תווים מסוימים, את הרווח היפני ברוחב מלא, ואיך עושים trim לכל ערך במערך.
- strlen()strlen($string) מחזירה את אורך המחרוזת בבתים; mb_strlen($string) מחזירה אותו בתווים. למדו למה טקסט יפני ואימוג'י נותנים תשובות שונות, איך בודקים מחרוזת ריקה ואיך מאמתים את אורך הקלט.
- sprintf()sprintf() בונה מחרוזת מתבנית ומערכים: sprintf('%05.2f', 3.14159) מחזירה "03.14". למדו %s, %d ו-%f, ריפוד באפסים, מספר קבוע של ספרות עשרוניות, יישור, מספור ארגומנטים, printf ו-vsprintf.
- number_format()number_format(1234567.891, 2) מחזירה "1,234,567.89": היא מעגלת למספר הספרות העשרוניות שביקשתם ומוסיפה מפריד אלפים. למדו את ארבעת הפרמטרים, פורמטים אירופיים ויפניים, איך היא מעגלת, ולמה התוצאה היא מחרוזת.
- ירידות שורהכדי להדפיס שורה חדשה ב-PHP, כתבו "\n" בתוך מירכאות כפולות או השתמשו ב-PHP_EOL. בדף אינטרנט ירידת שורה לא נראית, אז השתמשו ב-<br> או ב-nl2br(). למדו את ההבדל, למה '\n' בגרשיים בודדים לא עובד, ואיך מפצלים או מסירים ירידות שורה.
- preg_match()preg_match($pattern, $subject, $matches) בודקת מחרוזת מול ביטוי רגולרי ומחזירה 1 כשיש התאמה ו-0 כשאין. למדו קבוצות לכידה, קבוצות עם שם, preg_match_all, עוגנים, תבניות לאימות ואת המשנה u לטקסט UTF-8 ויפני.
- preg_replace()preg_replace($pattern, $replacement, $subject) מחליפה כל התאמה של ביטוי רגולרי: preg_replace('/\s+/', ' ', $text) מכווצת רווחים לבנים. למדו הפניות לאחור כמו $1, את preg_replace_callback, הסרת תווים שאינם אותיות או ספרות, הגבלות וספירות.
פונקציות
- פונקציותמגדירים פונקציה ב-PHP עם function name($param) { return $value; }. למדו ערכי החזרה, פרמטרים עם ברירת מחדל, ארגומנטים בשם, העברה לפי הפניה, הצהרות טיפוס עם strict_types, טיפוסים nullable ו-union, ו-...$args משתנה.
- פונקציות חץפונקציית חץ היא פונקציה אנונימית של ביטוי אחד שנכתבת fn($x) => $x * 2. היא משתמשת במשתנים חיצוניים אוטומטית, לפי ערך, בלי use. למדו את התחביר, איך הלכידה עובדת, טיפוסים, callbacks ל-array_map ול-usort, ומתי להשתמש ב-closure מלא במקומה.
- פונקציות אנונימיותפונקציה אנונימית (closure) היא פונקציה בלי שם שנשמרת במשתנה: $greet = function ($name) { return "Hi $name"; };. למדו את מילת המפתח use, לכידה לפי הפניה, callables, תחביר ה-first-class callable strlen(...) ו-closures בתוך מחלקות.
- גנרטוריםגנרטור הוא פונקציה שמשתמשת ב-yield כדי להחזיר ערכים אחד אחד, כך ש-foreach יכולה לעבור על מיליון פריטים בלי לבנות מערך. למדו את yield, מפתחות, חיסכון בזיכרון, רצפים אינסופיים, yield from, send() ו-getReturn().
מחלקות ואובייקטים
- מחלקות ואובייקטיםמחלקה ב-PHP היא תבנית שמוצהרת עם `class Name { }`, ו-`new Name()` יוצר ממנה אובייקט. למדו מאפיינים, מתודות, `$this`, public/private/protected, מאפיינים עם טיפוס ו-readonly, `__toString`, ולמה הצבה של אובייקט לא מעתיקה אותו.
- בנאיםבנאי ב-PHP הוא המתודה `__construct()`, שרצה אוטומטית כשכותבים `new ClassName(...)`. למדו קידום מאפיינים בבנאי, ארגומנטים עם ברירת מחדל ובשם, אימות, `parent::__construct()`, ואיך מדמים כמה בנאים עם מתודות factory סטטיות.
- ירושהב-PHP מחלקה יורשת ממחלקה אחרת עם `class Dog extends Animal`: היא מקבלת את המאפיינים והמתודות הציבוריים והמוגנים של האב, יכולה לדרוס אותם, ועדיין יכולה לקרוא למקור עם `parent::method()`. למדו דריסה, protected, final, instanceof ואת המלכודת של מתודה פרטית.
- ממשקיםממשק ב-PHP מפרט מתודות שמחלקה מבטיחה שיהיו לה: `interface Shape { public function area(): float; }`, ו-`class Circle implements Shape` חייבת אז להגדיר את `area()`. למדו רמזי טיפוס עם ממשקים, מימוש של כמה ממשקים, קבועי ממשק, הרחבת ממשקים, ממשקים מובנים כמו Countable, וממשק מול מחלקה מופשטת.
- מחלקות מופשטותמחלקה מופשטת ב-PHP מוצהרת `abstract class Name` ואי אפשר ליצור ממנה מופע: היא קיימת כדי שירחיבו אותה. היא יכולה להחזיק מאפיינים, בנאי ומתודות גמורות, ועוד מתודות `abstract` בלי גוף שכל מחלקת בת חייבת לממש.
- Traitstrait ב-PHP הוא בלוק של מתודות ומאפיינים לשימוש חוזר שמעתיקים לתוך מחלקה עם `use TraitName;`. למדו שימוש בכמה traits, פתרון התנגשויות שמות עם `insteadof` ו-`as`, חברים מופשטים וסטטיים ב-trait, איזו מתודה מנצחת, ו-trait מול ממשק מול מחלקה מופשטת.
- Enumsenum ב-PHP (8.1 ומעלה) הוא טיפוס עם רשימה קבועה של ערכים: `enum Status: string { case Active = 'active'; }`. למדו enums טהורים ו-backed, `->value` ו-`->name`, המרה עם `from()` ו-`tryFrom()`, רשימת המקרים עם `cases()`, מתודות, קבועים, ממשקים ו-enums בתוך `match`.
- מתודות סטטיותמתודה או מאפיין `static` שייכים למחלקה, לא לאובייקט: קוראים למתודה עם `ClassName::method()` וקוראים את המאפיין עם `ClassName::$count`, בלי צורך ב-`new`. למדו `self::` מול `static::` (late static binding), `new static`, משתנים סטטיים בתוך פונקציות, ומתי static הוא הכלי הלא נכון.
- Namespacesnamespace ב-PHP מקבץ מחלקות, פונקציות וקבועים תחת קידומת: `namespace App\Models;` בראש הקובץ, ואז `use App\Models\User;` במקום אחר כדי להתייחס למחלקה בשם הקצר שלה. למדו שמות מלאים, כינויים עם `use ... as`, `use function`, הלוכסן ההפוך המוביל למחלקות גלובליות וטעינה אוטומטית לפי PSR-4.
שגיאות וחריגות
- try catchב-PHP, קוד שעלול להיכשל נכנס לבלוק `try { }`, ו-`catch (Exception $e) { }` רץ אם הוא זורק, עם הסיבה ב-`$e->getMessage()`. למדו תפיסה של כמה סוגי חריגות, `finally`, למה `catch (Exception)` מפספס את `TypeError` ואת `DivisionByZeroError` (תפסו `Throwable`), זריקה מחדש ו-handler גלובלי.
- חריגותזורקים חריגה ב-PHP עם `throw new Exception('message');`, והקורא קורא אותה עם `$e->getMessage()` בבלוק `catch`. למדו את מחלקות החריגה המובנות, כתיבת חריגות מותאמות, `getCode()`, `getLine()` ו-`getPrevious()`, `throw` כביטוי, והשגיאות ש-PHP זורקת בעצמה כמו `ValueError` ו-`TypeError`.
נתונים, קבצים והרשת
- json_encode()json_encode($value) הופכת מערך, אובייקט או ערך סקלרי של PHP למחרוזת JSON. מערכים אסוציאטיביים הופכים לאובייקטי JSON, רשימות הופכות למערכי JSON, ודגלים כמו JSON_PRETTY_PRINT ו-JSON_UNESCAPED_UNICODE שולטים בפלט.
- json_decode()json_decode($json, true) הופכת מחרוזת JSON למערך אסוציאטיבי של PHP; בלי true מקבלים אובייקטי stdClass. למדו ערכים מקוננים, טיפול בשגיאות עם JSON_THROW_ON_ERROR, json_validate() ולמה json_decode מחזירה null.
- date()date('Y-m-d') מחזירה את התאריך של היום כמחרוזת, ו-date('Y-m-d', $timestamp) מעצבת כל חותמת זמן Unix. למדו time(), mktime(), strtotime(), DateTimeImmutable, הוספת ימים, ההפרש בין שני תאריכים ואזורי זמן, עם דוגמאות שאפשר להריץ.
- פורמט תאריךפורמט תאריך ב-PHP הוא מחרוזת של אותיות כמו 'Y-m-d H:i:s', שבה Y היא השנה ב-4 ספרות, m החודש, d היום, H השעה, i הדקות ו-s השניות. כאן כל תו פורמט עם דוגמה, ועוד escape לאותיות, ISO 8601, תאריכים ביפנית והמרה מפורמט אחד לאחר.
- file_get_contents()file_get_contents('notes.txt') קוראת קובץ שלם ומחזירה אותו כמחרוזת אחת, או false אם היא לא מצליחה. השותפה שלה file_put_contents() כותבת מחרוזת לקובץ, ו-file() מחזירה את השורות כמערך.
- fopen()fopen('data.txt', 'r') פותחת קובץ ומחזירה handle, או false בכישלון. קוראים מה-handle עם fgets() או fread(), כותבים עם fwrite() וסוגרים עם fclose(). המצב ('r', 'w', 'a', 'x', 'c' וצורות ה-+ שלהם) קובע מה מותר לעשות.
- include ו-requireinclude 'header.php'; מריצה קובץ PHP אחר בנקודה הזו, כאילו הקוד שלו הודבק שם. require עושה את אותו הדבר אבל עוצרת את הסקריפט עם שגיאה קטלנית כשהקובץ חסר, בעוד include רק מזהירה וממשיכה. include_once ו-require_once טוענות קובץ רק בפעם הראשונה.
- טפסיםטופס PHP שולח לעצמו עם <form method="post">, והסקריפט קורא את השדות מ-$_POST['name'] כש-$_SERVER['REQUEST_METHOD'] הוא 'POST'. למדו אימות, הודעות שגיאה ליד השדות, שמירה על ערכים שהוזנו, תיבות סימון ורשימות בחירה, ו-escape לפלט.
- $_GET ו-$_POST$_GET מחזיק את ה-query string של כתובת ה-URL (?page=2 נותן את $_GET['page']) ו-$_POST מחזיק את השדות של טופס שנשלח עם method="post". למדו לקרוא את שניהם בבטחה, לבנות קישורים עם http_build_query, לבדוק את $_SERVER['REQUEST_METHOD'] ולבחור בין GET ל-POST.
- htmlspecialchars()htmlspecialchars($text) הופכת את חמשת התווים שיש להם משמעות ב-HTML (& < > " ') לישויות, כך שקלט משתמש מוצג כטקסט במקום לרוץ כ-markup. למדו ENT_QUOTES, escape למאפיינים, קידוד כפול, htmlentities ו-strip_tags.
- sessions ועוגיותקראו ל-session_start() בראש כל דף, ואז שמרו ערכים ב-$_SESSION['key']; PHP שומרת אותם בשרת וזוכרת את המבקר דרך עוגייה. setcookie('name', 'value', $options) שומרת ערך קטן בדפדפן, שנקרא בחזרה מ-$_COOKIE. למדו התחברות, התנתקות, הודעות flash, אפשרויות עוגיות והגדרות האבטחה.
- password_hash()בצעו hash לסיסמה עם password_hash($password, PASSWORD_DEFAULT), שמרו את התוצאה בת 60 התווים, ובדקו התחברות עם password_verify($password, $hash). למדו למה ה-hash משתנה בכל פעם, cost, password_needs_rehash, Argon2id, ולמה md5 ו-sha1 שגויות לסיסמאות.
- filter_var()filter_var($value, FILTER_VALIDATE_EMAIL) מחזירה את הערך אם הוא תקין ו-false אם לא; FILTER_VALIDATE_INT, FILTER_VALIDATE_URL, FILTER_VALIDATE_BOOL ו-FILTER_VALIDATE_IP עובדים באותה דרך. למדו את האפשרויות (min_range, default), הדגלים, מסנני הניקוי והמלכודת של false מול 0.
- PDOPDO היא שכבת מסד הנתונים של PHP: מתחברים עם new PDO('mysql:host=localhost;dbname=shop;charset=utf8mb4', $user, $pass), ואז מריצים כל שאילתה עם ערכים דרך prepare() ו-execute([$value]). למדו חיבור, prepared statements, שליפת שורות, הכנסות, טרנזקציות ו-WHERE IN.
- ComposerComposer הוא מנהל החבילות של PHP: composer require vendor/package מוריד ספרייה לתוך vendor/, רושם אותה ב-composer.json, ו-require 'vendor/autoload.php' טוען אותה. למדו להתקין את Composer, את composer.json, אילוצי גרסה, install מול update, וטעינה אוטומטית PSR-4 למחלקות שלכם.
ניפוי באגים ותרגול
- var_dump() ו-print_r()print_r($array) מדפיסה מערך בצורה קריאה, var_dump($value) מציגה גם כל טיפוס ואורך, ו-var_export מדפיסה קוד PHP תקין. למדו מתי להשתמש בכל אחת, איך מקבלים את הפלט של print_r כמחרוזת, ואיך מדפיסים יפה ב-HTML עם <pre>.
- שאלות ראיון24 שאלות ראיון ב-PHP עם תשובות קצרות ונכונות ל-PHP 8, מ-== מול === ו-isset מול empty ועד הפניות ב-foreach, self מול static, גנרטורים, SQL injection ו-hash לסיסמאות. לרוב התשובות יש קוד שאפשר להריץ ולשנות.