صفحه 2 از 5 اولاول 1234 ... آخرآخر
نمایش نتایج 41 تا 80 از 165

نام تاپیک: آموزش برنامه نویسی OOP

  1. #41

    نقل قول: آموزش برنامه نویسی OOP

    نقل قول نوشته شده توسط naser67 مشاهده تاپیک
    خوب معلومه کسی که سورس در اختیارشه همه کار میتونه بکنه ولی فکر کن کسی به سورس دسترسی نداشته باشه اونوقت چی؟

    حالا یه مثال ساده
    فکر کن سورستو زند کردی و نمی خوای که کسی که سورس زند شده رو داره یه متغیر یا مت رو عوض کنه
    حالا اونوقت تکلیف چیه؟
    حرفهای شما صحیح اما فلسفه وجودی اینها برای توسعه هست نه برای محافظت.
    مقوله OOP بیشتر حرفش روی توسعه راحتتر و سریعتر بنا نهاده شده و این خصوصیات برای این هست که توسعه دهنده بدونه که کدی رو که داره برای چی هست و کدوم قسمتهاش رو مهم هست که بدونه.
    کسی تا به حال به این صورت کار نکرده که کد زند شده رو به یک توسعه دهنده بده.(البته خود نظر خوبی هم شاید باشه که از کد محافظت بشه).

  2. #42

    نقل قول: آموزش برنامه نویسی OOP

    به نظر شما فلسفه وجودی private اینه که کسی که داره برنامه رو توسعه میده بدونه با اون متد یا متغیر نباید کاری داشته باشه؟

    فلسفه وجودی اینها برای توسعه هست نه برای محافظت.
    100% مخالفم

    مقوله OOP بیشتر حرفش روی توسعه راحتتر و سریعتر بنا نهاده شده
    موافقم البته مقوله امنیت هم حتما لحاظ کردن

    کسی تا به حال به این صورت کار نکرده که کد زند شده رو به یک توسعه دهنده بده.
    این یه مثال بود که بگم شرایطی هم هست که کاربر به سورس دسترسی نداره

  3. #43
    کاربر دائمی آواتار musiox
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    پشت کامپیوتر
    پست
    269

    نقل قول: آموزش برنامه نویسی OOP


    object(myCls)#1 (1) { ["user:private"]=> string(3) "asd" }

    بحثش بحث امنیت نیست . اصلا محافظتی در کار نیست , یه ارث بری کافیه که من هر چی بخوام داشته باشم . یه var_dump کافیه که من براحتی مقادیر رو ببینم , توی هر زبون برنامه نویسی دیگه ای این جوری باشه ( که من تا حالا ندیدم باشه ) توی php اینجوری نیست .
    اگه مثال از این نوع سرقت اطلاعات داری خواهشا بزن , اگه نداری خوب حرفی باقی نمی مونه .

  4. #44

    نقل قول: آموزش برنامه نویسی OOP

    یه ارث بری کافیه که من هر چی بخوام داشته باشم
    من یه کد ساده میزارم ، شما اون متد get_name را خارج از کلاس صدا بزن


    class valed
    {
    private $name;
    public function __construct($name)
    {
    $this->name=$name;
    }

    private function get_name()
    {
    return $this->name;
    }
    }

    class test extends valed
    {
    public function _construct(){}
    }

    $obj=new test("Naser");
    echo $obj->get_name();


    اول یکم تحقیق کن بعد بیا پست بزن

  5. #45

    نقل قول: آموزش برنامه نویسی OOP

    نقل قول نوشته شده توسط naser67 مشاهده تاپیک
    من یه کد ساده میزارم ، شما اون متد get_name را خارج از کلاس صدا بزن


    class valed
    {
    private $name;
    public function __construct($name)
    {
    $this->name=$name;
    }

    private function get_name()
    {
    return $this->name;
    }
    }

    class test extends valed
    {
    public function _construct(){}
    }

    $obj=new test("Naser");
    echo $obj->get_name();
    اول یکم تحقیق کن بعد بیا پست بزن
    دوست عزیز ایشون دانششون بیشتر از این حرفهاست (البته من هم فکر می کردم که میشه ولی تست نکرده بودم اشاره ای نکردم که دوست استاد بنده موضوع رو بیان کردند) شما کد زیر رو امتحان کنید

    <?php
    class valed
    {
    private $name;
    public function __construct($name)
    {
    $this->name=$name;
    }

    private function get_name()
    {
    return $this->name;
    }
    }

    class test extends valed
    {

    }

    $obj=new test("Naser");
    print_r($obj);
    ?>

  6. #46

    نقل قول: آموزش برنامه نویسی OOP

    دوست عزیز ایشون دانششون بیشتر از این حرفهاست
    دوست من من تو این قضیه شکی ندارم ، منم نخواستم بگم که من حالیمه فلانی حالیش نیست
    داریم دوستانه بحث میکنیم تا سطح دانشمون بره بالا ، شما هم از حرفای من ناراحت نشو

    درسته شما میتونی مقادیر متغیر رو ببینی

    ولی نمیتونی تغیرشون بدی یا خارج از کلاس ازشون استفاده کنی

    من یه مثال از دنیای واقعی میزنم

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

  7. #47
    کاربر دائمی آواتار tabib_m
    تاریخ عضویت
    تیر 1384
    محل زندگی
    ایران - قم
    پست
    1,268

    نقل قول: آموزش برنامه نویسی OOP

    اونی که داخل کلاس رو نوشته، خودش خارج کلاس رو نوشته.... پس در استفاده از متغیر در خارج از کلاس، اختیار تام داره... در این مسئله اصلا مبحث امنیت پیش نمیات که بخوات به کد مذکور ربط داشته باشه یا نه!
    فقط ایجاد نظم هست.

    مثل این میمونه که شما توی یک تابع یک متغیر رو global بکنی یا نکنی... حالا اگه global نکنی، رو این حساب که از این متغیر در خارج از تابع نمیشه استفاده کرد، امنیت کدت میره بالا؟؟

  8. #48
    کاربر دائمی آواتار musiox
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    پشت کامپیوتر
    پست
    269

    نقل قول: آموزش برنامه نویسی OOP

    آقا وحید مارو شرمنده نکنید ما کوچیک همه هستیم .
    اول باید به مفاهیم OO یه نگاهی بندازیم . بحث کپسوله سازی و اینکه کلا برای چی بکار میره .
    وقتی یه کلاس نوشته میشه برای اینکه دیگران از اون استفاده کنند یک API لازم دارن که نحوه استفاده و ارتباط متقابل رو با کلاس بدونن . کاربری که از کلاس استفاده می کنه گاهی اوقات نیازی به استفاده مستقیم از یک متد یا یک پراپرتی رو نداره چون اساسا به کارش نمیاد و صرفا برای استفاده خصوصی داخل کلاسه. مثلا من برای کار با یه ابزار که از اجزای پیچیده ای تشکیل شده درگیر جزئیات اون نمیشم و فقط نیاز دارم به اینکه اون ابزار یه سری واسط در اختیار من قرار بده تا از کارایی های اون ابزار استفاده مورد نظرمو بکنم . با این اوصاف متدهای پابلیکم میشن اون واسط ها و متد های پراویتم میشن اون پیچیدگی ها . اساس و فلسفه پشت این قضیه اینه . که از دید من از یه جا ناشی میشه و اونم چیزی جز راحتی پیاده سازی یه سیستم و قابلیت توسعه پذیری اون نمی تونه باشه .
    حالا اینکه این وسط استفاده های دیگه ای هم ازین مفاهیم می کنن یه مقوله جداست . بله راه هایی وجود داره که امنیت رو بالا ببری ( البته در برابر آدم بی سوادی مثله من ) . ولی :
    1. کدایی که نوشتی رو باید اینکد کنی , بطوری که دیکدرش توی اینترنت نباشه !
    2. مقدار پراپرتیات چیزی نباشه که اهمیت زیادی داشته باشه ( چون من به متدای پراویتت دسترسی ندارم می تونی مقادیر پراپرتیات رو اینکد کنی و بوسیله یه متد پرایویت اونا رو هر وقت بخوای استفاده کنی دیکد کنی )
    3. اگه مقادیر پراپرتیات مهما باید کلاست هم final باشه هم singleton
    یه راه دیگه هم هست که به بحث مربوط نیست .

    <?php
    class valed
    {
    public $name;
    public function __construct($name)
    {
    $this->name=$name;
    }

    private function get_name()
    {
    return $this->name;
    }


    }

    class test extends valed
    {

    public function parent_props(){
    eval(var_export($this,true).';');
    }

    static function __set_state($parent_props){
    foreach($parent_props as $prop=>$value){
    echo $prop.'='.$value.'<br />';
    }
    }

    }

    ?>

    اینم یه دعوای جالب

  9. #49

    نقل قول: آموزش برنامه نویسی OOP

    اونی که داخل کلاس رو نوشته، خودش خارج کلاس رو نوشته.... پس در استفاده از متغیر در خارج از کلاس، اختیار تام داره
    خوب شد گفتی. شما اصلا به این نکته توجه نکردی که یک کار استاندارد که به صورت کامپوننت در میاد در اصل به همین صورت که یکی کلاس رو می نویسه دیگران ازش استفاده می کنند
    به عنوان مثال : PEAR,ZF,....

    بحثش بحث امنیت نیست . اصلا محافظتی در کار نیست
    من که نفهمیدم چرا اینو گفتی .
    اگه بحث امنیت نیست پس بحث چیه ؟
    فقط نظم ! یعنی سیستم های ساخت یافته نظم نداشتند که شی گرایی با n تا مزیتش ( ازجمه همین Private) امودن تا نظم برقرار کنن ؟ البته این یک از اهدافش هست .اما بهتره بدونید که تعریف متغییر ها و متد های Public,private,.. در امنیت برنامه نقش بسزایی داره
    یک از دلایلش اینه که متغییر های خصوصی به محض تموم شدن عمرشون از حافظه خارج میشن . اصولا متغییر های خصوصی در حافظه پشته تعریف میشن و به محض تمام شدن دوره عمرشون از حافظه خارج می شن . اینستنت ها و پابلیک ها در حافظه هیپ و البته قابل دسرسی خواهند بود البته در اغلب موارد در این قسمت از حافظه پابلیک های زیادی هست که میشه دسترسی بهشون رو باز سازی کرد و ازشون استفاده کرد.
    بماند که پی اچ پی متاسفانه هنوز کاملا از مفاهیم شیگرایی پشتیبانی نمی کنه و لی این واقعیت هایی که گفتم در تمام سیستم های واقعا شی گرا وجود داره .


    البته نمیشه گفت امنیت کد بالاتر میره. چون به هر حال سورس کلاس پدر هم در دسترس هست.
    ؟

  10. #50

    نقل قول: آموزش برنامه نویسی OOP

    نقل قول نوشته شده توسط alimokhlesi مشاهده تاپیک
    خوب شد گفتی. شما اصلا به این نکته توجه نکردی که یک کار استاندارد که به صورت کامپوننت در میاد در اصل به همین صورت که یکی کلاس رو می نویسه دیگران ازش استفاده می کنند
    به عنوان مثال : PEAR,ZF,....



    من که نفهمیدم چرا اینو گفتی .
    اگه بحث امنیت نیست پس بحث چیه ؟
    فقط نظم ! یعنی سیستم های ساخت یافته نظم نداشتند که شی گرایی با n تا مزیتش ( ازجمه همین Private) امودن تا نظم برقرار کنن ؟ البته این یک از اهدافش هست .اما بهتره بدونید که تعریف متغییر ها و متد های Public,private,.. در امنیت برنامه نقش بسزایی داره


    ؟
    امنیت رو برقرار می کنه ولی نه امنیت مخفی کردن کد. امنیت رو از نظر اینکه شخص دیگری که می خواد از این کلاس استفاده کنه یا ازش به ارث ببره امکان تغییر در اصلیت و پارامترهای اصلی کلاس پدر رو نداشته باشه. اگر منظور شما از امنیت به همین معناست واقعا درست عرض کردید.


    یک از دلایلش اینه که متغییر های خصوصی به محض تموم شدن عمرشون از حافظه خارج میشن . اصولا متغییر های خصوصی در حافظه پشته تعریف میشن و به محض تمام شدن دوره عمرشون از حافظه خارج می شن . اینستنت ها و پابلیک ها در حافظه هیپ و البته قابل دسرسی خواهند بود البته در اغلب موارد در این قسمت از حافظه پابلیک های زیادی هست که میشه دسترسی بهشون رو باز سازی کرد و ازشون استفاده کرد.
    بماند که پی اچ پی متاسفانه هنوز کاملا از مفاهیم شیگرایی پشتیبانی نمی کنه و لی این واقعیت هایی که گفتم در تمام سیستم های واقعا شی گرا وجود داره .
    این مواردی رو که گفتید رو بنده اطلاعی ندارم چون با php کار کردم. و می دونم در php اینگونه نیست. php هم به دلیل محدودیت هایی که در ram داره و ساختارش نمی تونه به معنای حقیقی OOP رو پیاده سازی کنه. ولی در حد نیاز برآورده کرده.

    من از کتابهایی که خوندم به این نتیجه رسیدم که:
    دلیل استفاده از private و public و protect این هست که وقتی که یک توسعه دهنده دیگه میاد و از کد شما استفاده می کنه (یا شما بعد از مدت طولانی می خواید از کد خودتون استفاده کنید) دچار سردرگمی نشه و وارد جزئیات موجود در کد که ممکنه خیلی نکات در اون رعایت بشه نشه. بیشتر پیشنهاد میشه private ها در داکیومنت قرار نگیرند.

    من یک سوال دارم. آیا شما پروژه ای رو سراغ دارید که به این منظور از private ها استفاده کرده باشند؟ (حتی پروژه هایی که خودتون استفاده کردید و این رو جهت این می خوام بدونم که آیا واقعا به این منظور کسی استفاده کرده یا نه چون من تا به حال جایی ندیدم و نه خوندم و البته اطلاع نداشتن من به حتم به دلیل بی تجربگی من هست)

  11. #51

    نقل قول: آموزش برنامه نویسی OOP

    امنیت رو برقرار می کنه ولی نه امنیت مخفی کردن کد. امنیت
    منم گلوم خشک شد که همینو بگم

  12. #52

    نقل قول: آموزش برنامه نویسی OOP

    نقل قول نوشته شده توسط naser67 مشاهده تاپیک
    منم گلوم خشک شد که همینو بگم
    پس شد مثل قضیه عنب و انگور و ازوم و غیره

  13. #53
    کاربر دائمی آواتار musiox
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    پشت کامپیوتر
    پست
    269

    نقل قول: آموزش برنامه نویسی OOP

    من که نفهمیدم چرا اینو گفتی .
    اگه بحث امنیت نیست پس بحث چیه ؟
    نمی دونم چرا این حرفو می زنی ؟!
    آیا OO برای امنیت طراحی شده ؟!
    من که جایی ندیدم که همچین حرفی کسی زده باشه . اگه شما دیدین خب خوشحال میشم که مارم آگاه کنین .
    منم گلوم خشک شد که همینو بگم
    شما هم که هر بار یه چیز میگی ...

  14. #54

    نقل قول: آموزش برنامه نویسی OOP

    شما هم که هر بار یه چیز میگی
    هر بار چی گفتم

    از اولش دارم یه چیز میگم که

  15. #55

    نقل قول: آموزش برنامه نویسی OOP

    نمی دونم چرا این حرفو می زنی ؟!
    آیا OO برای امنیت طراحی شده ؟!
    خیر . من گفتم فقط برای نظم نیست . نگفتم فقط برای امنیت هست.
    مصداق کامل :
    ....شی گرایی با n تا مزیتش....


    آیا شما پروژه ای رو سراغ دارید که به این منظور از private ها استفاده کرده باشند؟
    بله.
    وحید جان سعی میکنم در صورتی که وقت آزاد پیدا کردم یک تاپیک عملی در ایران پی اچ پی بزنم.

  16. #56
    کاربر دائمی آواتار musiox
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    پشت کامپیوتر
    پست
    269

    نقل قول: آموزش برنامه نویسی OOP

    هر بار چی گفتم

    از اولش دارم یه چیز میگم که
    ببخشید , اشتباه از من بود .
    من هنوز قانع نشدم . من می گم جایی ندیدم که حرف شما رو زده باشه . اگه میشه منبعی رو که شما این حرف از روی اون داری میزنی به ما هم معرفی کن تا ماهم بدونیم . اگرم یه حرفیه که از روی تجربه بیان میشه میرسیم به اینکه توی طراحی OO امنیت مطرح نبوده .
    یک تاپیک عملی در ایران پی اچ پی بزنم.
    خواهشا همینجا مطرحش کن . یا لینکشو بزار .

  17. #57

    نقل قول: آموزش برنامه نویسی OOP

    سلام
    چند وقتیه خدمت مجال نمی ده در کنار برو بچس باشم

    به نظر من OOP مستقیما برای بالا بردن امنیت نیست ، بلکه برای بالا بردن قدرت مانور ، سرعت توسعه ، افزایش خوانایی بوده ، جلوگیری از تکرار کد بوده.

    وقتی شما اسکریپت های غیر OOP و OOP رو با هم مقایسه کنید در اولین نگاه متوجه می شید که گسترش برنامه های غیر OOP خیلی سخت تر از OOP است . اما در هر دو امکان وجود حفره های امنیتی هست ، پس نمی شه گفت لزوما استفاده از OOP به معنای بالا بردن امنیت است . وقتی یکم دقیق بشید روی اسکریپت های خیلی بزرگ که از OOP استفاده می کنند می بینید که چقدر قدرت گسترشش بالاست (در مقایسه با اسکریپت های غیر OOP) .
    اما اینکه استفاده از Protect یا Privat باعث افزایش امنیت می شه یا نه !

    بستگی به این داره که نگاه شما نسبت به امنیت چیه ! پروژه شما چه امنیتی نیاز داره ، واقعا عدم استفاده از Protect باعث ایجاد حفره امنیتی میشه ؟

    به نظر من استفاده از Protect و ... مانند انجام دادن اعمال مستحبه ، توی این 40 .. 50 پروژه ای که انجام دادم هیچ وقت عدم استفاده از گذینه های بالا باعث ایجاد حفره امنیتی نشده و هیچ وقت هم نمی شه ، چرا که استفاده از این گذینه ها فقط برای راحتی کار برنامه نویس هست نه بالا بردن امنیت .

    امنیت یعنی منطق برنامه نویسی شما !

    به نظر من بهتره یکم به مسائل با نگاه باز تری نگاه کنید.

    اگرم یه حرفیه که از روی تجربه بیان میشه میرسیم به اینکه توی طراحی OO امنیت مطرح نبوده .


    این مواردی رو که گفتید رو بنده اطلاعی ندارم چون با php کار کردم. و می دونم در php اینگونه نیست. php هم به دلیل محدودیت هایی که در ram داره و ساختارش نمی تونه به معنای حقیقی OOP رو پیاده سازی کنه. ولی در حد نیاز برآورده کرده.
    فکر نمی کنم .. مقاله یا یه مطلب رسمی برای اثباتش نیاز هست .

  18. #58

    نقل قول: آموزش برنامه نویسی OOP

    نقل قول نوشته شده توسط hidensoft مشاهده تاپیک
    سلام
    چند وقتیه خدمت مجال نمی ده در کنار برو بچس باشم

    به نظر من OOP مستقیما برای بالا بردن امنیت نیست ، بلکه برای بالا بردن قدرت مانور ، سرعت توسعه ، افزایش خوانایی بوده ، جلوگیری از تکرار کد بوده.

    وقتی شما اسکریپت های غیر OOP و OOP رو با هم مقایسه کنید در اولین نگاه متوجه می شید که گسترش برنامه های غیر OOP خیلی سخت تر از OOP است . اما در هر دو امکان وجود حفره های امنیتی هست ، پس نمی شه گفت لزوما استفاده از OOP به معنای بالا بردن امنیت است . وقتی یکم دقیق بشید روی اسکریپت های خیلی بزرگ که از OOP استفاده می کنند می بینید که چقدر قدرت گسترشش بالاست (در مقایسه با اسکریپت های غیر OOP) .
    اما اینکه استفاده از Protect یا Privat باعث افزایش امنیت می شه یا نه !

    بستگی به این داره که نگاه شما نسبت به امنیت چیه ! پروژه شما چه امنیتی نیاز داره ، واقعا عدم استفاده از Protect باعث ایجاد حفره امنیتی میشه ؟

    به نظر من استفاده از Protect و ... مانند انجام دادن اعمال مستحبه ، توی این 40 .. 50 پروژه ای که انجام دادم هیچ وقت عدم استفاده از گذینه های بالا باعث ایجاد حفره امنیتی نشده و هیچ وقت هم نمی شه ، چرا که استفاده از این گذینه ها فقط برای راحتی کار برنامه نویس هست نه بالا بردن امنیت .

    امنیت یعنی منطق برنامه نویسی شما !

    به نظر من بهتره یکم به مسائل با نگاه باز تری نگاه کنید.





    فکر نمی کنم .. مقاله یا یه مطلب رسمی برای اثباتش نیاز هست .
    اول از همه خوشحالم که سر زدی
    در موردش یه نکته توی کتاب php5 power progrmming بیان شده با این عنوان
    php is not java
    من یادمه یه مقاله خیلی خوب در موردش خوندم االان که دو دقیقه ای دارچ سرچ می کنم گیرش نمیارم
    اما یه لینک دیگه دارم که در مورد oop در php مطالب مفیدی رو گفته
    http://www.raditha.com/blog/archives/000476.html

  19. #59
    کاربر تازه وارد آواتار OCTAGON
    تاریخ عضویت
    تیر 1385
    محل زندگی
    زیر گنبد کبود
    پست
    39

    نقل قول: آموزش برنامه نویسی OOP

    دوستان می خواهم یک سئوال بکنم که لطف فرمائید من را که در زمینه OOP نا آشنا هستم را کمی روشن کند
    من تا اینجا فهمیدم که می توانیم برای اطلاعات خودمان که مثلا اگر اطلاعات دانشگاه هست شی های مختلف بسازیم
    ولی آیا می توان مفهوم شی گرایی را در خواندن اطلاعات از دیتابیس و نمایش آنها ویرایش یا حذف یا اضافه نمودن هم بفرمائید
    منظورم اینست که شی گرایی در این مراحل چه نقشی دارند.

  20. #60

    نقل قول: آموزش برنامه نویسی OOP

    اولن سلام به همه دوستان و استادان ارجمند

    بعد از خوندن اينهمه پست موندم چي بگم ... مبحث با چي شروع شد وبه كجا كشيده شد!
    نظر خودم رو اگه بخوام در رابطه با اين بحث ها بگم بايد متذكر شم كه برنامه نويسي شعي گرا براي پي اچ پي درست نشده كه اينجوري به جون هم افتاديد و يه گروه هي كد ها رو زند ميكنه اونيكي ديزنند ميكنه ... برنامه نويسي شعي گرا يه معقوله جدايي است كه تو اكثر زبانهاي برنامه نويسي سطح بالا استفاده شده و ميتونه توي يه اپليكيشن وب و يا يه وبسايت استفاده شه يا تو يه برنامه ويندوز يا ... دوستان بايد توجه كنند كه اين خاصيت ها به دليل قشنگي و زيبايي در نظر گرفته نشده و علت به وجود اومدن هركدومشون احساس نيازيه كه بهشون شده ... در نظر بگيريد كه تو اپليكيشني يه متغير به عنوان فلگ كه نمايانگر دسترسي مديريت هست كه با ورود اعضاع به 0 يا 1 با توجه به دسترسي كاربر تغيير ميكنه حالا اگه قرار باشه هر پلاگيني كه به اپليكيشن اضافه ميشه بتونه اين فلگ رو تغيير بده كه ديگه ... ميشه هزاران مثال ديگه كه موجب به وجود اومدن نياز به اين خواص شده زد ولي توصيه ميشه به جاي اينكه دنبال دليلي براي زير سوال بردن اين موارد باشيد يكم در مورد علت به وجود اومدنشون فكركنيد .

    نقل قول نوشته شده توسط OCTAGON مشاهده تاپیک
    دوستان می خواهم یک سئوال بکنم که لطف فرمائید من را که در زمینه OOP نا آشنا هستم را کمی روشن کند
    من تا اینجا فهمیدم که می توانیم برای اطلاعات خودمان که مثلا اگر اطلاعات دانشگاه هست شی های مختلف بسازیم
    ولی آیا می توان مفهوم شی گرایی را در خواندن اطلاعات از دیتابیس و نمایش آنها ویرایش یا حذف یا اضافه نمودن هم بفرمائید
    منظورم اینست که شی گرایی در این مراحل چه نقشی دارند.
    دوست عزيز شما شعي گرايي مزاياي زيادي داره كه دوستان در پست هاي قبلي خيلي از اونا رو عنوان كردن. مانند توسعه سريع تر و راحت تر، جلوگيري از تكرار، نگهداري آسانتر، قابليت استفاده مجدد و ... در مورد سوال شما بايد بگم كه شئي گرايي ميتونه خيلي كار شما رو راحت تر كنه و سرعت برنامه نويسيتون رو بالاتر ببره و توسعه سيستم رو راحت تر كنه ، مثلا 2 قطعه كد زير را مقايسه كنيد :


    $link = mysql_connect($host, $user, $pass);
    $query = sprintf("SELECT `name`
    FROM `users`
    WHERE `username` = '%s'",
    mysql_real_escape_string($username));
    $Result = mysql_db_query($dbname, $query, $link);
    if($Row = mysql_fetch_array($Result))
    echo $Row['name'];



    echo $user->fetchName("username={$username}");


    شما به عنوان نفر سوم كدوم رو راحت تر متوجه ميشي ؟؟ فكر كن تو يه صفحه صدها خط كد مشابه كد اول بايد نوشته شه و اگه از شعي گرايي استفاده بشه چقدر كمتر ميشه حجم كدها و ... كلي مزيت ديگه ميشه پيدا كرد از اين مقوله شي گرايي

  21. #61
    کاربر تازه وارد آواتار OCTAGON
    تاریخ عضویت
    تیر 1385
    محل زندگی
    زیر گنبد کبود
    پست
    39

    نقل قول: آموزش برنامه نویسی OOP

    با تشکر از دوست عزیز PARSAJAX

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

    با تشکر
    امیر

  22. #62

    نقل قول: آموزش برنامه نویسی OOP

    واقعا از همه ممنونم تا اینجا خیلی مفید بود .

    این اولین بحث در مورد oop بود که می بینم داره به یه جایی میرسه .

  23. #63

    نقل قول: آموزش برنامه نویسی OOP

    مباحثی مثل کپسوله بندی ،سازنده ، شی ، در زبانهای مختلف شبیه به هم هستند


    جالبترین و خنده دارترین مقاله شی گرایی!
    - مفاهیم پایه شی گرایی:
    http://amir87.persiangig.com/documen...ct%20class.pdf

    پیاده سازی Polymorphism در PHP :

    http://amir87.persiangig.com/document/Polymorphism.pdf

    یک مقاله مفید دیگر :

    ایجاد یک CMS با استفاده از PHP شی گرا:

    http://amir87.persiangig.com/documen...OOP%20_CMS.pdf

    http://estakhrian.blogfa.com

  24. #64

    نقل قول: آموزش برنامه نویسی OOP


    سلام دوستان.
    چند روزي در خدمت شما هستم ، اميد وارم که تو اين مدت بتونم باز هم به برنامه نويس هاي ايراني کمک کنم.

    Propel يک Object Relational Mapping يا همون ORM هست.
    حتما پيش خودتون مي گيد که چه فايده اي داره که من از Propel استفاده کنم. بايد بگم شما با استفاده از Propel که يک فريم ورک بسيارکار آمد براي برقراري ارتباط با ديتابيس هست تمام پايگاه داده خودتون رو بصورت کلاس در مياريد و از همه مهم تر شما مي تونيد به پايگاه هاي داده MySQL, MS SQL Server, PostgreSQL, SQLite, Oracle وصل بشيد.

    شما در Propel ديگه نيازي نداريد که براي ساخت database به phpmyadmin يا هر ابزار ديگه اي وصل بشيد.
    اطلاعات ديتا بيس بصورت کد XML ذخيره مي شن و پروپل خودش ديتابيس رو مي سازه
    براي مثال
    کد HTML:
    <database name="bookstore" defaultIdMethod="native">
      <table name="book">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="title" type="varchar" size="255" required="true" />
      </table>
      <table name="author">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="first_name" type="varchar" size="128" required="true"/>
        <column name="last_name" type="varchar" size="128" required="true"/>
      </table>
    </database>
    سپس کافيه تا دستور زير رو در command prompt اجرا کنيد

    > propel-gen /path/to/bookstore


    حالا ديتابيس ساخته شده و پروپل از هر تيبل يک شي مي سازه به عنوان مثال براي جدول book دو فايل ايجاد مي کنه :
    bookstore/Book.php
    bookstore/BookPeer.php

    فايل اول کلاس book هست که به BookPeer ارجاء داده شده . BookPeer تمام کلاسي هست که پروپل مي سازه و Book براي اين ايجاد مي شه که شما اگر نيازي داشتيد که فانکشني اضافه کنيد اينجا اضافه کنيد.

    حالا نوبت به اين مي رسه که دستورات Create, Retrieve, Update, Delete رو اجرا کنيم

    جدول author رو در نظر بگيريد. براي Create کافيه که
    $author = new Author();
    $author->setFirstName("Jack");
    $author->setLastName("London");
    $author->save();

    دقيقا اين کد در پشت پرده اجرا مي شه
    INSERT INTO author (first_name, last_name) VALUES ('Jack', 'London');


    ديديد که به چه راحتي مي تونيد اطلاعات رو اضافه کنيد . اگر دقت کرده باشيد براي اينکه مقداريبه فيلدي بديد کافيه
    $TableName->setFieldName("value")

    در نهايت هم دستور
    $TableName->save()

    اطلاعات جدول رو ذخيره مي کنه .

    براي Retrieve

    $firstBook = BookPeer::retrieveByPK(1);
    // now $firstBook is a Book object, or NULL if no match was found.

    حالا اگه شما چند Primary Key داشته باشيد
    $selectedBooks = BookPeer::retrieveByPKs(array(1,2,3,4,5,6,7));


    براي Update

    // 1) Fetch an object by primary key

    $myBook = BookPeer::retrieveByPK(1);

    // 2) update the values & save() it.

    $myBook ->setTitle("War & Peace");
    $myBook->save();


    براي DELETE
    $book = BookPeer::retrieveByPK(1);
    BookPeer::doDelete($book);


    خب حتما پيش خودتون مي گيد من چطوري کوئري دلخواه خودمو بزنم ؟ راهشش Criteriaهست.
    به عنوان مثال
    $c = new Criteria();
    $c->add(AuthorPeer::FIRST_NAME, "Karl");
    $c->add(AuthorPeer::LAST_NAME, "Marx", Criteria::NOT_EQUAL);

    $authors = AuthorPeer::doSelect($c);

    اين دستور SQL رو اجرا مي کنه
    SELECT ... FROM author WHERE author.FIRST_NAME = 'Karl' AND author.LAST_NAME <> 'Marx';


    البته Criteria خيلي پيچيده تر از اين کد سادست که ديديد.
    حالا شايد شما خواستيد که يک دستور SQL رو وارد کنيد بايد چيکار کنيد ؟
    <?php

    $con = Propel::getConnection(DATABASE_NAME);

    $sql = "SELECT books.* FROM books WHERE NOT EXISTS (SELECT id FROM review WHERE book_id = book.id)";
    $stmt = $con->createStatement();
    $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM);

    $books = BookPeer::populateObjects($rs);


    همونطور که مي بينيد تمامي امکانات مورد نياز براي زدن کوئري در اختيار شما هست.

    پيشنهاد مي کنم حتما يک بار تجربه کنيد ، احتمال زيادي مي دم که شما هم مثل من مجذوب قدرت و امنيت اين فريم ورک مي شيد.

    موفق و پيروز باشيد

  25. #65
    کاربر تازه وارد
    تاریخ عضویت
    شهریور 1387
    محل زندگی
    شهریار
    پست
    73

    نقل قول: آموزش برنامه نویسی OOP

    سلام ، ممنون که رو این تاپیک وقت گذاشتید، یه سوال داشتم. می خواستم ببینم میشه داخل یک اسکریپت پی اچ پی به متغیر های سراسری خارج از کلاس از داخل کلاس دسترسی داشت؟

  26. #66
    کاربر دائمی آواتار zoghal
    تاریخ عضویت
    شهریور 1383
    محل زندگی
    همدان
    سن
    41
    پست
    401

    نقل قول: آموزش برنامه نویسی OOP

    اگر متغییر خارج از کلاس به صورت global تعریف شده باشه، تو کلاس و در متد ها هم میتونید این متغییر رو استفاده کنید.
    ولی کلا بی معنی هست این کار
    آخرین ویرایش به وسیله zoghal : جمعه 18 اردیبهشت 1388 در 08:59 صبح

  27. #67

    نقل قول: آموزش برنامه نویسی OOP

    از دوست عزیزم zoghal تشکر می کنم که به این تاپیک پاسخ دادند.
    لطفا سوال هایی که مربوط به مسائلی غیر از شی گرایی هست رو در انجمن بپرسید ، سریع تر پاسخ داده می شه.

    از تمامی دوستانی که قادر هستند آموزش OOP یا مسائل مربوطه بدهند خواهش می کنم در اینجا آموزش هاشون رو در اختیار دیگران قرار بدند. من در حال حاضر در حال انجام خدمت سربازی هستم نمی تونم به این تاپیک برسم . از دوستانی که تا به امروز کمک کردند هم تشکر می کنم .

    موفق و پیروز باشید.

  28. #68

    نقل قول: آموزش برنامه نویسی OOP

    سلام دوستان،
    میشه لطف نموده این کلاس جستجو را انعطاف پذیر درست نمایند، یعنی بشه برای چند جدول کار نماید و هم چنان فیلد قسمت رابطه ...

    چون فعلا برای یک جدول کار مینماید

    نقل قول نوشته شده توسط hidensoft مشاهده تاپیک
    ساخت یک موتور جستو جو گر سریع و کارآمد یکی از دق دقه های یک برنامه نویسه ، من حتی قبل از اینکه یک پروژه رو شروع کنم روس سرچ فکر می کنم . .. امروز یک کلاس بسازیم که به سریع ترین وجه ممکن و به بهترین نحوه به ما جواب مورد نظرمون رو بده ، از همه مهم تر اصولی باشه و قابل ارتقاع و سفارشی باشه ..

    class.search.php

    <?php

    class search_engine
    {
    function search_engine($mysql)
    {
    # set database connection
    $this->host = $mysql[0];
    $this->username = $mysql[1];
    $this->password = $mysql[2];
    $this->database = $mysql[3];
    $this->link = mysql_connect($this->host,$this->username,$this->password) or die(mysql_error());
    $this->db_selected = mysql_select_db($this->database,$this->link) or die(mysql_error());
    $this->found = array();
    }
    function set_table($table)
    {
    # set table
    $this->table = $table;
    }
    function set_keyword($keyword)
    {
    # set keywords
    $this->keyword = explode(" ", $keyword);
    }
    function set_primarykey($key)
    {
    # set primary key
    $this->key = $key;
    }
    function set_fields($field)
    {
    # set fieldnames to search
    $this->field =$field;
    }
    function set_dump()
    {
    # var dump objects
    echo '<pre>';
    var_dump($this->found);
    echo '</pre>';
    }
    function set_total()
    {
    # total results found
    return sizeof($this->found);
    }
    function set_result()
    {
    # find occurence of inputted keywords
    $key = $this->key;
    for ($n=0; $n<sizeof($this->field); $n++)
    {
    for($i =0; $i<sizeof($this->keyword); $i++)
    {
    $pattern = trim($this->keyword[$i]);
    $sql = "SELECT * FROM ".$this->table." WHERE `".$this->field[$n]."` LIKE '%".$pattern."%'";
    $result = mysql_query($sql);
    while ($row = mysql_fetch_object($result) AND !empty($pattern))
    {
    $this->found[] = $row->$key;
    }
    }
    }
    $this->found = array_unique($this->found);
    return $this->found;
    }
    }
    ?>
    process.php

    <?php

    require_once 'class.search.php';

    $config = array('localhost','root','','database');
    $table = 'bizmain';
    $key = 'biz_id';
    $fields = array('biz_name','biz_address','biz_cat');

    $keyword = $_POST['keyword'].' '.$_POST['location'];

    $found = new search_engine($config);
    $found->set_table($table);
    $found->set_primarykey($key);
    $found->set_keyword($keyword);
    $found->set_fields($fields);

    $result = $found->set_result();
    print_r($result);

    ?>
    form.php

    <form method=post action=process.php>
    <table border=1>
    <tr>
    <td>Search by name, category or keywords</td>
    <td><input name=keyword></td>
    </tr>
    <td>&nbsp;</td>
    <td><input type=submit value=Submit></td>
    </table>
    </form>
    sql

    CREATE TABLE `bizmain` (
    `biz_id` mediumint(8) unsigned NOT NULL auto_increment,
    `biz_name` varchar(100) default NULL,
    `biz_address` varchar(255) default NULL,
    `biz_phone` varchar(100) default NULL,
    `biz_email` varchar(100) default NULL,
    `biz_url` varchar(100) default NULL,
    `biz_cat` varchar(100) default NULL,
    PRIMARY KEY (`biz_id`)
    ) ;

    INSERT INTO `bizmain` (`biz_id`, `biz_name`, `biz_address`, `biz_phone`, `biz_email`, `biz_url`, `biz_cat`) VALUES (1, 'LocalFilipino.com', 'Makati, Philippines', '(632) 848-0886', 'info@localfilipino.com', 'http://www.localfilipino.com', 'Advertising'),
    (2, 'Liberty Realty', '2451 S. Buffalo Drive, Suite 145, Las Vegas, NV 89117', '(702) 248-8899', 'info@libertyrealty.com', 'http://www.libertyrealty.com', 'Real Estate, Realty'),
    (3, 'FRS Philippine Freight', '5960 Spring Mtn Rd, 3-D<br> Las Vegas, NV 89146', '(702) 253-7555', 'info@frsphilippines.com', 'http://www.frsphilippines.com', 'Freight, Cargo');

    Output

    ضمیمه 14312

  29. #69

    نقل قول: آموزش برنامه نویسی OOP

    خيلي ممنون از مطالب مفيد كه گذاشتيد
    اگر ميشه ادامش بديد

  30. #70
    کاربر دائمی آواتار omid_safari
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    رشت
    پست
    126

    نقل قول: آموزش برنامه نویسی OOP

    سلام دوستان
    من براي ايجاد كلاسهاي تودرتو مشكل دارم.
    بدون استفاده از وراثت و غيره... فقط ميخوام يك كلاس a تعريف كنم و در كلاس b يك يا چند تا شيي a داشته باشم.
    ممنون

  31. #71
    کاربر جدید
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    قم
    پست
    23

    Wink نقل قول: آموزش برنامه نویسی OOP

    oop هم برای خود عالمی داره ها خیلی شیرینه
    دوستان ما در پی اچ پی همون طور که میدونیم نمی تونیم برای یک کلاس بیش از یک والد داشته باشیم آیا می شه برای حل این مشکل از این روش استفاده کرد که
    کلاس اول والد کلاس دوم باشه و کلاس دوم وارلد کلاس سوم
    1.آیا در این صورت اشیا کلاس سوم از کلاس اول توابع و متغییر هاشون را ارث می برند؟
    2.ایا میشه از توابع اون و متغییر هاش در کلاس سوم استفاده کرد اگر میشه روشش چیه ؟

  32. #72

    نقل قول: آموزش برنامه نویسی OOP

    نقل قول نوشته شده توسط omid_safari مشاهده تاپیک
    سلام دوستان
    من براي ايجاد كلاسهاي تودرتو مشكل دارم.
    بدون استفاده از وراثت و غيره... فقط ميخوام يك كلاس a تعريف كنم و در كلاس b يك يا چند تا شيي a داشته باشم.
    ممنون
    فکر کنم باید از implements استفاده کنید (البته فقط در PHP5)
    class b implements a {
    ....
    }
    آخرین ویرایش به وسیله امیـرحسین : چهارشنبه 07 مرداد 1388 در 03:07 صبح

  33. #73

    نقل قول: آموزش برنامه نویسی OOP

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

    بریم سر اصل مطلب

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

    کلیه متود های جادویی PHP اینها هستن.

    __construct
    __destruct
    __call
    __callStatic
    __get
    __set
    __isset
    __unset
    __sleep
    __wakeup
    __toString
    __invoke
    __set_state
    __clone

    در ابتدا خودم construct و destruct رو بطور کامل توضیح دادم. توی تاپیک ها دیدم دوستان زحمت get و set رو هم کشیدن که بازم ازشون تشکر می کنم. حالا شروع می کنم به توضیح دادن یکی این متود های جادویی

    toString

    همونطور که مشخص هست متود toString برای گرفتن خروجی بصورت رشته یا همون متن هست.
    کارش سادست و فکر نمی کنم زیاد جای بحث داشته باشه.
    یه مثال می زنم.

    <?php

    class TestClass
    {
    public $foo;

    public function __construct($foo) {
    $this->foo = $foo;
    }

    public function __toString() {
    return $this->foo;
    }
    }

    $class = new TestClass('Hello');
    echo $class;
    ?>


    خروجی
    Hello


    توضیحات خطی
    class TestClass

    کلاسی با نام TestClass شاخته می شه
      public $foo;

    متغیر foo$ بصورت public تعریف می شه. ** قبلا دوستان در مورد public و private و ... توضیحات لازم رو دادن.
      public function __construct($foo) {
    $this->foo = $foo;
    }

    همونطور که گفته شد متود سازنده (construct) بعد از ارجاء متغیر به کلاس به صورت خود کار اجرا می شه و تمامی آرگمانهای این متود رو شما هنگام ساخت باید به کلاس بدید.
    متغیر foo$ رو مساوی با مقدار آرگمان foo$ این تابع قرار می ده. سعی کنید هم نام بودن توابع شما رو گول نزنه. توجه کنید که متغیر های داخل توابع اگر که هم نام با متغیر های کلاس باشند به هیج وجه با هم مرتبت نیستند.
    public function __toString() {
    return $this->foo;
    }

    اینجا با متود جادویی toString تعریف می کنیم که در صورت که خروجی متنی درخواست بشه محتوای foo$ این کلاس به خروجی بره.
    $class = new TestClass('Hello');

    شعی class$ به کلاس TestClass ارجاء داده می شه و آرگمان اول هم رشته "Hello" مقدار دهی میشه.
    echo $class;

    به خط بالا دقت کنید. از شعی class$ در خوست خروجی متنی می شه. در واقع PHP با رسیدن به این دستور تابع toString کلاس رو فراخوانی می کنه.
    echo $class->__toString();


    در نهایت "Hello" برای خرجی فرستاده می شه و چاپ می شه. البته این توضیح رو هم اضافه می کنم که شما نباید حتما از دستور echo استفاده کنید تا این متود اجرا بشه بلکه می تونید به یک متغیر هم ارجاء بدید. به عنوان مثال
    $myVar =  $class;

    در واقع هرگاه در خواست خروجی به سورت مستیقیم از شعی ارجاء داده شده بشه این تابع اجرا می شه.

    امید وارم مورد استفاده قرار بگیره.

    موفق باشید.

  34. #74
    کاربر تازه وارد آواتار Cyletech
    تاریخ عضویت
    شهریور 1388
    محل زندگی
    شهر جدید هشتگرد
    سن
    32
    پست
    86

    نقل قول: آموزش برنامه نویسی OOP

    ممنون از همتون
    آخرین ویرایش به وسیله Cyletech : جمعه 13 شهریور 1388 در 15:38 عصر

  35. #75
    کاربر دائمی آواتار mahmood3d
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    همه جای ایران سرای من است
    پست
    334

    نقل قول: آموزش برنامه نویسی OOP

    سلام
    قبلا از ارسال این پست و ایجاد مطلب اضافی از همتون عذر می خوام.
    من تا به امروز حدود 4 سال بود که برنامه نویسی می کردم و توی مدرسه و دانشگاه هم در بخش شیء گرایی چیزی که به ما گفته میشد یک چیز تئوری بود که هیچ ربطی به برنامه نویسی نداشت و من همیشه از این بخش هیچ چیزی متوجه نمیشدم و از برنامه های نوشته شده به صورت شیء گرایی هم چیزی نمی فهمیدم.
    من به تازگی این تاپیک رو دیدم و از نویسنده این مطالب که خیلی ساده و روان دارند این موضوع رو پیش می برند و از مدیران که این تاپیک رو جزو تاپیکهای برتر این انجمن قرار دادن کمال تشکر رو دارم و تقاضا دارم که این موضوع ادامه داشته باشه و مرحله به مرحله و با مثال های گوناگون این آموزش رو ادامه بدین. چون فکر می کنم این مطلب یکی از دغدغه های مهم بچه های کامپیوتر مخصوصا برنامه نویس ها باشه که تا الان چیزی از شیء گرایی نمی دونن.

    ممنون از زحماتی که می کشین

  36. #76
    کاربر جدید آواتار mahyar13652000
    تاریخ عضویت
    آبان 1387
    محل زندگی
    کرج
    سن
    37
    پست
    4

    نقل قول: آموزش برنامه نویسی OOP

    منم از محمد عزیز تشکر می کنم که این همه برای این کار وقت گذاشته

    خسته نباشید گل پسر

  37. #77

    نقل قول: آموزش برنامه نویسی OOP

    invoke__


    متود جادویی invoke زمانی فراخوانی می شه که شما از یک کلاس مانند یک تابع استفاده کنید.
    به عنوان مثال :
    <?php
    class CallableClass {
    function __invoke($x) {
    var_dump($x);
    }
    }
    $obj = new CallableClass;
    $obj(5);
    var_dump(is_callable($obj));
    ?>
    خیلی سادست فقط اگه دوستان در مورد is_callable مشکل دارند باید بگم این تابع چک می کنه که آیا این پارامتر ارجا داده شده قابل فراخوانی هست یا نه . برای اطلاعات بیشتر متونید به منوال مراجعه کنید.

    توجه توجه : این متود جادویی فقط در PHP 5.3 به بالا قابل اجراست

  38. #78

    نقل قول: آموزش برنامه نویسی OOP

    دست همتون درد نکنه خیلی خوب بود

  39. #79
    کاربر دائمی آواتار famarini
    تاریخ عضویت
    شهریور 1387
    محل زندگی
    تهران
    پست
    137

    نقل قول: آموزش برنامه نویسی OOP

    سلام
    لطفا مباحث را ادامه دهيد
    با تشكر از همه دوستان

  40. #80
    کاربر دائمی آواتار sonixax
    تاریخ عضویت
    بهمن 1388
    محل زندگی
    هامبورگ - آلمان
    پست
    100

    نقل قول: آموزش برنامه نویسی OOP

    این Parent:: دقیقا چه میکند ؟ کلاسی که Function توش هست رو بر میگردونه ؟

    اینم یک توضیحی برام بدید ممنون میشم که دقیق چی کار میکنه :

    class myclass extends yourclass
    {}
    آخرین ویرایش به وسیله sonixax : پنج شنبه 13 اسفند 1388 در 00:41 صبح

صفحه 2 از 5 اولاول 1234 ... آخرآخر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •