جستجو در بخش : سوال جواب منابع اسلامی لغت نامه ها قوانین و مصوبات نقل قل ها
×

فرم ورود

ورود با گوگل ورود با گوگل ورود با تلگرام ورود با تلگرام
رمز عبور را فراموش کرده ام عضو نیستم، می خواهم عضو شوم
×

×

آدرس بخش انتخاب شده


جهت کپی کردن میتوانید از دکمه های Ctrl + C استفاده کنید
رویداد ها - امتیازات
در حال بارگذاری
×

رویداد ها - امتیازات

برای بررسی عملکرد فعالیت و امتیازات خود باید در وب سایت وارد باشید. در صورت عضویت از بخش بالای صفحه وارد شوید، در غیر این صورت از دکمه پایین، مستقیم به صفحه ثبت نام وارد شوید.

×
×
کد تخفیف اسنپ تاکسی با 50% تخفیف! دریافت کد
×

دلیل درخواست بستن پست

کلیه پست هایی که جنبه تبلیغاتی داشته، محتوای اسپم و بی مفهوم در این دسته قرار میگیرند. همچنین پست هایی که به منظور گرفتن بک لینک درج می شوند شامل این مورد هستند.
حاوی مفاهیم غیر اخلاقی، سیاسی و یا توهین آمیز. کلیه پست هایی که از نظر محتوایی نیاز به بررسی و یا حذف شدن دارند در این دسته قرار می گیرند.
محتوایی با عدم جزئیات کافی و مورد نیاز. کلیه پست هایی که منظور نویسنده به وضوح مشخص نیست و نیازمند توضیحات و جزئیات بیشتر می باشند در این دسته قرار می گیرند.
محتوایی بی ربط با موضوعیت سرفصل کلی. کلیه پست هایی که از منظر مفهوم و مضمون ارتباطی با عنوان اصلی سوال ندارند در این دسته قرار می گیرند.
محتوایی دلخواه و بر پایه سلیقه. کلیه پست هایی که یک پاسخ مشخص ندارند و متوانند چندین پاسخ متفاوت و صحیح داشته باشند که کاملا مبتنی بر نظر شخصی افراد هستند در این دسته قرار می گیرند.
محتوایی در حوزه خیلی وسیع. کلیه پست هایی که از نظر محتوایی در یک حوزه ی وسیعی قرار دارند و مشخصا به یک موضوع خاصی اشاره ندارند که پاسخدهی به آن ها مستلزم تشریح مفاهیمی کلی می باشند در این دسته قرار می گیرند.
قبلا در لام تا کام مطرح شده. پست هایی که دقیقا با همین محتوا و مضمون قبلا در وب سایت لام تا کام درج شده اند، با ذکر آدرس منبع تکراری با پست حال حاضر شامل این دسته هستند. تکراری است با:
به سایر دلایل، نیازمند به بررسی توسط مدیر. به هر دلیل غیری که پست را نیازمند بررسی توسط مدیر کرده، با ذکر دلیل، در این دسته قرار میگیرد.
ارسال رای بستن

چرا مقادیر متغییر در توابع php ریست میشوند؟


0
0
835

دوستان من یک کد دارم به زبان گو golang، اینه کدم:

package main

import "fmt"

func main() {
    var myfunc = test()

    for i := 0; i < 5; i++ {
        fmt.Println(myfunc(i))
    }
}

func test() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}

خروجیش هم اینه:

0
1
3
6
10

حالا قصد دارم همین کد رو با زبان php بازنویسی کنم، و البته این کار رو هم انجام دادم، منتها خروجیش عوض میشه؛ یعنی مقدار متغییر sum همیشه دوباره از 0 شروع میشه:

<?php

function test(){

    $sum = 0;
    return function ($i) use($sum)  {
        $sum += $i;
        return $sum;
    };
}

$myfunc = test();

for($i = 0; $i < 5; $i++){
    echo $myfunc($i) . PHP_EOL;
}

همونطور که گفتم چون مقدار $sum ادامه پیدا نمیکنه، خروجیش میشه:

0
1
2
3
4

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

علمی برنامه-نویسی پی-اچ-پی گو
ویرایش شده در 2 سال قبل
سوال شده در سعید مرادی
1933 امتیاز

500 کاراکتر باقی مانده

2 جواب

1

دو کدی که به زبان های go و php زدید یکسان نیستن. به عبارت بهتر، variable scope در این دو زبان متفاوت هست. تمام چیزی که بهش نیاز دارید، استفاده از & هست زمانی که دارید $sum رو use میکنید، به این شکل:

return function ($i) use(&$sum)  {
                         ^

علتش هم خب مشخصه؛ در زیان go، متغییر $sum در تابع Anonymousی که استفاده شده، بیرون تعریف شده و در assignment مقدار جدید، روی همون داره overwrite میشه، ولی توی کدی که با زبان php نوشتید، هر سری که use ($sum) اجرا میشه، از متغییر $sum یک کپی میسازه و اونو میفرسته میاره توی تابع. که با اضافه کردن & پشت متغییر، شما به رفرنس اون متغییر اشاره میکنید و این باعث میشه که به همون بلاک از رم اشاره کنده و مقدار قبلی رو تحت تاثیر قرار بده.

اگه شفاف نبود بفرمایید که بیشتر توضیح بدم.

جواب داده شده در سجاد شفی زاده <m>★</m>
11.1k امتیاز


آهان متوجه شدم. بله کار میکنه به درستی. ممنونم ــ سعید مرادی در 2 سال قبل

500 کاراکتر باقی مانده


0

هر اتفاقی در یک روز مشخص و زمان مشخص و مکان مشخص در یک اسم باقی میماند.و جابجا یا موضوع آن اتفاق فاش یا رونمایی و مشخص نیست.برای تعداد افرادی که در اتفاق حضور داشته اند ثبت و اسم میزارند.

جواب داده شده در میثم عربی
1 امتیاز


THE NAME NEVER TIME OUT.MY BIG LOCK GOOD LIFE ــ میثم عربی در 2 سال قبل

500 کاراکتر باقی مانده


جواب شما
     
.....
×

×

جعبه لام تا کام


وب سایت لام تا کام جهت نمایش استاندارد و کاربردی در تمامی نمایشگر ها بهینه شده است.

تبلیغات توضیحی


عرشیان از کجا شروع کنم ؟
تغییر و تحول با استاد سید محمد عرشیانفر

تبلیغات تصویری


کپی