PDA

View Full Version : سوال: تعریف اشاره گر(pointer) در پی اچ پی



zoghal
جمعه 02 اسفند 1387, 05:03 صبح
ما در سایر زبان های برنامه نویسی مبحثی به نام اشاره گرها یا pointer ها داریم

ایا در پی اچ پی اینگونه تعریف می شود؟

<?php $obj =& new Object(); ?>

اگر صحیح تشخیص دادم، راهنمایی بفرمائید
1- چه مقدار ما رو در کمتر مصرف کردن حافظه یاری میکنه
2- آیا عملکردش همانند زیبان های برنامه نویسی مثل سی یا دلفی هست؟
لطفا توضیحات لازم رو هم بیان کنید

یا اگر اشتباه تشخیص دادم فرق این دو خط در مثال زیر چیست؟

<?php $obj = new Object(); ?>
و
<?php $obj =& new Object(); ?>

smhnaji
پنج شنبه 08 اسفند 1387, 00:40 صبح
دوست خوبم اجازه بده من به سوال تو جواب ندم!!!

سوالی که پرسیدی، باعث شد تا من برم یه نموره تحقیق کنم و چیزی رو که متوجه شدم در ذیل به خدمتت عرض کنم!:

PHP پوینتر نداره. یعنی مثل C++ عزیز نیستش که خودت بتونی به هررررررررر جای حافظه که می‌خوای دسترسی داشته باشی. اما می‌شه آدرس یک متغیر رو فهمید. (Call By Reference داره)


<?php
$a = 12;
$b =& $a;

echo "a = $a<br />b = $b<br /><br /><br />";

$a++;
echo "a = $a<br />b = $b<br /><br /><br />";

$b += 100;
echo "a = $a<br />b = $b<br />";
?>


خروجی کد بالا:


a = 12
b = 12


a = 13
b = 13


a = 113
b = 113


همون‌طوری که متوجه شدی، $b اینجا Reference داده به $a و از اون به بعد، هر دوشون دقیقا به یک قسما اشاره می‌کنن و هر اتفاقی براشون بیفته، روی اون یکی هم تاثیر می‌ذاره چون دارن به یک جا اشاره می‌کنن.

http://safalra.com/programming/php/references-tutorial/
http://www.zymic.com/tutorials/php/using-references-in-php/
http://www.onlamp.com/pub/a/php/2002/09/12/php_foundations.html

من فکر می‌کنم جایی که می‌تونیم خیلی خوب از این مقوله‌ها استفاده کنیم، وقتی هستش که می‌خوایم به وسیله‌ی یه تابع روی ورودی‌ها تغییر بدیم.
اما این که فرق استفاده از این روش، با استفاده از global برای تابع ها چیه، من نمی‌دونم.

درمورد اون ۲ خط کد انتهایی هم که نوشتی، یه مقدار (مثل مقدار 'hello world' یا new Object(); ) وقتی می‌تونه دارای آدرس بشه که ما اونو تو یه متغیر بریزیم.
تا وقتی که ما یه رشته ( یا احتمالا یه شی رو که به تازگی construct شده ) رو توی یه متغیر نریزیم، نمی‌شه به اون توی حافظه اشاره کرد.

درضمن باز هم بابت سوالت که باعث شد برم یاد بگیرم، ممنونم :)

zoghal
جمعه 09 اسفند 1387, 00:22 صبح
از توضیحات خوبتون ممنون. من هم روش تحقیق کردم و به نکات ذکر شده شما رسیدم

منتها هنوز 2 تا سوال برام پیش اومده که با یک مثال توضیح میدم
قرض کنید ما یک آرایه داریم به این صورت


$test = array(1,2)


حالا یک تابه داریم که کارش این هست که مقادیر داخل آرایه رو در یک عدد ثابت ضرب میکنه



function power($temparr)
{
.....
return $temparr;
}


روال معمول بر این هست که از این تابع به این صورت استفاده میشه



$temparr = power($test)

1
. مقدار مصرفی در حافظه :
در این روش یک متغیر محلی در تابع تعریف میشه که مقدار $test در $temparr ریخته میشه عملیات انجام و مقادیر برگشت داده میشه. پس حافظه ای مصرف میشه

اما در پیرو صحبت های شما به روش رفرنس عملیات روی خود $test انجام میشه و حافظه این جهت این کار اشغال نمیشه (99% باید به این شکل باشه)

اما مشکل اصلی این هست که چه مقدار این روش روی سرعت و تفسیر و پروسس عملیات تاثیر داره؟