PDA

View Full Version : سوال: دلایل استفاده از namespace ها در نسخه های جدید OOP



m.esmaeilzadeh
یک شنبه 17 خرداد 1394, 19:09 عصر
دوستان فریم ورک های جدید اکثرا اومدن از این قابلیت جدید ( namespace ) در OOP استفاده میکنن !!!
می خواستم اگر میشه کسی از دوستان توضیحاتی رو درباره این قضیه بده و اینکه چه ضرورتی بر استفاه از این قابلیت است ...
یعنی اگر میشه و امکان داره با ذکر یک مثال ساده و ابتدایی اصول کلی کار رو بفرمایید چه هستش ؟!
با تشکر

fatima-php
یک شنبه 17 خرداد 1394, 19:51 عصر
فرض کنید شما و دوستتون دارین توی یک تیم روی پروژه کار میکنید و به هر کدوم از شما نوشتن یکی از ماژولهای سیستم سپرده شده. حالا بطور اتفاقی جفتتون یک کلاس دارین توی ماژول خودتون به اسم Greeting که متدهای مختلفی داره و رفتارشون با هم فرق میکنه. از قرار، توی پروژه هر دو ماژول شما و دوستتون فعال میشه و یکمرتبه بوم!
Cannot redeclare class 'Greeting' at ...
اما اگه از namespace استفاده کنیم سناریو چه فرقی میکنه؟
کلاس Greeting شما:

namespace \app\modules\MyModule;
class Greeting { ... }
و کلاس Greeting دوستتون:

namespace \app\modules\MyFriendsModule;
class Greeting { ... }
و حالا نحوه استفاده همزمان از هر دو کلاس:

use \app\modules\MyModule;
use \app\modules\MyFriendsModule;
$myGreeting = new MyModule\Greeting;
$myFriendsGreeting = new MyFriendsModule\Greeting;
یا حتی از این هم قشنگتر:

use \app\modules\MyModule\Greeting as MyGreeting;
use \app\modules\MyFriendsModule\Greeting as MyFriendsGreeting;
$myGreeting = new MyGreeting;
$myFriendsGreeting = new MyFriendsGreeting;

m.esmaeilzadeh
دوشنبه 18 خرداد 1394, 15:18 عصر
فرض کنید شما و دوستتون دارین توی یک تیم روی پروژه کار میکنید و به هر کدوم از شما نوشتن یکی از ماژولهای سیستم سپرده شده. حالا بطور اتفاقی جفتتون یک کلاس دارین توی ماژول خودتون به اسم Greeting که متدهای مختلفی داره و رفتارشون با هم فرق میکنه. از قرار، توی پروژه هر دو ماژول شما و دوستتون فعال میشه و یکمرتبه بوم!
Cannot redeclare class 'Greeting' at ...
اما اگه از namespace استفاده کنیم سناریو چه فرقی میکنه؟
کلاس Greeting شما:

namespace \app\modules\MyModule;
class Greeting { ... }
و کلاس Greeting دوستتون:

namespace \app\modules\MyFriendsModule;
class Greeting { ... }
و حالا نحوه استفاده همزمان از هر دو کلاس:

use \app\modules\MyModule;
use \app\modules\MyFriendsModule;
$myGreeting = new MyModule\Greeting;
$myFriendsGreeting = new MyFriendsModule\Greeting;
یا حتی از این هم قشنگتر:

use \app\modules\MyModule\Greeting as MyGreeting;
use \app\modules\MyFriendsModule\Greeting as MyFriendsGreeting;
$myGreeting = new MyGreeting;
$myFriendsGreeting = new MyFriendsGreeting;

ممنون ولی اصلا توضیحات شما رو نفهمیدم و خیلی کلی و نامفهوم بودش !!!
اگر میشه بفرمایید اون آدرس های فولدرها و غیره منظور و مفهومش چیه و چطوری باید فایل های کلاس ها رو نامگذاری کنیم ؟!
چون اصلا برای use هیچ php. برای آدرس ها گذاشته نشده ....

fatima-php
دوشنبه 18 خرداد 1394, 21:06 عصر
قوانین PSR رو باید مطالعه کنید. شما یکمرتبه اومدین سؤال از وسط مباحث شئ گرایی میپرسین بدون اینکه پیشنیازهاش رو رعایت کرده باشین. خوب طبیعیه که خیلی از چیزا رو متوجه نمیشین. معمولاً توی ساختار پروژه، app\ همون ریشه سایت هست و بقیه هم هرکدوم معادل یک پوشه هستن تا آخری که اسم کلاس هست که در این صورت معمولاً با کمک as بهش یک اسم مستعار خلاصه میدن که با بقیه اسمها تداخل پیدا نکنه. مباحث شئ گرایی رو باید از پایه بخونید. این لینک رو مطالعه کنید: http://php.net/manual/en/language.namespaces.rationale.php

m.esmaeilzadeh
سه شنبه 19 خرداد 1394, 11:30 صبح
قوانین PSR رو باید مطالعه کنید. شما یکمرتبه اومدین سؤال از وسط مباحث شئ گرایی میپرسین بدون اینکه پیشنیازهاش رو رعایت کرده باشین. خوب طبیعیه که خیلی از چیزا رو متوجه نمیشین. معمولاً توی ساختار پروژه، app\ همون ریشه سایت هست و بقیه هم هرکدوم معادل یک پوشه هستن تا آخری که اسم کلاس هست که در این صورت معمولاً با کمک as بهش یک اسم مستعار خلاصه میدن که با بقیه اسمها تداخل پیدا نکنه. مباحث شئ گرایی رو باید از پایه بخونید. این لینک رو مطالعه کنید: http://php.net/manual/en/language.namespaces.rationale.php

ممنون
من میخواستم کسی بیاد و همین رو توضیح بده , وگرنه استفاده ازش رو برای کار با فریم ورک ها آشنایی داشتم
البته من خیلی وقته شی گرایی با php رو انجام میدم , ولی چون برنامه هایی که نوشته بودم با سبک قدیم بود , و از نسخه 5 به بعد تغییرات زیادی شی گرایی داشته به خاطر همین namespace ها برام جدید و مشکل داشتم ....
البته تو NET. با namespace ها قبلا کار کرده بودم , ولی در php کمی مفهومش گنگ هستش و البته پیاده سازی اش ....

hamedarian2009
سه شنبه 19 خرداد 1394, 11:54 صبح
fatima خیلی خوب توضیح دادن دیگه خیلی گنگ هم نیست هنگام تعریف کلاس باید فضای نام رو هم تعریف کنید و معمولا هم اگه پوشه کدهای برنامه نامش app باشه و شما مدل هاتون داخل پوشه app/Models باشه فضای نام هم به نام app\Models تعریف میشه و کافیه توی فراخوانی کلاس ها یا بیایید قبل استفاده در کلاس دیگه اونو use کنید و یا به طور مستقیم به همراه فضای نام کلاس رو فراخوانی کنید کجاش نامفهومه دلیل استفاده از فضای نام هم بیشتر برای جلوگیری از تداخل نام های مشابه در پروژه های بزرگ هست

m.esmaeilzadeh
سه شنبه 19 خرداد 1394, 12:11 عصر
fatima خیلی خوب توضیح دادن دیگه خیلی گنگ هم نیست هنگام تعریف کلاس باید فضای نام رو هم تعریف کنید و معمولا هم اگه پوشه کدهای برنامه نامش app باشه و شما مدل هاتون داخل پوشه app/Models باشه فضای نام هم به نام app\Models تعریف میشه و کافیه توی فراخوانی کلاس ها یا بیایید قبل استفاده در کلاس دیگه اونو use کنید و یا به طور مستقیم به همراه فضای نام کلاس رو فراخوانی کنید کجاش نامفهومه دلیل استفاده از فضای نام هم بیشتر برای جلوگیری از تداخل نام های مشابه در پروژه های بزرگ هست

اگر امکانش هست یک نمونه خیلی کوچیک برای بنده بسازید , که تکمیل تر بشه !!!
چون هر چقدر امتحان میکنم Fatal error به من میده و میگه که کلاس مورد نظر یافت نشد ....
البته نسخه php لوکال من 5.4.4 هستش و قاعدتا بایست پشتیبانی کنه از فضای نام

Keramatifar
سه شنبه 19 خرداد 1394, 12:53 عصر
اگر امکانش هست یک نمونه خیلی کوچیک برای بنده بسازید , که تکمیل تر بشه !!!
چون هر چقدر امتحان میکنم Fatal error به من میده و میگه که کلاس مورد نظر یافت نشد ....
البته نسخه php لوکال من 5.4.4 هستش و قاعدتا بایست پشتیبانی کنه از فضای نام

دوست عزیز
اصولا مباحث شی گرایی مختص یک زبان برنامه نویسی نیستند بنابراین اگر طبق فرمایش خودتون، با زبان های تحت فریمورک DotNet کار کردید، بنابراین کاربرد Namespace ها در PHP رو دقیقا مطابق با C#‎ در نظر بگیرید.

البته تجربه آموزشی من نشون داده، اگر شما مفهوم NameSpace یا هر کدام از تئوری های شی گرایی را به نوعی با مثالی خارج از زبان برنامه نویسی یاد بگیرید، نه تنها مسئله در زبان مورد نظر، به راحتی براتون قابل لمس میشه، به شما توانایی پیاده سازی در هر ساختاری خواهد را خواهد داد.
اما در این مورد همونطور که خواستید براتون یک مثال ساده می زنم
فرض کنید که من دارم یک فریمورک طراحی می کنم به زبان PHP ، و نام این فریم ورک را MRKF (سرنام Mohammad Reza KeramatiFar) انتخاب می کنم و ساختار فولدرهای پروژه را به این صورت ایجاد می کنم:

- MRKFramework
- Libs
+ NuSoap
+ Smarty
- Components
class.input.php
class.database.php
- Core
interface.input.php
interface.database.php
- Conf
configs
- Languages
fa
en
ar
وقتی که تعداد کلاس ها، کامپوننت ها و کتابخانه های من زیاد بشه، دسته بندی اونها در هنگام فراخوانی و بخصوص توسعه، به شدت پیچیده و در اصطلاح اسپاگتی خواهد شد.
بنابراین با استفاده از Namespace ها به نوعی این فایل ها را دسته بندی می کنم، مثلا:


//mrkf.core.php
namespace CORE;
class config{}
interface database{}
interface datetime{}
class languages{}

//mrkf.database.php
namespace CORE\DB;
class mysql implements CORE\database
{

}
class MSSQL implements CORE\database
{

}
class ORACLE implements CORE\database
{

}

//mrkf.languages.php
namespace CORE\Langs;
class persian extends CORE\languages
{

}
class spanish extends CORE\languages
{

}

m.esmaeilzadeh
چهارشنبه 20 خرداد 1394, 13:42 عصر
دوست عزیز
اصولا مباحث شی گرایی مختص یک زبان برنامه نویسی نیستند بنابراین اگر طبق فرمایش خودتون، با زبان های تحت فریمورک DotNet کار کردید، بنابراین کاربرد Namespace ها در PHP رو دقیقا مطابق با C#‎‎ در نظر بگیرید.

البته تجربه آموزشی من نشون داده، اگر شما مفهوم NameSpace یا هر کدام از تئوری های شی گرایی را به نوعی با مثالی خارج از زبان برنامه نویسی یاد بگیرید، نه تنها مسئله در زبان مورد نظر، به راحتی براتون قابل لمس میشه، به شما توانایی پیاده سازی در هر ساختاری خواهد را خواهد داد.
اما در این مورد همونطور که خواستید براتون یک مثال ساده می زنم
فرض کنید که من دارم یک فریمورک طراحی می کنم به زبان PHP ، و نام این فریم ورک را MRKF (سرنام Mohammad Reza KeramatiFar) انتخاب می کنم و ساختار فولدرهای پروژه را به این صورت ایجاد می کنم:

- MRKFramework
- Libs
+ NuSoap
+ Smarty
- Components
class.input.php
class.database.php
- Core
interface.input.php
interface.database.php
- Conf
configs
- Languages
fa
en
ar
وقتی که تعداد کلاس ها، کامپوننت ها و کتابخانه های من زیاد بشه، دسته بندی اونها در هنگام فراخوانی و بخصوص توسعه، به شدت پیچیده و در اصطلاح اسپاگتی خواهد شد.
بنابراین با استفاده از Namespace ها به نوعی این فایل ها را دسته بندی می کنم، مثلا:


//mrkf.core.php
namespace CORE;
class config{}
interface database{}
interface datetime{}
class languages{}

//mrkf.database.php
namespace CORE\DB;
class mysql implements CORE\database
{

}
class MSSQL implements CORE\database
{

}
class ORACLE implements CORE\database
{

}

//mrkf.languages.php
namespace CORE\Langs;
class persian extends CORE\languages
{

}
class spanish extends CORE\languages
{

}




ممنون جتاب کرامتی ؛ من کدهای شما رو هم نوشتم و طبق روالی که فرمودید مرتب کردم ولی باز خطا " کلاس مورد نظر یافت نشد " رو به من میده !!!
میخواستم درخواست کنم اگر امکانش هست یک نمونه عملی با 2 فایل ساده php رو برای بنده بنویسید و زحمت بکشید اینجا آپلود کنید که من روی لوکال هاست اجرا و نتیجه رو ببینم و با آزمون و خطا روی فایل های شما اصل قضیه رو بهتر متوجه بشم ....
با تشکر

amir_saman
یک شنبه 31 خرداد 1394, 10:42 صبح
امیدوارم این مثال کارتو راه بندازه و متوجه namespace و روش استفاده از اون بشی

فایل ایندکس
132458

فایل تست ۱ در پوشه libs
132459

فایل تست ۲ در پوشه libs
132460

خروجی در اجرا
132461

m.esmaeilzadeh
یک شنبه 31 خرداد 1394, 12:07 عصر
امیدوارم این مثال کارتو راه بندازه و متوجه namespace و روش استفاده از اون بشی

فایل ایندکس
132458

فایل تست ۱ در پوشه libs
132459

فایل تست ۲ در پوشه libs
132460

خروجی در اجرا
132461


ممنون , هیچکدوم از آموزش ها اشاره ای به include نکرده بودن , و تازه من متوجه شدم که بایست فایل ها رو جدا گانه به فایل خودم متصل کنم :چشمک:

fatima-php
یک شنبه 31 خرداد 1394, 12:29 عصر
include که باید انجام بشه و فکر نمیکردم نیاز به گفتن داشته باشه ولی اگه یه Autoloader منطبق با اصول PSR نوشته باشین و اسامی پوشه ها هم مطابق با namespace ها باشه، خودش فایل رو پیدا و ضمیمه میکنه.