PDA

View Full Version : آموزش: echo یا print



Tarragon
دوشنبه 23 بهمن 1391, 15:17 عصر
حتما دو تا تابع echo و print رو میشناسید. این دو تا عملا یه کار رو انجام میدن. پس چرا شدن دو تا تابع؟ تفاوتشون چیه؟؟
خوب من سعی میکنم که توضیح بدم این قضیه رو.
شباهتها
هر دو تابع نیستن :) جزئی از ساختار زبانی هستن. یعنی میشه بدون پرانتز فراخوانیشون کرد ولی استفاده از توابعی مثل call_user_func و call_user_func_array براشون جواب نمیده (البته به صورت مستقیم، وگرنه اگه تو یه تابع باشن و اون یه تابع فراخوانی بشه بصورت غیر مستقیم میشه.).
پس :

//Call them like functions:
print ("This is a test<br />");
echo ("This is a test<br />");

// No parenthesis:
print "This is a test<br />";
echo "This is a test<br />";
هر دو درستن. بدون پرانتز و با پرانتز.
تفاوتها

تابع print بازگشتی داره و همیشه هم بازگشتیش یکه.اما echo بازگشتی نداره!!خوب این یعنی چی؟ مثلا :

($x)? print "True" : print "False";
کاملا درسته، ولی

($x)? echo "True" : echo "False";
کاملا غلط و اجرا نمیشه.
اپراتور @ روی echo کار نمیکنه. یعنی در:

@print 10/0 ;
اپراتور درست عمل میکنه، خطای پیش آمده (که تقسیم بر صفر باشه) رو خفه میکنه. منتها :

@echo 10/0 ;
اصلا اجرا نمیشه. تا به حال دو بر هیچ به نفع print !!
خوب تفاوت بعدی به نفع echo هستش.
print فقط و فقط یه آرگومان میگیره، ولی echo هر چند آرگومان رو میتونه قبول کنه :

echo '$x = ', $x ,'$y=',$y;
البته این یه جورایی خیلی کنده :) همین خروجی با print تولید نمیشه مگه با کمک اپراتور نقطه (که با echo هم میشه ) :

print '$x = '. $x .'$y='.$y;
تو PHP میشه از رشته که با ” نوشته شده استفاده کرد و متغیر رو داخلش نوشت، ولی کندتره، به عبارتی معادل این دو تا خط بالا میشه نوشت :

echo "\$x = $x \$y=$y";
منظور نوع رشته هست، با print و echo هیچ فرقی نداره.
در کل میگن که echo سریعتره. من از یه چیزی مشابه این کد استفاده کردم و فهمیدم که راست میگن، منتها تفاوت خیلی نیست. همیشه، متوسط حالتی که از echo استفاده کردم از حالتی که به جاش print گذاشتم کمتر بود :

<?php
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

for ($i=0;$i<1000000;$i++)
print $i;

$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);
echo "This page was created in ".$totaltime." seconds";
برای این تست از cli استفاده کردم نه وب، عددای بزرگ خیلی طول میکشن و علت هم حجم اطلاعات منتقل شدست، ربطی به تابع نداره. (من این تست پایینی رو انجام دادم در حقیقت، نه بالایی رو، این تو ویندوز جواب نمیده مگه اینکه تو msys یا یه چیزی مشابهش انجام بشه، بالایی میشه تو یه فایل نوشتش و انجامش داد ) :

php -d implicit_flush=off -r '$s=microtime(true); for($i=0;$i<1000000;$i++) echo "this is a test\n"; echo microtime(true)-$s,"\n";' | tail -n 1
و برای print :

php -d implicit_flush=off -r '$s=microtime(true); for($i=0;$i<1000000;$i++) print "this is a test\n"; echo microtime(true)-$s,"\n";' | tail -n 1
فقط چندین بار انجام بدید در شرایط یکسان و میانگین بگیرید.
تا به اینجا میشه ۲ به ۲ :)

مهمترین تفاوت این دو تا به نظر من یه چیز دیگست که باعث میشه من ترجیح بدم از echo استفاده کنم نه print!! سادست، echo چهار حرفه ولی print پنج حرفه!! فقط مشکل اون کاراکتر پنجمه، یه کاراکتر اضافه، یه t :)
منبع : یاداشتهای بین بیت نیمسوز (http://cyberrabbits.net)