شی گرایی در php (قسمت چهارم)
در این مقاله قصد داریم تا مباحث زیر رو بررسی کنیم:
- stdClass
- class constants
- class functions
- Magic Methods
stdClass
اگر خاطر داشته باشید در زبان جاوا اسکریپت ما یک شی درست می کردیم و پس از آن مقادیر را برای شی set می کردیم . این امر در پی اچ پی به وسیله کلاس از پیش تعیین شده stdClass
امکان پذیر هست.
stdClass یه کلاس خالیه که میتونید متغیرهاتون رو بهش اضافه کنید.
<?php $person = new stdClass(); $person->name = 'abolfazl'; $person->nic_name = 'papi'; $person->job = 'computer_man'; print_r($person);
خوب بدین شکل ما یک متغیر پیشرفته تر از آرایه ها داریم . (یعنی یک شی) . خروجی به شکل زیر خواهد بود:
stdClass Object ( [name] => abolfazl [nic_name] => papillon [job] => computer_man [lvoe] => dont ask me about this is secret )
می تونید یک کلاس رو تعریف کنید و بعد بیاید و مقادیری رو براش set کنید . دقت داشته باشید به خروجی مثال زیر:
<?php class car{} $benz = new car(); $benz->wheel = 4; $benz->door = 2; $benz->model = 'c400'; print_r($benz);
خروجی کد زیر به شکل زیر خواهد بود :
car Object ( [wheel] => 4 [door] => 2 [model] => c400 )
نکاتی در رابطه با stdClass :
- دقت داشته باشید به وسیله تابع foreach می تونید به المنت های شی stdClass دسترسی داشته باشید.
- به وسیله stdClass شما می تونید آرایه ای از اشیا داشته باشید که این خیلی میتونه بهتون کمک کنه.
- دقت داشته باشید که ما مثل جاوا اسکریپت نمیتونیم که در stdClass متد تعریف کنیم.
ثوابت در کلاس ها
ما در کلاس هامون می تونیم از ثوابت زیادی استفاده کنیم که هر کدوم از اون ها مقادیری رو دارا هستند.
__CLASS__ : نام کلاس جاری
__METHOD__ : نام متد جاری
تابع clone برای اشیا
هرزمان که شما یک متغیر ساده تعریف می کنید (از نوع اولیه مثل عدد رشته و …) نام و مقدار مستقیما در حافظه stack ذخیره میشوند اما زمانی که متغیری از نوع شی می سازید اون به صورت یک اشاره گر به حافظه ذخیره میشه. کد زیر را در نظر بگیرید.
<?php class Person { public $id; public $fname; public $lname; function __construct($id, $fname, $lname) { $this->id = $id; $this->fname = $fname; $this->lname = $lname; echo "constructor is calling <br>"; } } $person1 = new Person(1, 'ala', 'sabagh'); //Person construct $person2 = $person1; echo $person1->fname . '<br>'; //ala $person2->fname = 'reza'; echo $person1->fname . '<br>'; //reza
زمانی که ما یک دو شی رو برابر قرار میدیم (با عملگر =) اون دو شی دقیقا به یک مکان از حافظه اشاره می کنند و عملا یکی هستند و با تغییر هرکدوم اون یکی دیگه هم تغییر میکنه.
برای حل این مساله از تابع clone استفاده می کنیم.
$person1 = new Person(1 , 'ala' , 'sabagh' ); $person2 = clone $person1; $person2->fname = 'reza'; echo $person1->fname . '<br>'; //ala echo $person2->fname . '<br>'; //reza
توابع زیادی در رابطه با کلاس ها در پی اچ پی داریم که به برخی از اون ها اشاره می کنیم:
class_existsc
: این که کلاسی وجود داره یا خیر (مثل function_exists) میشه برای اطمینان قبل از instance گرفتن از این تابع استفاده کنیم.
get_class
: اگر یک شی داشته باشیم و بخوایم نام کلاسشو بگیریم.(ورودی شی)
get_called_class
: فرض کنید که ما یه متد استاتیک داریم در دو کلاس که از هم ارث برده شده اند. خب در زمان فراخوانی متد استاتیک از کجا بفهمیم که این متد از کدوم کلاس فراخوانی شده ؟ باید از این تابع استفاده کنیم. به مثال زیر دقت کنید :
<?php class foo { static public function test() { var_dump(get_called_class()); } } class bar extends foo {} foo::test(); bar::test(); ?>
get_class_methods
: برای گرفتن تمامی متدهای یک کلاس.(ورودی کلاس)
get_class_vars
: برای گرفتن تمامی متغیر های نمونه یک کلاس.(ورودی کلاس)
get_declared_classes
: کل کلاس های تعریف شده در برنامه (این مورد خیلی به فهم نحوه کار برنامه کمک می کنه)
get_object_vars
: کل متغیرهای نمونه شی رو میده (ورودی شی).
is_a
: به وسیله این تابع می تونید بفهمید که یک شی از فلان کلاس هست یا خیر.
توابعی که گفته شد خیلی جاها که شما به عنوان نفر دوم وارد یه برنامه میشید خیلی میتونه بهتون کمک کنه تا کدهای نفر قبل رو بفهمید . اینجاست که میگیم کد نویسی به وسیله شی گرایی بسیار قابل فهم تره و بیشتر به کار تیمی میاد تا کدنویسی به وسیله تابعی .
Magic methods – call
به صورت پیش فرض زمانی که ما متدی از یک کلاس را فراخوانی کنیم که از قبل وجود نداشته باشد خطا خواهیم داشت. برای handle کردن این موضوع در کلاس خودمان متد __call را می نویسیم . این متد زمانی که یک متد تعریف نشده فراخوانی گردد صدا زده می شود.
پارامتر اول این متد نام متد فراخوانی شده است و پارمتر دوم پارامتر هایی که به متد فراخوانی شده داده شده است می باشد.
public function __call($method, $arguments) { //hadle method }
با استفاده از این Magic method ما می توانیم یک سری متد های مشابه را با پارامتر های یکسان با هم ادغام (merge) کنیم :
class cleanMethod { private $map = [ 'methodPost' => 'post', 'methodGet' => 'get' ]; public function __call($methodName, $arguments) { $this->httpAction($this->map[$methodName],$argument); } private function httpAction($httpVerb,$argument){} }
به طور مثال در کلاس بالا به جای نوشتن دو متد با نام های methodPost
, methodGet
ما __call
را صدا می زنیم که در درون آن عملیات مشابه با پارامتر های متفاوت انجام می شود.
دیدگاهتان را بنویسید