بعد از مدتها کار با php ممکنه هنوز توابعی باشن که باهاشون برخورد نکردیم و نمیدونیم چنین توابعی هم وجود دارن که میتونن کار
مارو راحتتر کنن.در زیر اشاره ای میکنم به 9 عدد از توابع مفیدی که ممکنه خیلی ها هنوز بهش بر نخورده باشن.
1- توابعی با تعداد آرگومانهای دلخواه
ممکنه قبلا شما توابعی نوشته باشین که به تعداد دلخوله میتنین آرگومان بهش پاس بدین اما تابعی توی php وجود داره که به شما
اجازه میده توابعی بسازید که تعداد آرگومانها به صورت واقعی دلخواه هستند.
در ابتدا یک مثال از تابعی میزم که میتونه تعداد آرگ.مانهای دلخواه رو بهش پاس بدید
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// function with 2 optional arguments function foo($arg1 = '', $arg2 = '') { echo "arg1: $arg1n"; echo "arg2: $arg2n"; } foo('hello','world'); /* prints: arg1: hello arg2: world */ foo(); /* prints: arg1: arg2: */ |
در این تابع شما میتونید یک ، دو آرگومان رو ببه تابع پاس بدید.حتی میتونید هیچ آرگومانی رو به تابع نفرستید که هیچ اشکالی نداره
اما بیشتر از 2 تا آرگومان رو اگر به تابع پاس بدیم داخل تابع نمیتونیم از آرگومان سوم استفاده کنیم.میبینیم که این روش هم
محدودیتهای خودش رو داره.
اما حالا از تابع func_get_args()استفاده میکنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// yes, the argument list can be empty function foo() { // returns an array of all passed arguments $args = func_get_args(); foreach ($args as $k => $v) { echo "arg".($k+1).": $vn"; } } foo(); /* prints nothing */ foo('hello'); /* prints arg1: hello */ foo('hello', 'world', 'again'); /* prints arg1: hello arg2: world arg3: again */ |
حالا شما با تابع func_get_args() به تعداد دلخواه میتونید به توابعتون آرگومان بفرستید و توی تابع ازش استفاده کنید.
2-استفاده از تابع glob() برای پیدا کردن فایلها :
تابع glob() برای پیدا کردن فایلها با استفاده از یک الگوی خاص میتونه به شما کمک کنه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
// get all php files $files = glob('*.php'); print_r($files); /* output looks like: Array ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php ) */ شما میتونید چند نوع فایل مختلف رو جستجو کنید 1 $files = glob('*.{php,txt}', GLOB_BRACE); print_r($files); /* output looks like: Array ( [0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php [4] => log.txt [5] => test.txt ) */ و یا یه مسیر بهش بدید : 1 $files = glob('../images/a*.jpg'); print_r($files); /* output looks like: Array ( [0] => ../images/apple.jpg [1] => ../images/art.jpg ) */ برای گرفتن مسیر واقعی فایلها هم میتونید ازrealpath() تابع استفاده کنید : 1 $files = glob('../images/a*.jpg'); // applies the function to each array element $files = array_map('realpath',$files); print_r($files); /* output looks like: Array ( [0] => C:wampwwwimagesapple.jpg [1] => C:wampwwwimagesart.jpg ) */ |
3- مقدار حافظه استفاده شده :
وقتی شما بدونید که برنامه ای که نوشتید چقدر از فضای حافظه رو اشغال میکنه بهتر میتونید برنامه خودتون رو بهینه کنید.
پی اچ پی یک مدیریت حافظه و GC قوی داره.مقدار فضایی که اسکریپت شما در حافظه اشغال میکنه میتونه روی سرعت اجرای برنامه
تاثیر گذار باشه.ما میتونیم از تابع memory_get_usage() برای مقدار حافشه مصرفی و از تابع memory_get_peak_usage() برای اطلاع
از بیشترین حافظه مصرفی در اسکریت استفاده کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
echo "Initial: ".memory_get_usage()." bytes n"; /* prints Initial: 361400 bytes */ // let's use up some memory for ($i = 0; $i < 100000; $i++) { $array []= md5($i); } // let's remove half of the array for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes n"; /* prints Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes n"; /* prints Peak: 13687072 bytes */ |
4-مقدار استفاده از CPU
برای اینکار از تابع getrusage() استفاده میکنیم.اسن تابع روی سرور های ویندوز جواب نمیده.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
print_r(getrusage()); /* prints Array ( [ru_oublock] => 0 [ru_inblock] => 0 [ru_msgsnd] => 2 [ru_msgrcv] => 3 [ru_maxrss] => 12692 [ru_ixrss] => 764 [ru_idrss] => 3864 [ru_minflt] => 94 [ru_majflt] => 0 [ru_nsignals] => 1 [ru_nvcsw] => 67 [ru_nivcsw] => 4 [ru_nswap] => 0 [ru_utime.tv_usec] => 0 [ru_utime.tv_sec] => 0 [ru_stime.tv_usec] => 6269 [ru_stime.tv_sec] => 0 ) */ |
5- ثابتهای جادویی!
Php ثابتهای بسیار مفیدی استفاده میکنه که در زیر یه تعدادی رو براتون میذارم :
__LINE__ خط فعلی برنامه
__FILE__ مسیر فایل
__DIR__ مسیر دایرکتوری فایل جاری
__FUNCTION__ نام تابع جاری
__CLASS__ نام کلاس جاری
__METHOD__ نام متد جاری
__NAMESPACE__ فضای نام جاری
1 2 3 4 5 6 7 |
// this is relative to the loaded script's path // it may cause problems when running scripts from different directories require_once('config/database.php'); // this is always relative to this file's path // no matter where it was included from require_once(dirname(__FILE__) . '/config/database.php'); |
6-ساخت یک شناسه منحصر به فرد :
گاهی اوقات ممکنه شما بخواید یک رشته منحصر به فرد درست کنید.پی اچ پی یک تابع با نام uniqid() برای همین کار در اختیار ما گذاشته :
1 2 3 4 5 6 7 8 9 10 11 |
// generate unique string echo uniqid(); /* prints 4bd67c947233e */ // generate another unique string echo uniqid(); /* prints 4bd67c9472340 */ |
اگر توجه کنید میبینید که ابتدای رشته های ایجاد شده مثل هم هستند.این به دلیله که تابع uniqid() برای ساخت چنین رشته هایی از زمان سیستم استفاده میکنه.
برای اینکه امکان شباهت دوتا رشته رو کم کنیم میتونیم یک پیشوند به تابع پاس بدیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// with prefix echo uniqid('foo_'); /* prints foo_4bd67d6cd8b8f */ // with more entropy echo uniqid('',true); /* prints 4bd67d6cd8b926.12135106 */ // both echo uniqid('bar_',true); /* prints bar_4bd67da367b650.43684647 */ |
7-Serialization
آیا تا حالا نیاز داشتید که یک متغیر پیچیده رو توی فایل یا دیتابیس ذخیره کنید؟ لازم نیست با یک راه حل فانتزی یک آرایه رو به رشته
قالب بندی شده تبدیل کنید.بااستفاده از تابع serialize() وunserialize() به راحتی میتونید این کارو انجام بدید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// a complex array $myvar = array( 'hello', 42, array(1,'two'), 'apple' ); // convert to a string $string = serialize($myvar); echo $string; /* prints a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";} */ // you can reproduce the original variable $newvar = unserialize($string); print_r($newvar); /* prints Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */ |
این دوتا تابع از توابع بومی پی اچ هستن.اما از وقتی که JSON مجبوب تر شده دوتاتابع دیگه هم به پی اچ پی اضافه شد که
json_encode() و json_decode() نام دارن که توابع بسیار مفیدی هستند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// a complex array $myvar = array( 'hello', 42, array(1,'two'), 'apple' ); // convert to a string $string = json_encode($myvar); echo $string; /* prints ["hello",42,[1,"two"],"apple"] */ // you can reproduce the original variable $newvar = json_decode($string); print_r($newvar); /* prints Array ( [0] => hello [1] => 42 [2] => Array ( [0] => 1 [1] => two ) [3] => apple ) */ |
این توابع خیلی بهتر از دوتا تابع قبلی هستن چون با جاوااسکریپت و بیشتر زبانهای برنامه نویسی دیگه سازگارن.
8-فشرده سازی رشته ها
وقتی بحث از فشرده سازی میشه ما معمولا فایلها به ذهنمون میاد.این امکان در پی اچ پی وجود داره که بشه رشته هارو به حالت
فشرده در آورد.
در مثال زیر ما از دوتا تابع gzcompress() و gzuncompress() برای این کار استفاده میکنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit lacus quis ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellus posuere adipiscing. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales. "; $compressed = gzcompress($string); echo "Original size: ". strlen($string)."n"; /* prints Original size: 800 */ echo "Compressed size: ". strlen($compressed)."n"; /* prints Compressed size: 418 */ // getting it back $original = gzuncompress($compressed); |
با این توابع ما میتونیم حدود 50% از حجم یک رشته رو کم کنیم.همچین توابع gzencode() و gzdecode()با یک الگوریتم دیگه میتونن
همین مقدار از حجم رشته هارو فشرده کنن.
9- register_shutdown_function()
تابع register_shutdown_function() میتونید تعیین کنید قبل از اینکه اسکریپت شما به اتمام برسه چه تابعی اجرا بشه.اما اگر
اسکریپت شما با دستور exit به پایان برسه یا یک خطا رخ بده ویا برنامه به وسیله کاربر متوقف بشه (باکلیک روی دوکمه stop مرورگر )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$start_time = microtime(true); register_shutdown_function('my_shutdown'); // do some stuff // ... function my_shutdown() { global $start_time; echo "execution took: ". (microtime(true) - $start_time). " seconds."; } |
مقداد علی بخشی هستم. موسیقی دان، برنامه نویس، متخصص هوش مصنوعی، علم داده، متخصص بلاکچین و توسعه دهنده ربات های هوشمند.
دانش آموخته مقطع ارشد و دکتری دانشکده فنی دانشگاه تهران هستم. با سابقه تدریس درس برنامه نویسی در دانشگاه (پردیس بین الملل کیش دانشگاه تهران)