منبع اصلی نوشتار زیر در این لینک قرار دارد

echo vs. print

حتما دو تا تابع 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 :)

پ.ن.۱ : این دلیل آخری به صورت غیر مستقیم! میتونه توضیح بده چرا من دیر به دیر پست میزنم اینجا :D
پ.ن.۲ : امروز هم تولد وبلاگمه!! پست قبلی تولد خودم بود،‌ این یکی تولد وبلاگم. البته این وبلاگ اولین وبلاگ منه که بیشتر از یه سال توش نوشتم!!!!



برچسب ها : , , , ,