مفهوم Namespce ها

پرسیده شده
فعالیت 1407 روز پیش
دیده شده 1027 بار
0

با سلام

از آنجایی که می توان 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 دوبار تکرار میشه!

چرا؟ ?

فایل پیوست

6
حذف شده

سلام.

وقتی شما داخل 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 پیدا کنه که همچین چیزی وجود نداره.

 

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

فایل پیوست

محسن موحد

توسط

محسن موحد

5 تیر 99

0
حذف شده

سوال:

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

$obj = new \Test\MyClass;

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

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

عکس

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

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

فایل پیوست

محمدرضا رحیمی

توسط

محمدرضا رحیمی

7 تیر 99