در شی گرایی بغیر از تابع سازنده construct__ متدهای کاربردی دیگری نیز وجود دارد.از این متدها برای دسترسی به خصوصیات غیر public که بصورت private و protected استفاده می شود.
- متد get__
- متد set__
- متد call__
متد get__
زمانی که بخواهیم مقدار یک خصوصیت غیر public را بدست بیاوریم از این متد استفاده میکنیم.پارامتری که برای این تابع ارسال می شود نام خصوصیت است.
در مثال زیر یک آرایه غیر public داریم که با استفاده از متد get درون کلیدهای آن را بررسی می کنیم که کلید موردنظر که از بیرون کلاس وارد می شود در آرایه مورد نظر که غیر public است وجود دارد یا خیر. درصورت وجود آن را برگشت می دهد.
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php class MyClass{ private $data = []; public function __get($name){ if(array_key_exists($name,$this->data)){ return $this->data[$name]; }else{ return false; } } } |
متد set__
زمانی که بخواهیم برای یک خصوصیت غیر public مقدار جدیدی را تنظیم کنیم از این متد استفاده میکنیم. این متد دارای دو پارامتر نام خصوصیت و مقدار جدید است.
در این مثال ابتدا بررسی کرده ایم که کلید مورد نظر در آرایه غیر public وجود دارد یا خیر. در صورتی که وجود نداشته باشد کلید بهمراه مقدار جدید در آرایه ذخیره می شود.
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php class MyClass{ private $data = []; public function __get($name){ if(array_key_exists($name,$this->data)){ return $this->data[$name]; }else{ return false; } } public function __set($name,$value){ if(!array_key_exists($name,$this->data)){ $this->data[$name] = $value; } } } $newClass= new MyClass(); $newClass->user = "amir javanmir"; echo $newClass->user; ?> //amir javanmir |
خروجی کلاس به شکل زیر خواهد بود.
1 2 3 4 |
<?php var_dump($newClass); ?> /* object(MyClass)#1 (1) { ["data":"MyClass":private]=> array(1) { ["user"]=> string(13) "amir javanmir" } } */ |
نمونه پیاده سازی کلاس زمان با استفاده از متد get و set
در نمونه زیر مقادیر ساعت، دقیقه و ثانیه پنهان هستند اما در هنگام ساخت شی از لجاظ عدد صحیح بودن و قرار داشتن در بازه مناسب چک می شوند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<?php class Time{ private $hour=0,$minute=0,$second=0; public function __construct($hour=0,$minute=0,$second){ if(is_int($hour) && $hour>=0 && $hour<24){ $this->hour = $hour; }else{ $this->hour = 0; } if(is_int($minute) && $minute>=0 && $minute<60){ $this->minute = $minute; }else{ $this->minute = 0; } if(is_int($second) && $second>=0 && $second<60){ $this->second = $second; }else{ $this->second = 0; } } public function __set($name,$value){ if($name == "hour" || $name == "minute" || $name == "second"){ if ($name == "hour"){ if(is_int($value) && $value >= 0 && $value < 24){ $this->hour = $value; }else{ $this->hour = 0; } } if($name == "minute" || $name == "second"){ if(is_int($value) && $value >= 0 && $value < 60){ $this->$name = $value; }else{ $this->$name = 0; } } } } public function __get($name){ if($name == "hour" || $name == "minute" || $name == "second"){ return $this->$name; } } public function getTime(){ return $this->hour.":".$this->minute.":".$this->second; } } $time = new Time(12,10,5); $time->hour = 14; $time->minute = 45; $time->second = 12; echo $time->getTime(); ?> //14:45:12 |
متد call__
زمانی که بخواهیم یک متد غیر public را فراخوانی کنیم از این متد استفاده می کنیم.این متد نام متد غیر public را بعنوان پارامتر نخست و پارامترهای متد را بعنوان پارامتر دوم دریافت می کند و آن را به متد غیر public ارسال می کند.