טכניקות PHP יעילות וטיפים
לפניכם מספר טכניקות PHP שלמדתי והפנמתי, וגם כמה טכניקות שאספתי מאתרים שונים.
הטכניקות אמורות בעיקר לשפר את יעילות הקוד שכתבתם, ואולי גם לפעמים לקצר אותו (למרות שלא זכור לי כעת על טכניקה שמקצרת).
להלן רשימת הטכניקות והטיפים:
1. פרה\פוסט-קידום\הפחתה - צורת העלאה המהירה ביותר:
ישנם 2 דרכים מקוצרות להעלות משתנה מספרי ב-1 (או לחלופין להפחית אותו ב-1).
דרך אחת, נקראת פוסט-קידום:
דרך שנייה, נקראת פרה-קידום:
בשפת PHP בלבד, העלאת משתנה בצורת פרה-קידום היא מהירה יותר (ולכן גם יעילה יותר) מאשר פוסט קידום.
מצב זה קיים אך ורק בשפת PHP (עד כמה שידוע לי). אין צורך להתחיל להחליף בשפות אחרות את הקודים מפוסט-קידום לפרה-קידום.
לגבי פרה\פוסט-הפחתת משתנה אני לא יודע בצורה בטוחה איזה מהם מהיר\יעיל יותר, אבל אני מניח שזה מתבצע אותו הדבר כמו העלאת משתנה - כלומר שפרה-הפחתה מהירה יותר.
[ למידע על פרה\פוסט-קידום\הפחתה אפשר למצוא, לדוגמא, באתר של איתן: http://php.eitan.ac.il/main.php?id=00132
או באתר של PHP הרישמי: http://il2.php.net/manual/en/langua...s.increment.php ]
2. בדיקת זוגיות של מספר:
בדר"כ כשבודקים אם מספר הוא זוגי או לא, מריצים את הקוד הבא:
קוד PHP:
if ( ($i % 2) == 0 )
# it's dual
אבל זה ידוע שפעולות מתמטיות יעילות פחות מאשר פעולות לוגיות, לכן עדיף יותר לבצע את הפעולה הבאה:
קוד PHP:
if ( ($i & 1) == 0 )
# it's dual
בפעולה זו אנו בודקים אם הסיבית האחרונה של מספר (בצורתו הבינארית) היא '0' לוגי או '1' לוגי.
אם הסיבית האחרונה (LSB = Least Significant Bit) היא 1, אז המספר הוא אי-זוגי.
אם הסיבית האחרונה (LSB ... ) היא 0, המספר זוגי.
[ למידע על אופרטורים לוגים מהאתר של איתן: http://php.eitan.ac.il/main.php?id=00129
מהאתר של PHP הרישמי: http://il2.php.net/manual/en/langua...ors.bitwise.php ]
3. שימוש ב-isset בלולאת FOR:
ברוב קודי ה-PHP ואולי בכולם תמיד תצטרכו לבצע פעולה של לולאת FOR.
בדר"כ, הקוד ייראה בצורה הבאה (או יהיה דומה לו):
קוד PHP:
$big_array = (/*...*/);
for ($i=0; $i < count($big_array); $i++)
{
/* Do Something */
}
שימוש בפונקציה count (או בפונקציה strlen, במקרה שמריצים את לולאת ה-FOR על מחרוזת) הוא מיותר, וסתם מבזבז משאבים חיוניים.
ואם אני לא טועה, עפ"י כתיבת התנאי של הלולאה בצורה הבאה:
קוד PHP:
/*...*/$i < count($big_array)/*...*/
הפונקציה count תרוץ כל פעם מחדש, מה שגורם לחיסרון די משמעותי מבחינת היעילות, שכן הדרך הבאה עדיפה יותר:
קוד PHP:
/*...*/
$size = count($big_array);
for ($i=0; $i < $size; $i++)
/*...*/
בדרך הנ"ל הפונקציה count רצה פעם אחת בלבד, והתוצאה שלה נשמרת במשתנה.
בדרך זו, במקום שהפונקציה count תרוץ כל פעם שהלולאת FOR מבצעת סיבוב נוסף, היא רצה פעם אחת וחוסכת די הרבה משאבים.
אבל, ידוע שהפונקציה isset מהירה יותר מ-strlen (ומהירה יותר גם מ-count ופונקציות רבות אחרות), לכן יהיה עדיף לכתוב את הקוד הנ"ל בצורה הבאה:
קוד PHP:
$big_array = (/*...*/);
for ($i=0; isset($big_array[$i]); ++$i)
{
/* Do Something */
}
חשוב לשים לב לכך שהחלפתי את דרך ההעלאה של המשתנה i ב-אחד.
כלומר, במקום לכתוב:
כתבתי:
וזאת בגלל שב-PHP (בלבד), העלאת משתנה בפרה-קידום הוא מהיר יותר מאשר העלאת משתנה בפוסט-קידום. אין לייחס מצב זה לשפות אחרות. (כמו C וכדו')
[ למידע על לולאת FOR מהאתר של PHP הרישמי: http://il2.php.net/manual/en/control-structures.for.php ]
4. הכנסת משתנים למחרוזת המוגדרת בתצורות שונות:
יש צורות רבות להגדרת מחרוזת, לדוגמא:
קוד PHP:
$str = 'string';
# OR
$str = "string";
# OR
$str = <<<EOF
string
EOF;
# OR
?>
string
<?php
[ למידע נוסף מהאתר הרישמי על צורות הגדרת מחרוזת: http://il2.php.net/manual/en/language.types.string.php ]
כל דרך יכולה להיות עדיפה מהשנייה בכל הנוגע להכנסת משתנים למחרוזת (או גם סתם שימוש במחרוזת), תלוי במצב.
לדוגמא, ידוע שהדרך הבאה:
קוד PHP:
//$subject = 'PHP';
$str = 'I am learning '.$subject.' at this moment.';
מהירה יותר מהדרך:
קוד PHP:
$str = "I am learning $subject at this moment.";
זאת בגלל שכאשר מחרוזת מוגדרת בגרשים ('), היא לא צריך לחפש אחרי תווים מיוחדים מסויימים ו"לתרגם" אותם.
אבל כאשר מחרוזת מוגדרת עם גרשיים ("), היא מחפשת אחרי (יחסית) הרבה תווים מיוחדים, מה שגורם לריצה איטית יותר של הקוד.
בכל זאת, לפחות בכל הנוגע להדפסת מחרוזות באמצעות פקודת echo בלבד, עדיין יש שיטה מהירה יותר משני השיטות הנ"ל.
הדרך הבאה מהירה יותר משני הנ"ל:
קוד PHP:
echo 'I am learning ' , $subject , ' at this moment.';
וזאת מהסיבה שבאמצעות שימוש בפסיקים, המחרוזת שלפני הפסיק פשוט מודפסת למסך במקום להישמר בזיכרון (כאשר משתמשים בנקודה, המחרוזת נשמרת בזיכרון, מה שלוקח זמן רב יותר).
( מה שבטוח, כאשר מגדירים מחרוזת ללא משתנים בכלל, עדיף להשתמש בגרשים יחידים - ' )
דבר נוסף, עד כמה שידוע לי, שימוש בהגדרת מחרוזת באמצעות Heredoc ( כשלדוגמא כתוב בהתחלה EOF>>>) והכנסת משתנים לתוכה, מומלץ רק אם המחרוזת ארוכה יחסית ויש משתנים רבים.
מי שיודע על נושא זה מידע נוסף מוזמן להוסיף...
[ למידע על מחרוזות וצורת איחסון מהאתר של PHP הרישמי: http://il2.php.net/manual/en/language.types.string.php
למידע על אופרטורי מחרוזות: http://il2.php.net/manual/en/langua...tors.string.php ]
5. שימוש ב- if-else ואופרטור Ternary:
יש ב-PHP אופרטור לכתיבת קוד if-else מקוצר, אופרטור זה נקרא Ternary.
לקוד הבא:
קוד PHP:
if ($myVar)
/* execute a code */
else
/* execute an other code */
יש את התחליף הבא, באמצעות Ternary:
קוד PHP:
$myVar ? /* execute a code */ : /* execute an other code */ ;
ידוע ששימוש באופרטור Ternary (למעוניינים, בעיברית הפירוש "משולש" או "של שלושה") מהיר יותר משימוש בפקודות if-else.
[ למידע על האופרטור Ternary מהאתר של PHP הרישמי: http://il2.php.net/manual/en/langua...parison.ternary ]
ד"א, צורת שימוש מיוחדת (לפחות מבחינתי) באופרטור Ternary שאהבתי:
קוד PHP:
$i > 30
? echo 'greater than 30.'
: $i > 20
? echo 'greater than 20.'
: $i > 10
? echo 'greater than 10.'
: $i > 5
? echo 'greater than 5.'
: echo 'Too small.';
6. שימוש בערכים הבוליאניים true ו- false:
[ מידע נוסף: http://il.php.net/manual/en/language.types.boolean.php ]
ב-PHP יש אפשרות לכתוב ערכים בוליאניים באותיות גדולות ובאותיות קטנות.
אם יש אות אחת שהיא גדולה בערך הבוליאני, PHP יצטרך לחפש את האות החלופית לה (לאמת את האות הגדולה). ואם כל האותיות יהיו גדולות....כך הוא יצטרך לבצע חיפוש גדול יותר.
לכן הדרך העדיפה ביותר לכתוב אותם היא באותיות קטנות.
לדוגמא, במקום לכתוב:
עדיף לכתוב:
* אני לא יודע אם זה נכון גם לגבי null והחברים הדומים (כמו array, new וכדו').
7. לולאת for מהירה יותר מלולאת while, לכן עדיף יהיה להשתמש בה אם אפשר (ותמיד אפשר).
לדוגמא, במקום לכתוב:
קוד PHP:
while ( $i > 0)
{
/*
...
*/
}
אפשר לכתוב:
קוד PHP:
for ( ; $i > 0 ; )
{
/*
...
*/
}
אין לי מושג מה הסיבה לכך.
אם אני לא טועה טכניקת ייעול זאת מצאתי פה בפורום.
8. שימוש נכון במבני בקרה (Control Structures):
מבני בקרה, ביניהם if-elseif-else / for / while, ניכתבים לפעמים בצורה הבאה:
קוד PHP:
if (...)
{
// execute one code syntax
}
בדוגמא הנ"ל אני מתכוון שמתבצעת פקודה אחת בלבד, אם ל- if חוזר ערך true בתנאי שלו.
כשקיים מצב שצריך להריץ רק פקודה אחת בתוך מבנה בקרה, PHP מרשה להסיר את הסוגריים המסולסלות, כך שהקוד לבסוף ייראה בצורה הבאה:
קוד PHP:
if (...)
// execute one code syntax
לדוגמא, אפשר גם "להגזים" ולרשום:
קוד PHP:
if (...) echo 'Hello World!';
כך שכל הקוד של מבנה הבקרה ותוכנו יהיה בשורה אחת בלבד.
אפשרות זאת חוסכת שורות ומאפשרת הבנה טובה יותר של הקוד כשקוראים אותו, מומלץ.
[ למידע על מבני בקרה: http://il2.php.net/manual/en/langua...-structures.php ]
9. פקודת echo מהירה יותר מ-print, כי print (בנוסף להדפסת המחרוזת) גם מחזירה את המחרוזת שהוא מדפיס.
10. שימוש בפונקציה str_replace מהירה יותר מ-preg_replace, ושימוש בפונקציה preg_replace מהירה יותר מ- ereg_replace. הישתמשו בהחלפת מחרוזות בחוכמה...
* הערה: זה נוגע גם לפונקציות האחיות, כלומר פונקציות Strings מהירות יותר מפונקציות preg, ופונקציות preg מהירות יותר מפונקציות ereg.
11. השתמשו תמיד ב-Tab'ים כשאתם כותבים את הקוד!
ב-Tab אני מתכוון לכפתור בצד שמאל של המקלדת, מעל כפתור ה- Caps Lock ומתחת לכפתור הטילדה\זרקא ( ~ ).
ראה תמונה:
https://2007-uploaded.fresh.co.il/2...05/82328157.jpg
דוגמא לכתיבת קוד עם Tabs:
קוד PHP:
class someClass
{
function login()
{
$this->skin = load_skin('login');
switch($gInput['code'])
{
case 'loginf':
$this->login_user_form();
break;
case 'dologin':
$this->do_login_user();
break;
case 'logout':
$this->logout_user();
break;
default:
# Do something.
break;
}
}
/* etc. */
}
_________________________________________________
קישורים חיצוניים למידע על טכניקות PHP טובות וטיפים נוספים:
http://www.sitepoint.com/forums/showthread.php?t=456441 - המומלץ ביותר מבין כל מה שמצאתי.
http://www.4webhelp.net/tutorials/?cid=3
http://warpspire.com/tipsresources/...intainable-code
http://www.phpwact.org
http://www.devarticles.com/c/a/PHP/...ing-Up-PHP-Code
http://evolt.org/node/26440
http://phpcode.mypapit.net/category/quick-tips
_________________________________________________
מקווה שתהנו ותפיקו את המיטב מהמידע. כל, או רוב, מה שכתבתי כאן מסתמך על הידע שלי ב-PHP, ועל מה שקראתי, הבנתי והפנמתי מאתרים שונים ברשת. אם יש טעויות אשמח שיתקנו אותי בצורה מתאימה.
זה יהיה ממש מצוין אם תוסיפו עוד טכניקות לקיצור וייעול הקוד ובכלל טיפים נוספים...
אפשר לכתוב גם על התעסקות של PHP עם אפליקציות שונות, כמו מסדי נתונים, מסמכי XML, מחרוזות Unicode ועוד.
נערך לאחרונה ע"י DCD בתאריך 05-09-2007 בשעה 20:55.
|