? تابع سودمند Php
بعد از مدتها کار با php ممکنه هنوز توابعي باشن که باهاشون برخورد نکرديم و نميدونيم چنين توابعي هم وجود دارن که ميتونن کار
مارو راحتتر کنن.در زير اشاره اي ميکنم به ? عدد از توابع مفيدي که ممکنه خيلي ها هنوز بهش بر نخورده باشن.
?- توابعي با تعداد آرگومانهاي دلخواه
ممکنه قبلا شما توابعي نوشته باشين که به تعداد دلخوله ميتنين آرگومان بهش پاس بدين اما تابعي توي php وجود داره که به شما
اجازه ميده توابعي بسازيد طراحی وب سایت که تعداد آرگومانها به صورت واقعي دلخواه هستند.
در ابتدا يک مثال از تابعي ميزم که ميتونه تعداد آرگ.مانهاي دلخواه رو بهش پاس بديد
// 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
(
[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() براي اطلاع
از بيشترين حافظه مصرفي در اسکريت استفاده کنيم.
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() استفاده ميکنيم.اسن تابع روي سرور هاي ويندوز جواب نميده.
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__ فضاي نام جاري
// 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() براي همين کار در اختيار ما گذاشته :
// generate unique string
echo uniqid();
/* prints
4bd67c947233e
*/
// generate another unique string
echo uniqid();
/* prints
4bd67c9472340
*/
اگر توجه کنيد ميبينيد که ابتداي رشته هاي ايجاد شده مثل هم هستند.اين به دليله که تابع uniqid() براي ساخت چنين رشته هايي از زمان سيستم استفاده ميکنه.
براي اينکه امکان شباهت دوتا رشته رو کم کنيم ميتونيم يک پيشوند به تابع پاس بديم.
// 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() به راحتي ميتونيد اين کارو انجام بديد :
// 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() نام دارن که توابع بسيار مفيدي هستند.
// 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
)
*/
اين توابع خيلي بهتر از دوتا تابع قبلي هستن چون با جاوااسکريپت و بيشتر زبانهاي برنامه نويسي ديگه سازگارن.
?-فشرده سازي رشته ها
وقتي بحث از فشرده سازي ميشه ما معمولا فايلها به ذهنمون مياد.اين امکان در پي اچ پي وجود داره که بشه رشته هارو به حالت
فشرده در آورد.
در مثال زير ما از دوتا تابع 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.";
}