Mohsen Nikoei
Mohsen Nikoei
خواندن ۳ دقیقه·۵ سال پیش

مفهوم Early Binding و Late Binding در PHP

با مثال شروع میکنم !


توی این کد همون طور که میبینی کلاس 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->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 هم میگن بهش .







phpbindingstaticearly bindinglate binding
شاید از این پست‌ها خوشتان بیاید