تعداد بازدید: 2816

شی گرایی در 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 را صدا می زنیم که در درون آن عملیات مشابه با پارامتر های متفاوت انجام می شود.

مطالب مشابه

php socket programming

PHP Socket Programming – Part1

برنامه نویسی سوکت یک راه برای ارتباط مانا میان دو node ( کلاینت و سرور ) می باشد. یک سوکت (یا node) تحت یک IP و پورت به...

آرایه ها در php

در این مقاله قصد داریم تا آرایه ها رو در php بررسی کنیم و همچنین توابع مرتبط با آرایه ها رو بررسی کنیم. انواع آرایه در...

هدر های Http در درخواست و پاسخ

Http Headers (قسمت اول)

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

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای شی گرایی در php (قسمت چهارم)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *