/
  • آموزش کار با namespace ها در php 5.3

  • ارسال پاسخ   امتیاز موضوع:
    • 2 رأی - میانگین امیتازات: 5
    • 1
    • 2
    • 3
    • 4
    • 5

    حالت موضوعی | حالت خطی آموزش کار با namespace ها در php 5.3
    نویسنده پیام
    k2-4u آفلاین
    LAMP Programmer
    ***

    ارسال‌ها: 88
    تاریخ عضویت: ۱۳۸۸ مرداد ۲۱
    اعتبار: 4
    تشکرها : 64
    ( 218 تشکر در 56 ارسال )
    ارسال: #1
    آموزش کار با namespace ها در php 5.3
    در این مقاله ابتدا از سایت php.net شروع کردم که . بهترین نکات فنی رو داره بعد از اون هم . اگر دوستان علاقه
    داشته باشند از تئوری به کاربردی میرسیم


    Namespace چیست؟

    Namespace چیست؟ معنای کلی namespace ، کپسوله سازی آیتم هاست. بطور مثال در تمام سیستمهای عامل ، دایرکتوری (پوشه ها) برای دسته بندی فایلهای مرتبط بکار میروند و مانند یک namespace برای فایلهای موجود در آن عمل میکنند. بعنوان یک مثال دقیقتر ، فرض کنید که فایل foo.txt در پوشه های home/greg و home/other وجود دارد اما امکان همزیستی دو کپی از فایل foo.txt در یک پوشه وجود ندارد. بعبارت دیگر ، بنابراین برای اینکه از یک دیرکتوری خارج از دایرکتوری home/greg به فایل foo.txt دسترسی پیدا کنیم باید نام دایرکتوری + جداکننده (/) + نام فایل را وارد کنیم. Home/greg/foo.txt . این قانون اصلی namespace در دنیای برنامه نویسی است.
    این قابلیت برای این طراحی شده که 2 مشکل نویسندگان کتابخانه ها و برنامه های کاربردی را حل کند:
    1. جلوگیری از name collision ( جلوگیری از نامگذاری مشابه برای توابع یا کلاسها یی که ایجاد کرده اید با کلاسها و توابع داخلی php)
    2. کوتاه کردن نامهای طولانی که برای کلاسها ایجاد کرده اید برای خوانایی بهتر کد.
    اين طرح مانع از آن می شود تا کلاس هايی که برای متدها و خصوصيات از يک شناسه يکسان استفاده می کنند تداخل داشته باشند.
    کد PHP:
    <?php
    namespace my\name// see "Defining Namespaces" section
     
    class MyClass {}
    function 
    myfunction() {}
    const 
    MYCONST 1;
     
    $a = new MyClass;
    $c = new \my\name\MyClass// see "Global Space" section
     
    $a strlen('hi'); // see "Using namespaces: fallback to global
                       // function/constant" section
     
    $d = namespace\MYCONST// see "namespace operator and __NAMESPACE__
                            // constant" section
    $d __NAMESPACE__ '\MYCONST';
    echo 
    constant($d); // see "Namespaces and dynamic language features" section
    ?>
    namespace ها از php 5.3.0 به بعد قابل دسترس هستند.

    (منبع : http://wiki.iranphp.org/Namespaces_overview که ترجمه http://ir.php.net/manual/en/language.nam...ionale.php است )

    در حقیقت namespace ها مثل فولدر های هستند که . شما کد ها رو
    در اونا قرار میدین .

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

    هر برنامه معتبری می توانید در namespace ها باشد
    شما فقط می توانید توابع (function) , کلاس ها و ثابت ها(constants) را در namespace قرار بدین .
    برای تعریف یک namespace شما باید از کلید "namespace" به همرا نام مورد نظر استفاده کنید
    namepsace تعریف شده باید قبل از هر کدی باشد مگر یک استثنا که اونم فقط و فقط دستور Declare است
    http://ir.php.net/manual/en/control-stru...eclare.php
    کد PHP:
    <?php
    namespace MyProject;

    const 
    CONNECT_OK 1;
    class 
    Connection /* ... */ }
    function 
    connect() { /* ... */  }

    ?>
    همون طور که میبینید . کلید "namespace" به همراه نامش یعنی "MyProject" ساخته شده.
    توجه داشته باشید که قبل از namespace . هیچ کدی نباید وجود داشته باشد (غیر از استثنایی که در بالا گفتم )
    و به سمت مرورگر ارسال شود برای مثال کد زیر .
    کد PHP:
    <html>
    <?
    php
    namespace MyProject// fatal error - namespace must be the first statement in the script
    ?>
    باعث یک fatal Error می شود .

    لینک مربوط : http://ir.php.net/manual/en/language.nam...nition.php
    تعریف چندین namespace در یک پرونده

    برای ساخت چندین namespace در یک فایل php
    که مثال آن در سیستم فولدر ها می شود ساخت چندین فولدر در یک فولدر
    باید به صورت زیر عمل کنید
    کد PHP:
    <?php
    namespace MyProject;

    const 
    CONNECT_OK 1;
    class 
    Connection /* ... */ }
    function 
    connect() { /* ... */  }

    namespace 
    AnotherProject;

    const 
    CONNECT_OK 1;
    class 
    Connection /* ... */ }
    function 
    connect() { /* ... */  }
    ?>
    در کد بالا . دو عدد namespace وجود دارد یکی MyProject و بعدی AnotherProject
    این روش برای تعریف چندین namespace در یک فایل php مناسب . نیست
    و فقط برای یک namespace مناسب است
    برای تعریف چند namespace در یک فایل بهتر است از براکت استفاده کنید :wink:
    مانند کد زیر
    کد PHP:
    <?php
    namespace MyProject {

    const 
    CONNECT_OK 1;
    class 
    Connection /* ... */ }
    function 
    connect() { /* ... */  }
    }

    namespace 
    AnotherProject {

    const 
    CONNECT_OK 1;
    class 
    Connection /* ... */ }
    function 
    connect() { /* ... */  }
    }
    ?>
    که باید جدی گرفته شود
    توجه داشته باشید که اگر از براکت استفاده کنید . هیچ کدی در فایل (به غیر از Declare)
    نباید از براکت ها خارج شوند

    در این صورت باید کد های که تصمیم دارین در ریشه باشند رو در namespace سراسری قرار بدین
    برای تعریف namespace سراسری (global namespace) که در ادامه کامل توضیح داده می شود
    باید از . از کلید "namespace" و حتما بعد از آن براکت استفاده کنید
    به شکل زیر
    کد:
    <?php
    namespace MyProject {

    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
    }

    namespace { // global code
    session_start();
    $a = MyProject\connect();
    echo MyProject\Connection::start();
    }
    ?>
    namespace سراسری در حقیقت . ریشه ترین namespace است و
    در حقیقت . پدر تمامی namespace های . فایل می شود
    کد:
    <?php
    declare(encoding='UTF-8');
    namespace MyProject {

    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
    }

    namespace { // global code
    session_start();
    $a = MyProject\connect();
    echo MyProject\Connection::start();
    }
    ?>
    http://ir.php.net/manual/en/language.nam...ltiple.php
    زیر namespace ها (sub-namespaces)

    شما می توانید چندید namespace را به صورت فرزند هم درست کنید
    (مانند چندین فولدر که در هم هستند ) از اونجا که ساختار namespace ها مانند
    ساختار folder ها هست . برای تعریف سه عدد namespace به صورت زیر عمل کنید .
    کد:
    namespace MyProject\Sub\Level
    در کد بالا Sub به عنوان زیر namespace
    MyProject در نظر گرفته میشود و . Level به عنوان زیر namespace
    Sub در نظر گرفته می شود . دقیق مثل . ساختار فولدر ها .
    یعنی مثل اینکه شما یک فولدر با نام MyProject درست کردید . و در اون هم یک فولدر به اسم Sub بسازید
    سپس در فولدر Sub یک فولدر به نام Leve بسازید . البته با این تفاوت که شما در فولدر ها . فایل نگهر می دارید
    ولی در namespace شما . توابع,کلاسها و ثابت ها رو نگهر می دارید . به همین سادگی ! :wink:

    لینک مربوط : http://ir.php.net/manual/en/language.nam...nested.php
    استفاده از namespace

    خب . تا اینجا تا حدود زیادی با namespace ها آشنا شدید . همون طور که گفتم شما فقط می توانید
    کلاس , تابع , ثابت رو در namespace قرار بدهید ما . در مثال زیر یک namespace با نام test1 درست کردیم
    و چندین تابع , ثابت و کلاس رو در اون قرار دادیم
    کد:
    <?php
    namespace Test1{
        class class1{

        }

        function Function1(){

        }

        const constants1 = 'hello';
    }
    شما می توانید برای namespace بالا . " زیر namespace " درست کنید . مانند کد زیر
    کد:
    namespace Test1\Test2{
        class class2{

        }

        function Function2(){

        }

        const constants2 = 'hello';
    }
    همون طور که گفته شد . برای ساخت " namespace سراسری" که ریشه ترین namespace است به صورت
    زیر عمل می کنید
    کد:
    namespace {
        session_start();
        $a = connect();
        echo Connection::start();
    }
    یعنی فقط . کلید "namespace" رو استفاده می کنید بعدش هم براکت باز و بسته
    خب ما در مثال زیر . namespace ها رو به صورت مختلف تعریف کردیم تا بهتر آشنا شوید
    کد:
    <?php

    declare(encoding='UTF-8');

    namespace { //  1#
        function HelloWord(){
        }
        
        class MyClass{
        }
        
        const MyConstants='value';
    }


    namespace Folder1{ // 2#
        function HelloWord(){
        }
        
        class MyClass{
        }
        
        const MyConstants='value';
    }

    namespace Folder2{ // 3#
        function HelloWord(){
        }
        
        class MyClass{
        }
        
        const MyConstants='value';
    }



    namespace Folder1\SubFolder{  // 4#
        function HelloWord(){
        }
        
        class MyClass{
        }
        
        const MyConstants='value';
    }

    ?>
    در کد بالا از دستور declare . استفاده شده است . همون طور که گفته شد . غیر از این دستور .
    هیچ . کدی نباید از براکت ها خارج شود و + هیج کدی نباید به سمت مرورگر برود

    به # های 1 تا 4 در کد بالا دقت کنید (که به صورت comment ) گذاشتم

    1# . نمونه یک "namespace سراسری" است .
    2# . یک namespace به اسم folder1 درست شده است
    3# . یک namespace دیگر با نام Folder2 درست شده است
    در این کد folder1 کنار folder2 است . هر دو فرزند 1# هستند
    4# یک namespace به نام SubFolder در folder1 ایجاد کرده است

    اگر دقت کرده باشید . در مثال بالا .
    در هر 4 عدد namespace تعریف شده . یک کلاس , ثابت , و تابع تعریف شده که همه هم نام هستند
    ولی هیچ تداخلی با هم پیدا نمی کنند

    این اولین قابلیت مهم namespace ها است
    دسترسی به namespace ها


    خوب دوستان از این به بعد به جای NameSpace می گم فضای نام

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

    مثال رو با سیستم آدرس دهی فایل و فولدر در سیستم عامل ها می زنم
    در . سیستم عامل ها شما برای دسترسی به فایل ها و فولدر ها 3 را دارین که به صورت زیر است

    1. آدرس نصبی : در این روش فقط نام فایل را میاورید مانند Name.jpg . همون طور که میدانید . سیستم عامل .
    name.jpg رو از کنار فولدری که توش هستید . پیدا می کنه .

    2. آدرس نصبی با نام فولدر : این روش هم مانند روش بالا است با این تفاوت که نام فولدر رو هم میارین به صورت
    images/name.jpg . سیستم عامل میاد اول دنبال فولدر images در کنار فولدری که توش هستین می گرده بعد از داخل
    اون name.jpg رو بدست میاره

    3. آدرس دهی مطلق : در این روش آدرس به صورت مطلق است . برای مثال images/name.jpg/ .

    در فضای نام هم به همین صورت است . (دقیق مثل سیستم آدرس دهی در linux) .
    سه حالت آدرس دهی در فضای نام وجود دارد

    1- Unqualified name :
    این آدرس دهی مانند حالت معمولی استفاده از توابع و.. است . در این حالت فقط نام رو میارین
    به صورت زیر
    کد:
    namespace Foo\Bar\subnamespace{
        const FOO = 1;
        function foo() { /* ... */ }
        class foo{ /* ... */  }
        
        /* Here */
        $a=new foo();
        foo();
        echo FOO;
    }
    اگر دقت کرده باشید در قستی که کامنت here رو گذاشتم . از این آدرس دهی برای فراخوانی سه عنصر استفاده
    کردم .
    این توابع و.. در همین فضای نام تعریف شدن .

    2- Qualified name
    خب . این روش دسترسی مانند روش قبل است با این تفاوت که شما ممکنه نام چند "زیر فضای نام"(sub-namespace)
    رو هم بیارین برای مثال
    کد:
    namespace Folder1{

        /* Sub1 Here */
        Sub1\MyFunc();
        $a=new Sub1\Myclass();
        
        /* Sub2 Here */
        Sub2\MyFunc();
        $a=new Sub2\Myclass();
    }

    namespace Folder1\Sub1{

        function MyFunc(){ echo 'sub1'; }
        class Myclass{ /* ... */ }
    }

    namespace Folder1\Sub2{

        function MyFunc(){  echo 'sub2';  }
        class Myclass{ /* ... */ }
    }


    ?>
    در کد بالا یک فضای نام به اسم Folder1 درست شده سپس 2 عدد زیرفضای نام به اسم های Sub1
    و Sub2 . در Folder1 درست شده .
    اگر دقت کنید . می بینید که . در folder1
    به وسیله نام "زیرفضای نام" یک کارکتر "/" و اسم آن . عناصر داخلش رو فراخوانی کردم . دقیق این شکلی
    کد:
    Sub2\MyFunc();

    Fully qualified name -3
    در این آدرس دهی . همین طور که در کد زیر معلوم است
    کد:
    <?php

    namespace{
        function RootFunc(){ echo 'Root'; }
        class RootClass{ /*...*/ }
    }

    namespace Folder1\Sub1\Sub2\Sub3{
        \RootFunc();
        $a=new \RootClass();
    }

    ?>
    در فضای نام "Folder1\Sub1\Sub2\Sub3" به صورت مطلق . تابع RootFunc(); فراخوانی شده است

    http://www.php.net/manual/en/language.na...basics.php
    ثابت جادوئی __namespace__

    ثابت جادوئی چیست ؟
    http://ir.php.net/manual/en/language.con...efined.php
    ثابت های جادوئی مقادیر خاصی رو در خودشتون نگهر می دارن
    مثلا ثابت__FILE__ آدرس اسکریپ رو میده

    در php 5.3 دو تا ثابت جادوئی اضافه شده که یکیش __NAMESPACE__ است
    این ثابت . نام "فضای نام" جاری رو در خودش نگهر می داره
    کد:
    <?php
    namespace MyProject;

    echo '"', __NAMESPACE__, '"'; // outputs "MyProject"
    ?>

    http://www.php.net/manual/en/language.na...stants.php
    -
    -
    ---------------------------------------
    خب دوستان راستش رو بخوایین این مقاله کامل نیست
    وقتی این مقاله رو نوشتم کسی استقبال نکرد! (البته نه در اینجا ) Confused منم ادامش ندادم
    کاربرد namespace وقتی مشخص میشه که با قابلیت pakage در java
    مقایسه شه
    ---------------------------------------
    (آخرین ویرایش در این ارسال: ۱۳۸۸ دي ۲۷ ۰۲:۳۱ عصر، توسط k2-4u.)
    ۱۳۸۸ دي ۲۷ ۰۱:۵۶ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : hidensoft admin molana scorpion parvane oia HiddeN Alimokhlesi bitanaz alic hosseintdk775 scooter Goback Bojbaj Mr.Moqadam nasserghiasi abedi98 king_net Reza payam voltan Y.P.Y ooghry masoudmanson shgninc rarg275 mohsenkw zoghal farhadfery hamid_80386 ialireza M.J Muhammad-Ali Maysam.m ayoubsys
    nasserghiasi آفلاین
    ناصر GH
    ***

    ارسال‌ها: 242
    تاریخ عضویت: ۱۳۸۸ آذر ۷
    اعتبار: 2
    تشکرها : 127
    ( 41 تشکر در 22 ارسال )
    ارسال: #2
    RE: آموزش کار با namespace ها در php 5.3
    فکر کنم کافی بود. ممنون
    کاربرد use رو هم بگی عالی میشه
    (آخرین ویرایش در این ارسال: ۱۳۹۱ فروردين ۱۵ ۱۰:۲۵ عصر، توسط nasserghiasi.)
    ۱۳۹۱ فروردين ۱۵ ۱۰:۲۰ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط :
    _mg آفلاین
    عضو جدید
    **

    ارسال‌ها: 1
    تاریخ عضویت: ۱۳۹۱ دي ۱۰
    اعتبار: 0
    تشکرها : 0
    ( 0 تشکر در 0 ارسال )
    ارسال: #3
    RE: آموزش کار با namespace ها در php 5.3
    آموزش بسیار مفیدی بود
    لطفا ادامه بدید آموزش ها رو
    ۱۳۹۱ دي ۱۰ ۰۵:۳۳ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط :
    shgninc آفلاین
    سید سجاد شاهچراغیان
    ***

    ارسال‌ها: 1,493
    تاریخ عضویت: ۱۳۸۹ خرداد ۱۹
    اعتبار: 32
    تشکرها : 1402
    ( 666 تشکر در 504 ارسال )
    ارسال: #4
    RE: آموزش کار با namespace ها در php 5.3
    با تشکر. خیلی جامع و مفید بود.
    __________________________________________________________________________
    سالهــــا مـــــى گــــــذرد، حادثه ها مى آید
    انتظـــــار فـــــــرج از نیمـــــه خــــــرداد کشم

    [تصویر:  ShowPicture.aspx?ID=52750d12-5d92-4286-9...height=100]
    ۱۳۹۱ دي ۱۰ ۰۶:۲۵ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط :
    javidabbaci آفلاین
    عضو جدید
    **

    ارسال‌ها: 43
    تاریخ عضویت: ۱۳۸۹ مهر ۳۰
    اعتبار: 1
    تشکرها : 28
    ( 4 تشکر در 4 ارسال )
    ارسال: #5
    RE: آموزش کار با namespace ها در php 5.3
    دوستان من به مشکل برخوردم
    همون کد هایی را که توی داکیومنت php هست را اجرا می کنم بعد این خطا را به من می ده این برای چی هست ممکنه راهنمایی کنید ...
    <?php
    namespace MyProject;

    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */ }

    ?>

    ********************************************************************************​************

    [align=left]

    ( ! ) SCREAM: Error suppression ignored for
    ( ! ) Fatal error: Namespace declaration statement has to be the very first statement in the script in C:\wamp\www\test4.php on line 2
    ۱۳۹۲ تير ۲۹ ۰۷:۲۸ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط :
    fun_9990 آفلاین
    عضو جدید
    **

    ارسال‌ها: 6
    تاریخ عضویت: ۱۳۹۱ مرداد ۸
    اعتبار: 0
    تشکرها : 0
    ( 0 تشکر در 0 ارسال )
    ارسال: #6
    RE: آموزش کار با namespace ها در php 5.3
    شما در وسط جمله این مطلب رو نوشتین
    برای تعریف سه عدد namespace به صورت زیر عمل کنید .
    کد:
    namespace MyProject\Sub\Level

    آیا این جمله بندی شما یک جمله بندی غلط نگارشی زبان فارسی هست یا اینکه نه منظورتون دقیقا این هست

    یعنی اینکه این کد namespace MyProject\Sub\Level به این معنی هست که ما به توابع و ثابت ها و کلاس های زیر مجموعه اخری یعنی Level دسترسی داریم یا اینکه نه , ما به هر توابع و قابت ها و کلاس های زیر مجموعه همهی فضای نام های موجود در MyProject و Sub و Level دسترسی خواهیم داشت

    ممنون
    (آخرین ویرایش در این ارسال: ۱۳۹۶ آذر ۲۴ ۰۵:۱۴ صبح، توسط fun_9990.)
    ۱۳۹۶ آذر ۲۳ ۰۸:۳۴ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط :
    Y.P.Y آفلاین
    ناظم کل
    *******

    ارسال‌ها: 2,780
    تاریخ عضویت: ۱۳۸۷ دي ۲۸
    اعتبار: 103
    تشکرها : 2181
    ( 4856 تشکر در 2220 ارسال )
    ارسال: #7
    RE: آموزش کار با namespace ها در php 5.3
    همین سوال رو در گروه تلگرام پرسیدید و پاسخ دادم

    کلاً در پی اچ پی مفهوم namespace چیزی شبیه به package در جاوا هستش
    یعنی دسته بندی و جداسازی کتابخانه ها، کلاسها و... از یکدیگر هستش

    namespace Company/LibraryName/ClassName...
    namespace DeveloperName/LibraryName/ClassName...
    ...

    مثل
    namespace YPY/BetterExceptionHandler/Exception
    namespace YPY/NetworkLibrary/Curl
    __________________________________________________________________________
    وبلاگ: Yousha.Blog.ir

    صدام: "اگر با ارتش شاه ایران طرف بودیم، یک ماهه جنگ را می بردیم"
    http://gulfnews.com/opinion/thinkers/ira...i-1.500997
    ۱۳۹۶ آذر ۲۴ ۰۱:۴۳ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : farhadhp undefined ayoubsys
    « قدیمی تر | تازه‌ تر »

    ارسال پاسخ
    پرش به انجمن:


    کاربرانِ درحال بازدید از این موضوع: 1 مهمان
    IranPHP.org | تماس با ما | بازگشت به بالا | بازگشت به محتوا | بایگانی | پیوند سایتی RSS