سطح C: قلمرو متغیرها (Variable Scope)
دیواری نامرئی بین "داخل تابع" و "خارج تابع".
تفاوت حیاتی با پایتون:
در پایتون، شما میتوانید متغیر بیرونی را داخل تابع بخوانید. در PHP نمیتوانید! تابعهای PHP کاملاً ایزوله هستند و متغیرهای بیرونی را نمیشناسند، مگر اینکه صریحاً به آنها بگویید.
مثال شکستخورده
$name = "Ali"; // متغیر سراسری (Global)
function sayMyName() {
echo $name; // خطا! من متغیری به نام name نمیشناسم.
// Warning: Undefined variable $name
}
دو راه حل وجود دارد:
۱. استفاده از global (توصیه نمیشود)
global $name;
این کار وابستگی ایجاد میکند و تست کردن کد را سخت میکند.
۲. ارسال به عنوان پارامتر (استاندارد)
function say($input) { ... }
تابع مستقل میماند و هر دادهای را میپذیرد. این روش صحیح مهندسی نرمافزار است.
تمرین عملی: شکستن دیوار
- یک متغیر
$appName = "My Weblog";در ابتدای فایل بسازید. - یک تابع
printHeader()بسازید و سعی کنید این متغیر را درونش چاپ کنید. (باید خطا یا هشدار بگیرید). - روش غلط: با دستور
global $appName;داخل تابع، مشکل را حل کنید. - روش صحیح: تابع را تغییر دهید تا ورودی بگیرد:
printHeader($title)و هنگام فراخوانی، متغیر را به آن پاس دهید.
چالش هوش مصنوعی: Dependency Injection
مفهوم "پاس دادن متغیر به عنوان پارامتر" پایه و اساس الگوی طراحی Dependency Injection است.
تکلیف: از هوش مصنوعی بخواهید: "چرا استفاده از global در توابع PHP بد است؟ (۳ دلیل امنیتی و نگهداری)". پاسخ را بخوانید تا درک عمیقتری پیدا کنید.