php همه متغیرها متغیرها در PHP

متغیرهای phpنوعی محتویات اطلاعاتی است که می تواند انواع مختلفی از داده ها (متن ، اعداد ، آرایه ها و غیره) را شامل شود. به طور کلی ، متغیرها به شما امکان ایجاد ، ذخیره ، اصلاح و در آینده سریع دسترسی به اطلاعات مشخص شده در آنها را می دهند.

نحوه ایجاد متغیر در PHP

در ابتدا ، متغیرها حاوی علامت هستند $ (دلار) - تعیین استفاده از یک متغیر ، سپس حروف الفبای لاتین(از a تا z و کوچک و بزرگ) ، در انتها می تواند شامل شود شماره... همچنین ، نام مجاز است از زیر خط (نه در انتها) استفاده کند.

چگونه می توان متغیرها را نامگذاری کرد:

$ var
$ متغیر
سال ۱۹۴۵ دلار
$ _ متغیر
چگونه نمی توان متغیرها را فراخوانی کرد:

1 دلار - فقط شامل یک رقم است
$ 1var - شما نمی توانید یک نام متغیر را با رقم شروع کنید
$ / var - فقط زیرخط نویسه اضافی مجاز است _
متغیر $ - خط سیریلیک توسط اسناد php مجاز است ، اما توصیه نمی شود
$ var iable - از فضاها نمی توان استفاده کرد

به هر متغیر یک مقدار اختصاص داده می شود. برای تعیین مقدار ، از علامت استفاده کنید = (برابر) در طول پردازش اسکریپت ، مقدار متغیر بسته به شرایط مختلف می تواند بارها و بارها تغییر کند.

$ city = "مسکو"؛ // متغیر $ city یک رشته (در نقل قول) به ارزش Moscow اختصاص داده شد
سال $ = 1147؛ // و به متغیر $ year مقدار عددی 1147 اختصاص داده شد
?>

$ name = "اسکندر"؛
$ Name = "الکسی"؛
echo "$ name، $ Name"؛ // نمایش "الکساندر ، الکسی"
?>

خروجی متغیر PHP

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

// به این ترتیب مقادیر را به متغیرها اختصاص می دهیم
$ name1 = "الکسی"؛
$ name2 = "اسکندر"؛

// نمایش متغیرها
echo $ name2؛ // خروجی: اسکندر
echo "name1 is $ name1"؛ // نام 1 الکسی است

// هنگام استفاده از نقل قول های تک ، خروجی است
// نام متغیر ، نه مقدار
echo "name1 is $ name1"؛ // چاپ می کند: name1 $ name1 است

// فقط می توانید مقادیر متغیرها را نمایش دهید
echo $ name1؛ // الکسی
echo $ name1، $ name2؛ // الکسی اسکندر
echo $ name1. "". $ name2؛ // الکسی اسکندر
echo "$ name1، $ name2"؛ // الکسی ، اسکندر

اکو<<این از نحو "here document" برای خروجی استفاده می کند
چندین خط با جایگزینی متغیر $.
پایان؛

عملیات متغیر PHP

عملیات حساب در PHP
در مورد مقادیر عددی ، می توانید عملیات حساب را انجام دهید: جمع ، تفریق ، ضرب و غیره.

- $ a(نفی) علامت $ a را تغییر دهید.
$ a + $ b(اضافه) مجموع $ a و $ b.
$ a - $ b(تفریق) تفاوت بین $ a و $ b.
$ a * $ b(ضرب) حاصلضرب $ a و $ b است.
$ a / $ b(تقسیم) ضریب $ a تقسیم بر $ b.
$ a٪ $ b(modulo) عدد صحیح باقی مانده $ a بر $ b تقسیم می شود.
بیایید نمونه ها را بررسی کنیم

$ a = 2؛ // توجه داشته باشید ، در مورد اعداد ، از نقل قول استفاده نمی شود
$ b = 3 ؛ // توجه داشته باشید ، در مورد اعداد ، از نقل قول استفاده نمی شود

$ result = $ a + $ b؛ // اضافه کردن متغیرها
echo $ result؛ // چاپ می شود 5

$ result = $ b - $ a؛ // اضافه کردن متغیرها
echo $ result؛ // خروجی 1 خواهد داشت

عملیات افزایش و کاهش در PHP
این عملیات عمدتا هنگام ساخت حلقه ها مفید خواهد بود ، که در مورد آنها کمی بعد صحبت خواهیم کرد.
پیشوند- عملگرها قبل از متغیر نوشته شده اند ( - $ a; ++ $ a) مقدار متغیر را قبل از تغییر برمی گرداند.
پسوند- عملگرهای نوشته شده پس از متغیر ( $ a--; $ a--) مقدار تغییر یافته متغیر را برمی گرداند.
افزایش- افزایش ارزش
تنزل- کاهش ارزش

++ $ aافزایش پیشوند $ a را یک به یک افزایش می دهد و $ a را برمی گرداند.
$ a ++افزایش پسوند مقدار $ a را برمی گرداند و سپس $ a را یک به یک افزایش می دهد.
- $ aکاهش پیشوند $ a را یک به یک کاهش می دهد و مقدار $ a را برمی گرداند.
$ a--کاهش پسوند مقدار $ a را برمی گرداند و سپس $ a را یک به یک کاهش می دهد.
پژواک "

افزایش پسوند

";
$ a = 5؛
echo "باید 5 باشد:". $ a ++. "\ n"؛

پژواک "

افزایش پیشوند

";
$ a = 5؛
echo "باید 6 باشد:". ++ $ a "\ n"؛
echo "باید 6 باشد:". $ a "\ n"؛

پژواک "

کاهش پسوند

";
$ a = 5؛
echo "باید 5 باشد:". $ a--. "\ n"؛

پژواک "

کاهش پیشوند

";
$ a = 5؛
echo "باید 4 باشد:". - $ a "\ n"؛
echo "باید 4 باشد:". $ a "\ n"؛
?>

عملیات اختصاص PHP
اپراتور اصلیبه نظر می رسد = ... در نگاه اول ، ممکن است به نظر برسد که این اپراتور برابر است. در حقیقت، موضوع این نیست. در واقع ، عملگر تخصیص بدین معناست که عملوند سمت چپ روی مقدار عبارت راست تنظیم شده است (یعنی با مقدار حاصله تنظیم شده است). اپراتورهای ترکیبی- این عملگرها هستند که به شما اجازه می دهند از مقادیر قبلی متغیرها برای عملیات بعدی استفاده کنید (به متغیر رشته ای (با متن) اضافه کنید یا مقادیر عددی اضافه کنید).

$ a = ($ b = 2) + 4 ؛ // نتیجه: $ a روی 6 ، $ b روی 2 تنظیم شده است.

$ a = 2؛
$ a + = 3؛ // $ a را به 5 تنظیم می کند ، مشابه نوشتن: $ a = $ a + 3؛
$ b = "سلام" ؛
$ b. = "جهان!" // $ b را روی "Hello World!" و $ b = $ b قرار می دهد. "آنجا!"؛

همچنین وجود دارد عملیات مقایسهو بازی فکری، اما در درسهای بعدی در مورد آنها صحبت خواهیم کرد. من سعی خواهم کرد که بلافاصله شما را با حجم زیادی از اطلاعات نترسانم!)

این درس محدوده متغیرهای PHP را بررسی می کند. تفاوت بین دامنه های محلی و جهانی را توضیح می دهد ، نحوه دسترسی به متغیرهای جهانی در یک تابع ، نحوه کار با ابرجهانی ها و نحوه ایجاد متغیرهای ایستا را نشان می دهد.

هنگامی که شروع به یادگیری PHP می کنید و کار با توابع و اشیاء را انجام می دهید ، دامنه متغیرها کمی گیج کننده است. خوشبختانه درک قوانین PHP در این زمینه بسیار آسان است (در مقایسه با سایر زبان های برنامه نویسی).

محدوده چیست؟

محدوده متغیر زمینه ای است که در آن یک متغیر تعریف شده و در آن می توان به آن دسترسی داشت. PHP دارای دو محدوده متغیر است:

  • جهانی- متغیرها را می توان در هرجایی از اسکریپت دسترسی داشت
  • محلی- متغیرها فقط در داخل تابع قابل تعریف هستند

محدوده متغیر و به ویژه محدوده محلی ، مدیریت کد شما را بسیار ساده تر می کند. اگر همه متغیرها جهانی بودند ، می توان آنها را در هر جایی از اسکریپت تغییر داد. این می تواند منجر به هرج و مرج و اسکریپت های بزرگ شود ، زیرا اغلب قسمت های مختلف اسکریپت از متغیرهایی با یک نام استفاده می کنند. با تعیین محدوده محلی ، محدوده کدی را تعریف می کنید که می تواند به متغیر دسترسی داشته باشد و کد را قوی تر ، مدولار و اشکال زدایی آسان تر می کند.

متغیرهایی که دارای محدوده جهانی هستند جهانی نامیده می شوند و آنهایی که دارای محدوده محلی هستند محلی نامیده می شوند.

در اینجا مثالی از نحوه عملکرد متغیرهای جهانی و محلی ارائه شده است.

"؛) sayHello ()؛ echo" Value \ $ globalName: "$ globalName"
"؛ echo" ارزش \ $ localName: "$ localName"
"; ?>

سلام هری! ارزش $ GlobalName: "Zoe" $ localName value: ""

در این اسکریپت ، ما دو متغیر ایجاد کرده ایم:

  • $ globalName- این هست جهانیمتغیر
  • $ localName- این هست محلیمتغیری که درون تابع sayHello () ایجاد می شود.

پس از ایجاد متغیر و عملکرد ، اسکریپت sayHello () را فرا می خواند ، که خروجی "سلام هری!" ... سپس اسکریپت سعی می کند تا مقدار دو متغیر را تکرار کند. در اینجا چه اتفاقی می افتد:

  • زیرا $ globalNameخارج از عملکرد ایجاد شد ، در هر جایی از اسکریپت موجود است ، بنابراین "Zoya" نمایش داده می شود.
  • $ localNameفقط در داخل تابع sayHello () در دسترس خواهد بود. از آنجا که عبارت echo خارج از تابع است ، PHP اجازه دسترسی به متغیر محلی را نمی دهد. در عوض ، PHP فرض می کند که کد یک متغیر جدید با نام $ localName ایجاد می کند ، که مقدار پیش فرض یک رشته خالی را دریافت می کند. به همین دلیل است که فراخوانی دوم برای echo مقدار "" را برای متغیر $ localName چاپ می کند.

دسترسی به متغیرهای جهانی داخل یک تابع

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

تابع myFunction () (جهانی $ globalVariable ؛ // دسترسی به متغیر جهانی $ globalVariable)

در غیر این صورت ، PHP فرض می کند که در حال ایجاد یا استفاده از یک متغیر محلی هستید.

در اینجا یک اسکریپت نمونه وجود دارد که از یک متغیر جهانی در داخل یک تابع استفاده می کند:

"؛ global $ globalName؛ echo" سلام $ globalName!
"؛) بگو سلام () ؛؟>

هنگام اجرا ، اسکریپت خروجی می گیرد:

سلام هری! سلام زویا!

تابع sayHello () از کلمه کلیدی global برای اعلام متغیر $ globalName به عنوان global استفاده می کند. سپس می تواند به متغیر دسترسی پیدا کرده و مقدار آن را نمایش دهد ("زویا").

ابرگلوبال چیست؟

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

در اینجا لیستی از ابرجهانی موجود در PHP 5.3 آمده است:

  • $ GLOBALS - لیست همه متغیرهای جهانی در اسکریپت (به استثنای ابرجهانی)
  • $ _GET - شامل لیستی از تمام زمینه های فرم ارائه شده توسط مرورگر با استفاده از درخواست GET می باشد
  • $ _POST - شامل لیستی از تمام زمینه های فرم ارائه شده توسط مرورگر با استفاده از درخواست POST است
  • $ _COOKIE - شامل لیستی از همه کوکی های ارسال شده توسط مرورگر است
  • $ _REQUEST - شامل همه ترکیبات کلید / مقدار است که در آرایه های $ _GET ، $ _POST ، $ _COOKIE وجود دارد
  • $ _FILES - شامل لیستی از تمام فایل های بارگذاری شده توسط مرورگر است
  • $ _SESSION - به شما امکان می دهد متغیرهای جلسه را برای مرورگر فعلی ذخیره و استفاده کنید
  • $ _SERVER - حاوی اطلاعاتی در مورد سرور ، مانند نام فایل اسکریپت در حال اجرا و آدرس IP مرورگر است.
  • $ _ENV - شامل لیستی از متغیرهای محیطی است که به PHP منتقل شده است ، به عنوان مثال متغیرهای CGI.
برای مثال ، می توانید از $ _GET برای بدست آوردن مقادیر متغیرهای موجود در رشته URL درخواست اسکریپت استفاده کنید و آنها را در صفحه نمایش دهید:

اگر اسکریپت بالا را با رشته URL http://www.example.com/script.php؟yourName=Fred اجرا کنید ، خروجی زیر را نشان می دهد:

سلام فرد!

اخطار!در یک اسکریپت واقعی ، هرگز نباید از چنین داده هایی به دلیل ضعف امنیت استفاده کنید. همیشه باید داده های خود را بررسی یا فیلتر کنید.

استفاده از superglobal $ GLOBALS بسیار راحت است زیرا به شما امکان می دهد دسترسی به متغیرهای جهانی را در یک تابع بدون نیاز به استفاده از کلمه کلیدی جهانی سازماندهی کنید. مثلا:

"؛) sayHello ()؛ //" Hello، Zoe! "را چاپ می کند؟>

متغیرهای ایستا: آنها در جایی نزدیک هستند

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

این در اکثر موارد عالی عمل می کند. به این ترتیب توابع مستقل هستند و هر بار که فراخوانی می شوند یکسان عمل می کنند.

با این حال ، شرایطی وجود دارد که می توان یک متغیر محلی ایجاد کرد که مقدار آن را بین فراخوانی های تابع "به خاطر بسپارد". چنین متغیری استاتیک نامیده می شود.

برای ایجاد یک متغیر استاتیک در یک تابع ، باید از کلمه کلیدی static در جلوی نام متغیر استفاده کنید و مطمئن شوید که مقدار اولیه را به آن می دهید. مثلا:

تابع myFunction () (ثابت $ myVariable = 0؛)

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


"؛ echo createWidget ()." ما قبلاً ایجاد کرده ایم.
"؛ echo createWidget ()." ما قبلاً ایجاد کرده ایم.>
"; ?>

اما از آنجا که متغیر $ numWidgets هر بار که تابع فراخوانی می شود ایجاد می شود ، نتیجه زیر را دریافت می کنیم:

ما تعدادی ویجت ایجاد می کنیم ... 1 که قبلاً ایجاد کرده ایم. 1 که قبلاً ایجاد کرده ایم. 1 که قبلاً ایجاد کرده ایم.

اما با استفاده از یک متغیر ایستا ، می توانیم مقدار یک فراخوانی تابع را به فراخوانی بعدی ذخیره کنیم:

"؛ echo createWidget ()." ما قبلاً ایجاد کرده ایم.
"؛ echo createWidget ()." ما قبلاً ایجاد کرده ایم.
"؛ echo createWidget ()."> ما قبلاً ایجاد کرده ایم.
"; ?>

اکنون اسکریپت خروجی مورد انتظار را تولید می کند:

ما تعدادی ویجت ایجاد می کنیم ... 1 که قبلاً ایجاد کرده ایم. 2 که قبلاً ایجاد کرده ایم. 3 ما قبلاً ایجاد کرده ایم.

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

فقط همین! اغلب اسناد PHP را بررسی کنید.

متغیرهای محیطی (محیط) در ویندوز حاوی اطلاعات مختلفی در مورد تنظیمات سیستم و محیط کاربر است. بین متغیرهای کاربر ، سیستم و محیط فرآیند تمایز قائل شوید.

ساده ترین راه برای مشاهده محتویات متغیرهای محیط در ویندوز ، باز کردن ویژگی های سیستم است ( sysdm.cpl) -> پیشرفته -> متغیرهای محیطی.همانطور که مشاهده می کنید ، در بخش باز شده دو بخش وجود دارد: قسمت بالا شامل متغیرهای محیط کاربر ، قسمت پایین شامل متغیرهای سیستم است.

علاوه بر این ، متغیرهای محیط در رجیستری سیستم ذخیره می شوند. متغیرهای سفارشی در قسمت ذخیره می شوند. سیستم - در HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment.

می توانید مقادیر همه متغیرهای محیط را در خط فرمان ویندوز نمایش دهید. دستور ساده است:

دستور متغیرهای محیط و مقادیر آنها را لیست می کند.

در PowerShell ، می توانید از دستور برای نمایش همه متغیرهای محیط استفاده کنید:

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

اکو٪ systemroot٪

set> c: \ tmp \ env_var.txt

متغیرهای محیطی یک فرایند خاص را می توان با استفاده از یک برنامه رایگان به دست آورد برنامه های کاربردی Process Explorer(از Sysinternals). کافی است خصوصیات فرآیند را باز کرده و به برگه بروید محیط.

13 سال پیش

کمی مشکلی که باید مراقب آن باشید:

اگر RegisterGlobals و سایر موارد مرتبط را خاموش کنید ، سپس از get_defined_vars () استفاده کنید ، ممکن است چیزی شبیه به موارد زیر مشاهده کنید:

آرایه
[GLOBALS] => آرایه
[GLOBALS] => آرایه
* بازیابی *
[_POST] => آرایه ()
[_GET] => آرایه ()
[_COOKIE] => آرایه ()
[_FILES] => آرایه ()
)

[_POST] => آرایه ()
[_GET] => آرایه ()
[_COOKIE] => آرایه ()
[_FILES] => آرایه ()

)
?>

توجه داشته باشید که $ _SERVER آنجا نیست. به نظر می رسد که php فقط $ _SERVER superglobal را بارگیری می کند اگر در جایی استفاده شود. می توانید این کار را انجام دهید:

چاپ "

". htmlspecialchars (print_r (get_defined_vars () ، true))."
" ;
چاپ "
". htmlspecialchars (print_r ($ _SERVER ، درست))."
" ;
?>

و سپس $ _SERVER در هر دو لیست ظاهر می شود. من حدس می زنم که این واقعاً یک گاتا نیست ، زیرا هیچ چیز بدی در هر صورت اتفاق نمی افتد ، اما با این وجود یک کنجکاوی جالب است.

6 سال پیش

از آنجا که get_defined_vars () فقط متغیرها را در نقطه ای که شما تابع می نامید دریافت می کند ، یک راه ساده برای تعیین متغیرها در محدوده فعلی وجود دارد.

// بالای اسکریپت php شما
$ vars = get_defined_vars ()؛

// حالا کارهای خود را انجام دهید
$ foo = "foo"؛
$ bar = "bar"؛

// همه متغیرهای تعریف شده در محدوده فعلی را دریافت کنید
$ vars = array_diff (get_defined_vars () ، $ vars) ؛

پژواک "

"
;
print_r ($ vars) ؛
پژواک "
" ;
?>

15 سال پیش

در اینجا یک تابع است که یک گزارش اشکال زدایی برای نمایش یا ایمیل ایجاد می کند
با استفاده از get_defined_vars. برای گرفتن یک عکس فوری دقیق بدون آن عالی است
با تکیه بر ورودی کاربر

function generateDebugReport ($ method، $ defined_vars، $ email = "undefined") (
// عملکرد ایجاد گزارش اشکال زدایی برای نمایش یا ایمیل.
// استفاده: generateDebugReport (روش ، get_defined_vars () ، ایمیل) ؛
// جایی که روش "مرورگر" یا "ایمیل" است.

// ایجاد یک لیست نادیده گرفتن برای کلیدهای برگشت داده شده توسط "get_defined_vars".
// به عنوان مثال ، HTTP_POST_VARS ، HTTP_GET_VARS و دیگران هستند
// اضافی (همان _POST ، _GET)
// وارهایی را که می خواهید به دلایل امنیتی نادیده گرفته شوند نیز وارد کنید - به عنوان مثال PHPSESSID
$ ignorelist = array ("HTTP_POST_VARS" ، "HTTP_GET_VARS" ،
"HTTP_COOKIE_VARS" ، "HTTP_SERVER_VARS" ،
"HTTP_ENV_VARS" ، "HTTP_SESSION_VARS" ،
"_ENV" ، "PHPSESSID" ، "SESS_DBUSER" ،
"SESS_DBPASS" ، "HTTP_COOKIE") ؛

$ timestamp = date ("m / d / y h: m: s")؛
$ message = "گزارش اشکال زدایی $ timestamp \ n" ایجاد شد؛

// آخرین خطای SQL را برای اندازه گیری خوب دریافت کنید ، جایی که $ link شناسه منبع است
// برای mysql_connect. برای پایگاه داده یا تنظیمات انتزاعی خود نظر دهید یا اصلاح کنید.
پیوند جهانی $ ؛
$ sql_error = mysql_error ($ link)؛
if ($ sql_error) (
$ message. = "\ nMysql Messages: \ n". mysql_error ($ link) ؛
}
// پایان MySQL

// در اینجا می توان از یک تابع بازگشتی استفاده کرد. شما ایده می گیرید ؛-)
foreach ($ define_vars به ​​عنوان $ key => $ val) (
if (is_array ($ val) &&! in_array ($ key، $ ignorelist) && count ($ val)> 0) (
$ message. = "\ n $ array key (key = value): \ n"؛
foreach ($ val به عنوان $ subkey => $ subval) (
if (! in_array ($ subkey ، $ ignorelist) &&! is_array ($ subval)) (
$ message. = $ کلید فرعی "=" $ subval. "\ n"؛
}
elseif (! in_array ($ subkey ، $ ignorelist) && is_array ($ subval)) (
foreach ($ subval به عنوان $ subsubkey => $ subsubval) (
if (! in_array ($ subsubkey ، $ ignorelist)) (
$ message. = $ subsubkey. "=" $ subvalval "\ n" ;
}
}
}
}
}
elseif (!
is_array ($ val) &&! in_array ($ key ، $ ignorelist) && $ val) (
$ message. = "\ n متغیر". کلید $ "=" $ val. "\ n"؛
}
}

اگر ($ method == "مرورگر") (
echo nl2br ($ message) ؛
}
elseif ($ method == "ایمیل") (
if ($ email == "undefined") (
$ email = $ _SERVER ["SERVER_ADMIN"]؛
}

$ mresult = mail ($ email، "Debug Report for". $ _ENV ["HOSTNAME"]. ""، $ message)؛
if ($ mresult == 1) (
پژواک "گزارش اشکال زدایی با موفقیت ارسال شد. \ N";
}
دیگری (
پژواک "گزارش اشکال زدایی ارسال نشد. \ N";
}
}
}
?>

17 سال پیش

روال ساده ای برای تبدیل شی get_defined_vars به ​​XML.

تابع obj2xml ($ v، $ indent = "") (
while (list ($ key، $ val) = هر یک ($ v)) (
if ($ key == "__attr") ادامه یابد ؛
// __attr را بررسی کنید
if (is_object ($ val -> __attr)) (
while (لیست ($ key2 ، $ val2) = هر کدام ($ val -> __attr)) (
$ attr. = "$ key2 = \" $ val2 \ ""؛
}
}
else $ attr = ""؛
if (is_array ($ val) || is_object ($ val)) (
print ("$ تورفت< $key$attr >\ n ")؛
obj2xml ($ val، $ تورفتگی "")؛
print ("$ تورفت\ n ")؛
}
else print ("$ تورفت< $key$attr >$ val\ n ")؛
}
}

// مثال شی
$ x -> name -> first = "John"؛
$ x -> name -> last = "اسمیت"؛
$ x -> arr ["میوه"] = "موز"؛
$ x -> arr ["Veg"] = "هویج"؛
$ y -> مشتری = $ x؛
$ y -> مشتری -> __attr -> id = "176C4"؛

$ z = get_defined_vars ()؛
obj2xml ($ z ["y"]) ؛
?>
خروجی خواهد داد:


جان
اسمیت


موز
هویج

11 سال پیش

به عنوان نکته ، get_defined_vars () مجموعه ای از مراجع متغیر را بر نمی گرداند (همانطور که امیدوار بودم). مثلا:

// تعریف یک متغیر
$ my_var = "foo"؛

// لیست متغیرهای تعریف شده ما را دریافت کنید
$ defined_vars = get_defined_vars ()؛

// اکنون سعی کنید مقدار را از طریق آرایه بازگشتی تغییر دهید
$ defined_vars ["my_var"] = "نوار"؛

echo $ my_var ، "\ n"؛

?>

خروجی "foo" (مقدار اصلی) را نشان می دهد. اگر get_defined_vars () استدلال اختیاری برای ارجاع دادن به آنها داشته باشد ، بسیار خوب است ، اما من تصور می کنم که این درخواست کاملاً تخصصی است. شما می توانید خودتان (با سهولت کمتر) با چیزی مانند:

$ defined_vars = آرایه ()؛
$ var_names = array_keys (get_defined_vars ())؛

foreach ($ var_names به عنوان $ var_name)
{
$ defined_vars [$ var_name] = & $ $ var_name؛
}

?>

1 سال پیش

من قبلاً در مورد "این" در get_defined_vars ارسال کرده بودم.

به نظر می رسد که همیشه وجود ندارد ، اما در موارد خاصی به طور غیرقابل توضیح ظاهر می شود.

php -r "
تست کلاس (
تابع عمومی a () (var_dump (array_keys (get_defined_vars ()))؛ $ a = 123؛)
تابع عمومی b () (var_dump (array_keys (get_defined_vars ())) ؛ $ this؛)
}
$ t = تست جدید ()؛
$ t-> a ()؛
$ t-> b ()؛
"

آرایه ()
آرایه ("این")

این در PHP 7.2 اتفاق نمی افتد بلکه در PHP 5.6 اتفاق می افتد.

1 سال پیش

برخی از نظرات در اینجا اشاره می کنند که این تابع مراجع را بر نمی گرداند. با این حال ، نام ها را برمی گرداند و نام ها "مراجع" هستند.

من پیشنهاداتی را که آن را به مراجع تبدیل می کند در اینجا توصیه نمی کنم.

عملکرد عمومی x ($ a، $ b، $ c) (
foreach (array_keys (get_defined_vars ()) به عنوان $ key)
if ($ key! == "این")
$ this-> y ($ ($ key)) ؛
}

عملکرد عمومی y (& ورودی $) (
$ ورودی ++ ؛
}

به جای $ () می توانید از $ $ نیز استفاده کنید.

من در زمان خود کارهای بدی انجام داده ام تا کد فوق العاده ای بسازم ، اما هرگز مجبور نبودم کاری مانند موارد فوق انجام دهم. ممکن است حتی کار نکند (اما از آنجا که با $ a [$ key] تفاوتی ندارد).

شما همچنین می توانید کلید $++ را انجام دهید ، اما من هرگز کدی مانند آن را مشاهده نکرده ام که به طرز وحشتناکی بد نبوده است (با استفاده از پویا در جایی که پویا مفید نیست).

اگر چنین کاری را انجام می دهید ، پس به آن بررسی بیشتری بدهید.