🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ محمدرضا
مفهوم Namespce ها
محسن موحد حل شده توسط محسن موحد

با سلام

از آنجایی که می‌توان namespace‌ها رو مثل دایرکتوری سیستم‌های Unix-base در نظر گرفت، در مثال زده شده در این جلسه که در فایل main.php نوشته شد:

<?php
include "Models/User.php";
include "Utilities/User.php";
# Direct use of Namespace
$model = new App\Models\User();
$util = new App\Utilities\User();

دو آبجکت را ایجاد کردیم.

حالا من خودم تست کردم متوجه شدم باید آبجکت رو به صورت زیر تعریف کرد:

<?php
namespace Test;
class MyClass
{
    public function __construct()
    {
        echo "MyClass Created!\n";
    }
}
$obj = new \Test\MyClass;

یعنی یه '\' باید قبل از اسم namespace بیارم مگرنه خطای زیر را دریافت میکنم:

"Uncaught Error: Class 'Test\Test\MyClass' not found"

بدون '\'، نام namespace دوبار تکرار میشه!

چرا؟ ?

سلام.

وقتی شما داخل namespace Test هستید باید آبجکتو به این شکل صدا بزنید:

$obj = new MyClass;

یا به این شکل:

$obj = new \Test\MyClass;

اگر شما هر آبجکتی رو داخل namespace Test بخاید ایجاد کنید، مثلا new PDO و ... میاد اون کلاس رو داخل namespace Test میگرده ببینه همچین کلاسی هست یا نه.

مثلا این کدو ببینید:

<?php
namespace Test;
$obj = new Exception('An Exception has occured!');

خطایی که اتفاق میوفته:

Fatal error: Uncaught Error: Class 'Test\Exception' not found in C:\wamp64\www\test\index.php:5 Stack trace: #0 {main} thrown in C:\wamp64\www\test\index.php on line 5

داخل namespace Test همچین کلاسی رو پیدا نکرده.

وقتی به این شکل مینویسید:

$obj = new Test\MyClass;

Myclass رو در namespace Tes\Test میگرده و پیدا نمیکنه.

اما وقتی به این شکل مینویسید:

$obj = new \Test\MyClass;
// OR \\
$obj = new \Exception();

\ ابتدایی به Global Space اشاره میکنه و میگه از ریشه، دنبال کلاس MyClass داخل namespace Test بگرد یا کلاس Exception رو از فضای Global(ریشه)، که توابع PHP  و کلاس هاش داخلش تعریف شدن کال کنه.

پس اینکه میگید namespace دوبار تکرار میشه درست نیست، خودتون با این کد new Test\MyClass گفتید که Test\MyClass رو از داخل Test پیدا کنه که همچین چیزی وجود نداره.

 

این تاپیک رو هم میتونید مطالعه کنید.

بهترین پاسخ
محسن موحد ۰۵ تیر ۱۳۹۹، ۱۸:۰۱

سوال:

اگر به صورت یه دایرکتوری به namespaceها نگاه کنیم برای تعریف یک آبجکت درون خود namespace که نوشتیم:

$obj = new \Test\MyClass;

گفتید \ اول به global space اشاره میکنه.

از این گفته میشه فهمید که ما یه global space داریم که مخصوص کلاس‌ها و توابع خود php هستش (بدون استفاده از namespace) و هنگامی که از namespaceها استفاده می‌کنیم یه فضای محصور شده به آنها اختصاص داده میشه. منظورم مثل شکل زیر:

عکس

که برای ایجاد آبجکت کد بالا رو نوشتیم، یعنی آدرس global space\Test آیا درسته؟

یا اینکه فضای namespaceها جدا از global space هستند؟

محمدرضا ۰۷ تیر ۱۳۹۹، ۲۰:۵۵