<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Mohsen Nikoei</title><link>https://virgool.ir/feed/@mohsen.nikoei</link><description></description><language>fa</language><pubDate>2026-11-11 11:16:24</pubDate><image><url>https://files.virgool.ir/upload/users/71939/avatar/iPkWDB.png</url><title>Mohsen Nikoei</title><link>https://virgool.ir/@mohsen.nikoei</link></image><item><title>فلسفه Vibility در OOP</title><link>https://virgool.ir/@mohsen.nikoei/فلسفه-vibility-در-oop-eg1rtuznvge3</link><description>خب احتمالا همه میدونید که توی class سه تا سطح دسترسی به متدا یا فیلدا داریم :privateprotectedpublicحتما میدونید که پروپرتی که private باشه یعنی مال خود اون کلاسه  هیچکس نمیتونه ارث بری کنه اونو از اون کلاس و یا خارج از کلاس فراخوانیش کنه  , protected هم جوریه که میشه ارث بریش کرد ولی خارج از متدای کلاس نمیشه فراخوانیش کرد , public  هم که خود اسمش گویاس,  هم ارث بری میشه هم همه جا قابل فراخوانیه .+ بله !- خب کسی میدونه اینا کاربردشون چیه مثلا private به چه دردی میخوره؟ + واسه اینکه کسی نتونه ارث بری کنه یا بیرون از کلاس فراخوانیش کنه !- بعله این سازو کارشه من سوالم اینه که اومده چه مشکلی روحل کنه ؟+ اینکه کسی نتونه ارث بریش کنه و یا خارج از کلاس ازش استفاده کنه !-این &#34;کسی&#34; که میگی بلاخره یه دولوپره دیگه که داره رو اون کدا کار میکنه میتونه راحت تغییر بده به public  و استفاده کنه .+خب بخاطر امنیت !-اگه کسی بتونه با یه راهی از راه دور دست تو کدا ببره وقتی پروژه رو پروداکشن هست(تقریبا غیر ممکنه) دیگه اینا معنی نداره که همه چی قابل تغییر هست.+ پس برای چیه ؟ اگر تمام پراپرتی هایی که public نیستن به public تغییر داده بشن هیچ مشکلی تو کدا از لحاظ عملکرد پیش نمیاد , visibility فقط برای روشن کردن تکلیف پروپرتی هاست برای دولوپرا که هم کد رو بهتر بفهمن و هم بهتر دولوپ کنن چه توسط خودشون چه دولوپرای دیگه , فرض کن یه کلاس داری با کلی پروپرتی و از این کلاس کلی کلاس دیگه ارث بری میکنن , وقتی به این کد نگاه میکنی و یه سری پروپرتی private میبینی میفهمی که اون پروپرتیا فقط توی اسکوپ این کلاس یعنی توی متدای این کلاس استفاده شدن , نه بیرون از این کلاس و نه توی کلاسایی که ازش ارث بری کردن , پس تا حدودی تکلیف این پروپرتی برای دولوپری که داره کد رو تحلیل میکنه روشن میشه و در نتیجه هم بهتر میفهمه چی به چیه هم یه جورایی یه قراردادیه برای اون کدا که چطور توسعه داده بشن, و یا مثلا یه پروپرتی protected میبینه میفهمه که این ممکنه توی کلاسایی که ارث بری کردن استفاده شده باشه دیگه public هم مشخصه , visibility فقط واسه ی این اومده , بهتر کردن زندگی دولوپرا.* به private, protected, public ,ء  access modifiers هم میگن .پ.ن:نکته ای بود کامنت کنین ,امیدوارم مفید واقع شده باشه .</description><category>Mohsen Nikoei</category><author>Mohsen Nikoei</author><pubDate>Mon, 09 Mar 2020 13:58:29 +0330</pubDate></item><item><title>پترن Abstract Factory به زبان ساده</title><link>https://virgool.ir/@mohsen.nikoei/پترن-abstract-factory-به-زبان-ساده-i1pxsj7lwgkv</link><description>یکی از دیزاین پترنایی که معمولا دولوپرا تو فهمش مشکل دارن AFD یا همون Abstract Factory Design Pattern هستش تو این پرسش و پاسخ سعی کردم خیلی ساده این پتترنو توضیح بدم .خب قبلش باید Factory Pattern رو توضیح بدم که شاید از قبل میدونینش ولی بد نیست یه بار دیگه مرورش کنیم .+ کاربرد factory pattern چیه ؟ - توی OOP یه Factory ابجکتیه که ابجکتای دیگه رو میسازه !!+ چه نیازی هست به اینکار وقتی میتونیم هرجا خواستیم با new  ابجکت رو بسازیم !؟-دیگه با پیچیدگی های ساخت ابجکت درگیر نمیشیم !!+ چه پیچیدگی ؟- مثلا فرض کن یه ابجکت میخوای که کلی dependency داره , باید هر جا که اون ابجت رو بسازی و همه dependency هارو به عنوان پارامتر بهش بدی !+ خب اینکارو بکنیم - اینجوری هم اصل DRY بهم میخوره هم کدت کثیف میشه .بریم سراغ مثال , فرض کن میخوایم ابجکت از شکل های مختلف بسازیم تو برناممون , یه interface داریم که استراتژی shape رو تعریف میکنه تا کلاسای شکل هایی که ما میخوایم پیاده ش کنن . interface shape{&#xA;&#xA;        public function draw();&#xA;&#xA;}حالا مثلا یه کلاس میخوام واسه ساخت مربع :class Square2d implements shape{&#xA;       public function draw(){&#xA;              echo &#39;i am draw a square&#39;;&#xA;       }&#xA;}یه کلاس هم میخوام واسه ساختن یه دایره :class Circle2d implements shape{&#xA;      public function draw(){&#xA;            echo &#39;i draw a circle&#39;; &#xA;      }&#xA;}خب تا اینجا دوتا کلاس تعریف کردیم که هر کدوم ابجکت مخصوص خودشو میسازه حالا باید یه کلاس تعریف کنیم که اینارو بسازه واسه ما که میشه همون Factory .class Factory2d {&#xA;      public function createShape($shape){&#xA;              if($shape === &#39;square&#39;){&#xA;                     return new Square()&#xA;              }&#xA;       }&#xA;}خب اینم از factory ما . حالا اگر بخوایم مثلا یه ابجکت شکل مربع درست کنیم به این صورت عمل میکنیم :,$factory  = new Factory2d();&#xA;$shape = $factory-&gt;createShape(&#39;square&#39;);&#xA;$shape-&gt;draw();واسه ی دایره هم همینطور .+ خب این چه پیچیدگی ای رو کم کرد؟ خیلی ساده میتونستیم با new square2d() ابجکتمونو بسازیم .- این واسه مثال بود اگه square توی constructor ش شونصدتا دپندنسی میخواست چی ؟فقط یه بار توی متد createShape کلاس factory اینو تعریف میکردیم :if( $shape ===  &#39;square&#39; ){&#xA;    return new Square( dependency1 , denedency2 , dependency3 ......);&#xA;}بعد از این دیگه فقط هر دفه به square نیازی باشه فقط کافیه $factory-&gt;createShape(&#39;square&#39;);صدا زده بشه  .خب حالا بریم سراغ Abstract Factory .- پترن factory که بالا توضیح دادم تا یه جاهایی خوبه حالا فرض کن یه نوع شکل دیگه میخوایم که فرق میکنه باید چیکار کنیم ؟+ چه فرقی ؟- مثلا اینا اشکال ۲ بعدی بودن حالا ۳ بعدی میخوایم !+ خب کلاساشونو تعریف میکنیم دیگه مثلا اگر circle3D بخوایم که بازم همون اینترفیس shape رو پیاده میکنه اینکارو میکنیم ! class circle3D implements shape {&#xA;       public function draw(){&#xA;                 echo &#39; i am drawing a 3D circle&#39;;     &#xA;       }&#xA;} + بعد به متد create توی کلاس factory شرطشو اضافه میکنیم :class factory {&#xA;       public function createShape($shape){&#xA;                  if ($shape === &#39;square&#39;){&#xA;                           return new Square();&#xA;                   }else if($shape === &#39;circle&#39;){&#xA;                           return new Circle();&#xA;                   }else if($shape === &#39;circle3D&#39;){&#xA;                           return new circle3D();  &#xA;                   }&#xA;           }&#xA;   }+ حالا راحت ابجکتشو میسازیم با factory :$factory = new Factory() ;&#xA;$circle3D = $factory-&gt;createShape( &#39;circle3D&#39; );&#xA;$circle3D-&gt;draw();- نه این درست نیست ! اول اینکه شد همون simple factory دوم اینکه تمام logic روی توی یه factory میذاری که این باعث میشه کنترل روی هر خانواده از ابجکت ها سختتر بشه !+یعنی چی ابجکت های هم خانواده ؟-منظورم اینه که ابجکت هایی که از یه دسته نیستن ولی شبیه به همن مثلا تو این مثال ما اشکال 2D رو یه خانواده در نظر میگیریم و اشکال 3D رو یه خانواده ی دیگه ! + چیکار کنیم حالا ؟-دیگه اینجا چون یه خانواده دیگه از ابجکتا میخوایم دیگه نمیایم تو همون simple factory قاطی اشکال 2D قرار بدیم میایم factory هامون رو abstract میکنیم و برای هر خانواده از ابجکت ها یه factory درست میکنیم , و در نهایت جایی که میخوایم  ابجکت مد نظرمونو درست کنیم , اول مشخص میکنیم کدوم factory رو میخوایم بعد به اون فکتوری میگیم چه ابجکتی رو میخوایم  . باید برای هر نوع ابجکت یه factory مجزا باشه .بعد همه این factory ها هم از یه abstract class به عنوان abstractFactoy یا هرچی که استراتژی factory هارو تعریف میکنه , ابسترکت میشن . دقت کن که توی Simple Factory این abstract class رو نداشتیم چون یه دونه factory بیشتر نداشتیم که کارش فقط ساختن یک مدل ابجکت بود , ولی اینجا چون factory های مجزا هستن و هرکدوم یه خانواده از ابجکتارو میسازن ولی استراتژیشون یکی هست , همشون از یه abstract class ابسترکت میشن .خب اول abstract class رو تعریف میکنیم :abstract class abstractFactory{&#xA;      public function createShape();&#xA;}+چرا اینترفیس استفاده نکردیم ؟ -میتونی استفاده کنی ولی چون این factory ها کارشون شبیه به همه و ممکنه متد های مشترکی از لحاظ پیاده سازی داشته باشن پس بهتره abstract class استفاده کنی چون توی interface پیاده سازی نداریم.حالا یه factory واسه اشکال 2D که تعریف میکنیم که این abstractFactory رو پیاده میکنه :class Factory2d extends abstractFactory {&#xA;       &#xA;       public function createShape($shape){&#xA;             if ($shape === &#39;square&#39;){&#xA;                    return new Square2d(); &#xA;              }else if($shape === &#39;circle&#39;){&#xA;                    return new Circle2d();&#xA;              }&#xA;      }&#xA; }یکی هم واسه 3d :class Factory3d extends abstractFactory {&#xA;       &#xA;       public function createShape($shape){&#xA;             if ($shape === &#39;square&#39;){&#xA;                       return new Square3d(); &#xA;                 }else if($shape === &#39;circle&#39;){&#xA;                        return new Circle3d();&#xA;                }&#xA;      }&#xA;      &#xA;}حالا میریم سراغ Factory Producer : +  چی هست ؟- اون متد یا فانکشن یا ابجکتی که این factory هارو میسازه ! یعنی جریان اینجوریه که به Factory Producer میگیم factory چیزی که میخوایم رو بساز , مثلا میگی factory  شکلای 2d رو میخوام, اونم بهت Factory2d رو برمیگردونه دیگه هرشکل 2D که میخوای با اون میسازی.function producer($shapeType){&#xA;   &#xA;        if($shapeType === &#39;2D&#39; ){&#xA;                return new Factory2d();&#xA;        }else if ($shapeType === &#39;3D&#39;){&#xA;                return new Factory3d(); &#xA;        }&#xA;} حالا دیگه تو برنامه ت اینجوری استفاده میکنی , مثلا میخوام تو برنامم میخوام یه مربع بسازم :$factory = producer(&#39;2D&#39;) ; &#xA;$square = $factory-&gt;createShape(&#39;square);&#xA;$square-&gt;draw();یا مثلا دایره سه بعدی میخوام یا همون کره :$factory = producer(&#39;3D&#39;) ;  &#xA;$square = $factory-&gt;createShape(&#39;circle&#39;);&#xA;$square-&gt;draw();دتس ایت و دیگر هیچ ...نظری داشتین, چیزی کم و کسر بود لطفا کامنت کنین ...</description><category>Mohsen Nikoei</category><author>Mohsen Nikoei</author><pubDate>Sat, 09 Nov 2019 17:33:31 +0330</pubDate></item><item><title>مفهوم Early Binding و Late Binding  در PHP</title><link>https://virgool.ir/@mohsen.nikoei/مفهوم-early-binding-و-late-bindings-در-php-pobf0d5y1kwe</link><description>با مثال شروع میکنم !توی این کد همون طور که میبینی کلاس Bar از کلاس Foo ارث بری کرده , پس من اگر از کلاس Bar یه اینستنس بگیرم و متد getName رو صدا بزنم خروجی باید این باشه :this is barاینجوری :+خب , early binding کجاشه ؟ :)وقتی یه متد non-static صدا زده میشه و یا از فیلدای non-static استفاده میشه , اون متدا یا فیلدا همیشه به ابجکتی بستگی دارن که صداشون میزنه  , مثلا اینجا کامپایلر اول سینتکس رو چک میکنه میبینه ابجکت Bar متد getName رو صدا زده پس اینجا دیگه فیلد name رو از Foo نمیگیره بلکه از Bar میگیره چون ابجکتی که getName رو صدا زده Bar هستش.همینو بهش میگن early binding یعنی کامپایلر زمان کامپایل ابجکت رو چک میکنه و فیلدای اون ابجکت رو به متدی که داره صدا میزنه bind میکنه , اگه ابجکت اون فیلدارو توی خودش نداشت از کلاس پدر میگیره .+ خب همیشه همینطوره !- نه ! زمانی که اون فیلدا static باشن موضوع فرق میکنه .+ میشه مثال بزنی .خب این از early binding که توضیح دادم , حالا همین داستان زمانی که متدا یا فیلدا static باشن فرق میکنه مثلا اگه تو همین کلاسا فیلدارو استاتیک کنیم : اینجا فیلد name رو static کردیم . میدونی که واسه پروپرتی های  static از متغیر this-&gt;propertyName استفاده نمیکنیم بلکه از self::propertyName استفاده میکنیم .حالا اگه از Bar اینستنس بگیریم و متد getName رو صدا بزنیم فکر میکنی چی نشون بده ؟ این دفه دیگه خروجی this is bar نیست بلکه this is foo هستش . چون که برای پروپرتی های static دیگه به ابجکت کلاسی که صداشون میزنه بستگی ندارن بلکه به کلاسی که توش تعریف شدن بستگی دارن .این یه معضلی بوده واسه php .+ چرا !؟چون که من اگر بخوام به name توی Bar دسترسی داشته باشم باید getName رو توی Bar دوباره تعریف کنم .+ خب تعریف کن .- به هزار و یک دلیل اینکار درست نیست.+ خب چرا پروپرتی های static به کلاسی بستگی دارن که توش تعریف شدن اگه اینجوری نبود الان مشکلی نبود :(چون که پروپرتی های استاتیک زمان run-time کنترل میشن یعنی زمانی که کامپایل شده و رفته و برنامه در حال اجراست , پس کامپایلر نمیتونه همون اول کار فیلدای کلاس Bar که همون name هستش رو به ابجکت Bar که داره getName  رو صدا میزنه bind کنه  .+ خب این زمان run-time داره به کلاسی getName توش تعریف شده رفرنس میده گفتی این قبلا یه مشکل php بوده اینو چجوری حلش کردن !؟برای حل این مشکل کیورد static رو وارد php کردن یعنی زمانی که بجای self از static استفاده بشه توی همون زمان run-time پراپرتی های کلاسی که داره متد رو صدا میزنه bind میشه ,به این دقت کن وقتی از self استفاده میکردیم پروپرتی های کلاسی که متد getName توش تعریف شده بود bind میشد .اگه بجای self از static استفاده کنیم : همونطور که میبینی که وقتی بجای self از static استفاده میکنیم , خروجی میشه this is bar یعنی پروپرتی های کلاسی که داره متد رو صدا میزنه bind شده , دقیقا عین زمان کامپایل شد .وقتی زمان compile-time کامپایلر سینتکس رو چک میکرد و پروپرتی هارو به ابجکت bind میکرد بهش چی می گفتیم ؟ + early bindingحالا پس اگه همون bind کردنِ زمان compile رو توی run-time انجام بدیم چی میشه ؟ + late binding ?آفرین ,  late static binding هم میگن بهش . </description><category>Mohsen Nikoei</category><author>Mohsen Nikoei</author><pubDate>Tue, 01 Oct 2019 12:54:59 +0330</pubDate></item></channel></rss>