۹ تابع سودمند php

آبان ۳۰, ۱۳۹۰ توسط : سعید

بعد از مدتها کار با php ممکنه هنوز توابعی باشن که باهاشون برخورد نکردیم و نمیدونیم چنین توابعی هم وجود دارن که میتونن کار

مارو راحتتر کنن.در زیر اشاره ای میکنم به ۹ عدد از توابع مفیدی که ممکنه خیلی ها هنوز بهش بر نخورده باشن.

۱- توابعی با تعداد آرگومانهای دلخواه
ممکنه قبلا شما توابعی نوشته باشین که به تعداد دلخوله میتنین آرگومان بهش پاس بدین اما تابعی توی php وجود داره که به شما

اجازه میده توابعی بسازید که تعداد آرگومانها به صورت واقعی دلخواه هستند.
در ابتدا یک مثال از تابعی میزم که میتونه تعداد آرگ.مانهای دلخواه رو بهش پاس بدید

// 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:
*/

در این تابع شما میتونید یک ، دو آرگومان رو ببه تابع پاس بدید.حتی میتونید هیچ آرگومانی رو به تابع نفرستید که هیچ اشکالی نداره

اما بیشتر از ۲ تا آرگومان رو اگر به تابع پاس بدیم داخل تابع نمیتونیم از آرگومان سوم استفاده کنیم.میبینیم که این روش هم

محدودیتهای خودش رو داره.
اما حالا از تابع func_get_args()استفاده میکنیم :

// 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() به تعداد دلخواه میتونید به توابعتون آرگومان بفرستید و توی تابع ازش استفاده کنید.
۲-استفاده از تابع glob() برای پیدا کردن فایلها :
تابع glob() برای پیدا کردن فایلها با استفاده از یک الگوی خاص میتونه به شما کمک کنه :

// get all php files
$files = glob('*.php');

print_r($files);
/* output looks like:
Array
(
[۰] => phptest.php
[۱] => pi.php
[۲] => post_output.php
[۳] => test.php
)
*/

شما میتونید چند نوع فایل مختلف رو جستجو کنید

$files = glob('*.{php,txt}', GLOB_BRACE);

print_r($files);
/* output looks like:
Array
(
[۰] => phptest.php
[۱] => pi.php
[۲] => post_output.php
[۳] => test.php
[۴] => log.txt
[۵] => test.txt
)
*/

و یا یه مسیر بهش بدید :

$files = glob('../images/a*.jpg');
print_r($files);
/* output looks like:
Array
(
[۰] => ../images/apple.jpg
[۱] => ../images/art.jpg
)
*/

برای گرفتن مسیر واقعی فایلها هم میتونید ازrealpath()  تابع  استفاده کنید :

$files = glob('../images/a*.jpg');

// applies the function to each array element
$files = array_map('realpath',$files);

print_r($files);
/* output looks like:
Array
(
[۰] => C:wampwwwimagesapple.jpg
[۱] => C:wampwwwimagesart.jpg
)
*/

۳- مقدار حافظه استفاده شده :

وقتی شما بدونید که برنامه ای که نوشتید چقدر از فضای حافظه رو اشغال میکنه بهتر میتونید برنامه خودتون رو بهینه کنید.
پی اچ پی یک مدیریت حافظه و GC قوی داره.مقدار فضایی که اسکریپت شما در حافظه اشغال میکنه میتونه روی سرعت اجرای برنامه

تاثیر گذار باشه.ما میتونیم از تابع memory_get_usage() برای مقدار حافشه مصرفی و از تابع memory_get_peak_usage() برای اطلاع

از بیشترین حافظه مصرفی در اسکریت استفاده کنیم.

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
*/

۴-مقدار استفاده از CPU
برای اینکار از تابع getrusage() استفاده میکنیم.اسن تابع روی سرور های ویندوز جواب نمیده.

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
)
*/

۵- ثابتهای جادویی!

Php ثابتهای بسیار مفیدی استفاده میکنه که در زیر یه تعدادی رو براتون میذارم :
__LINE__ خط فعلی برنامه
__FILE__ مسیر فایل
__DIR__ مسیر دایرکتوری فایل جاری
__FUNCTION__ نام تابع جاری
__CLASS__ نام کلاس جاری
__METHOD__ نام متد جاری
__NAMESPACE__ فضای نام جاری

// 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');

۶-ساخت یک شناسه منحصر به فرد :
گاهی اوقات ممکنه شما بخواید یک رشته منحصر به فرد درست کنید.پی اچ پی یک تابع با نام uniqid() برای همین کار در اختیار ما گذاشته :

// generate unique string
echo uniqid();
/* prints
۴bd67c947233e
*/

// generate another unique string
echo uniqid();
/* prints
۴bd67c9472340
*/

اگر توجه کنید میبینید که ابتدای رشته های ایجاد شده مثل هم هستند.این به دلیله که تابع uniqid() برای ساخت چنین رشته هایی از زمان سیستم استفاده میکنه.
برای اینکه امکان شباهت دوتا رشته رو کم کنیم میتونیم یک پیشوند به تابع پاس بدیم.

// with prefix
echo uniqid('foo_');
/* prints
foo_4bd67d6cd8b8f
*/

// with more entropy
echo uniqid('',true);
/* prints
۴bd67d6cd8b926.12135106
*/

// both
echo uniqid('bar_',true);
/* prints
bar_4bd67da367b650.43684647
*/

۷-Serialization

آیا تا حالا نیاز داشتید که یک متغیر پیچیده رو توی فایل یا دیتابیس ذخیره کنید؟ لازم نیست با یک راه حل فانتزی یک آرایه رو به رشته

قالب بندی شده تبدیل کنید.بااستفاده از تابع serialize() وunserialize() به راحتی میتونید این کارو انجام بدید :

// a complex array
$myvar = array(
'hello',
۴۲,
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
(
[۰] => hello
[۱] => 42
[۲] => Array
(
[۰] => 1
[۱] => two
)

[۳] => apple
)
*/

این دوتا تابع از توابع بومی پی اچ هستن.اما از وقتی که JSON مجبوب تر شده دوتاتابع دیگه هم به پی اچ پی اضافه شد که

json_encode() و json_decode() نام دارن که توابع بسیار مفیدی هستند.

// a complex array
$myvar = array(
'hello',
۴۲,
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
(
[۰] => hello
[۱] => 42
[۲] => Array
(
[۰] => 1
[۱] => two
)

[۳] => apple
)
*/

این توابع خیلی بهتر از دوتا تابع قبلی هستن چون با جاوااسکریپت و بیشتر زبانهای برنامه نویسی دیگه سازگارن.
۸-فشرده سازی رشته ها
وقتی بحث از فشرده سازی میشه ما معمولا فایلها به ذهنمون میاد.این امکان در پی اچ پی وجود داره که بشه رشته هارو به حالت

فشرده در آورد.
در مثال زیر ما از دوتا تابع gzcompress() و gzuncompress() برای این کار استفاده میکنیم :

$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);

با این توابع ما میتونیم حدود ۵۰% از حجم یک رشته رو کم کنیم.همچین توابع gzencode() و gzdecode()با یک الگوریتم دیگه میتونن

همین مقدار از حجم رشته هارو فشرده کنن.
۹- register_shutdown_function()

تابع register_shutdown_function() میتونید تعیین کنید قبل از اینکه اسکریپت شما به اتمام برسه چه تابعی اجرا بشه.اما اگر

اسکریپت شما با دستور exit به پایان برسه یا یک خطا رخ بده ویا برنامه به وسیله کاربر متوقف بشه (باکلیک روی دوکمه stop مرورگر )

$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.";
}

منبع
ترجمه:سعید مقدم زاده

بازدید : ۵۹۴۰

آذر ۵, ۱۳۹۰ @ ۱:۰۶ ب.ظ

سلام،

فوق العاده جالب 🙂

پاسخ دادن
آذر ۷, ۱۳۹۰ @ ۱۱:۵۹ ق.ظ

Thank for this post

پاسخ دادن
محمد
تیر ۶, ۱۳۹۱ @ ۹:۳۸ ق.ظ

خیلی خوب و مفید بود , یکی از بهترین سایتهای اموزش php که من تا حالا دیدم

پاسخ دادن
  • Pingback: مدیریت فایلها در PHP قسمت دوم : مدیریت فایلها و پوشه ها | PHP Professional

  • حسن
    آبان ۲۹, ۱۳۹۱ @ ۱۰:۵۴ ق.ظ

    با سلام و تشکر فراوان از سایت بسیار عالی تون آقا سعید گل گلاب
    فرق بین این دو تابع چیه
    __FUNCTION__ نام تابع جاری

    __METHOD__ نام متد جاری

    و مورد آخر __NAMESPACE__ فضای نام جاری به چکار می آید

    پاسخ دادن
    محمدمهدی
    بهمن ۱۲, ۱۳۹۳ @ ۱۱:۳۶ ب.ظ

    باسلام.. بسیار ممنونم از سایت خوبتون و همچنین از این مطلب فوق العاده ! الان ساعت ۱۲ شب هست که دارم این مطلب رو میخونم خسته ام اما واقعا دلم نیومد بدون تشکر سایت رو ترک کنم.. !

    کوچــــــــــکـــرین!!

    پاسخ دادن
    مهدی
    اردیبهشت ۲۵, ۱۳۹۵ @ ۲:۰۰ ب.ظ

    باحال بود مخصوصا register_shutdown_function

    پاسخ دادن

    پاسخ دهید

    نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


    *