نقطه ویرگول;

هر از گاهی از هر چیزی

هر از گاهی از هر چیزی

شی گرایی(OOP)در پی اچ پی(PHP) – سازنده

پنجشنبه, ۳۱ فروردين ۱۳۹۱، ۱۰:۰۹ ق.ظ
سازنده (constructor) یک متد است. هر کلاس که ساخته می شود بطور درونی و پیش فرض این متد را دارد ( مانند شی this که به طور درونی وجود دارد). این متد هنگامی که از روی کلاس یک شی ساخته می شود به صورت خودکار صدا زده می شود. ویژگی که این متد دارد این است که برنامه نویس می تواند متد سازنده را با توجه به نیازی که برای کلاس احساس می کند باز تعریف کند. کار ویژه متد سازنده مقدار دهی اولیه پروپرتی هاست.
متد سازنده (constructor) :
این متد یا هم نام کلاس است (مخصوصا در نسخه های پی اچ پی قبل از 5) یا از نام construct با دو زیرخط(UnderLine) در ابتدا استفاده می کند (در نسخه های پی اچ پی 5 و بعد).
کلاس کاربر که حاوی username و password است.
class User
{
private $username;
private $password;
public function __construct($username, $password)
{
$this->username = $username;
$this->password = $password;
}

public function getUsername()
{
return $this->password;
}

public function getPassword()
{
return $this->password;
}
}

در مواردی که نباید مقدار پروپرتی دوباره تغییر کند استفاده از متد سازنده برای مقدار دهی اولیه خیلی امن تر و مطمئن تر است. در چنین مواردی استفاده از یک متد set به دلیل امکان تغییر دوباره مقدار پرورپتی نمی تواند به اندازه متد construct کارآمد باشد.
$user = new User('php', '123');
echo $user->getUsername(); // output: php
بعد از تعریف مجدد تابع سازنده مربوط به کلاس User از این به بعد هنگامه ساختن شی از این کلاس باید ورودی های متد سازنده را بعد از نام کلاس درون پرانتز و با جداکننده کاما آورده شوند (مانند یک فانکشن یا یک متد عمل شود). در واقع چون در زمانی که شی ایجاد می شود متد سازنده صدا زده می شود.
نکته: متد سازنده می تواند پارامتر هایی را به عنوان ورودی بگیرد اما نمی تواند مقداری را بازگشت دهد.
متد نابود کننده (destructor) :
این متد در هنگام از بین رفتن شی صدا زده می شود (در برنامه یعنی بعد از آخرین کاری که شی انجام داد). معمولا برای آزاد کردن منابعی که توسط شی اشغال شده است مورد استفاده دارد. متد مخرب نه می تواند پارامتری را به عنوان ورودی بگیرد و نه مقداری را برگرداند. نام این متد destruct با دو زیرخط(UnderLine) در ابتد است. با سازی کلاس User برای اضافه کردن متد مخرب.
class User
{
private $username;
private $password;
public function __construct($username, $password)
{
$this->username = $username;
$this->password = $password;
}

public function __destruct()
{
unset($this->username);
unset($this->password);
}

public function setPassword($password)
{
$this->password = $password;
}

public function getPassword()
{
return $this->password;
}
}

پروپرتی ها مقداری از حافظه (RAM) را به خود اختصاص می دهند. متد مخرب در کلاس User قبل از نابودی شی مقدار منابعی که توسط پروپرتی ها اشغال شده است را آزاد می کند.
پیوند ها :
پی اچ پی شی گرایی 5 – سازنده ها و مخرب ها

نظرات  (۸)

به به، به به به این پشت کار
آفرین به این رسایی
ماشالله به این خلاصه نویسی
سوالی که در مورد سازنده داشتم اوکی شد جوابش توی همین پست داده شد
اما یه سوال در مورد destruct:
این جناب آقای دیستراکتور رو ما معمولا برای کلوز کردن کانکشن ها یا سیو/کش کردن و... استفاده می کنیم چون در اون مورد یا مجبوریم یا که بهتره این کار رو کنیم
اما در مرورد آزاد سازی حافظه واقعا باید این کار رو انجام بدیم؟
مثلا یه کلاس رو فرض کن که یه مشخصه داره که اتفاقا حجم زیادی از حافظه اشغال کرده حالا وسط برنامه شئی که از روی اون ساخته شده unset می شه یا مقدار کوچیکتری به جای شئ توی متغییر می شینه در این مورد لازمه همچین کاری
من کی تا حلا اصلا همچین کاری نکردم
ممنون هادی جان
یه طوری به به کردی خودمم باورم شد :دی
--
والا این سه پست اخیر (متد ها، میدان دید، سازنده ها و مخرب ها) از نظر محتوایی زیاد سنگین نیستن. ددیگه از این بیشتر نمی شه کشش داد. خوده مباحث کوتاهه. من خودم قصد خلاصه گفتن نداشتم.
--
تند تند پست دادم که برسم به این مبحث که بفهمم سوالت رو! گذاشتیم توی کف اساسی :پی
--
در مورد destructor همون چیزایی که گفتنی مثه بستن کانکشن ها و ... درسته. در مورد unset کردن property ها هم زیاد مطمئن نیستم که چقدر تاثیر داره اما بی تاثیر هم نیست. باید یه بنچمارک بگیرم بعد به صورت قطعی نظر بدم.
ممنونم و موفق باشی.
خواهش می کنم حقیقت رو گفتم
من اوایل یکی دو سال برای شئ گرایی مشکل داشتم چون هیچ مرجعی توی اون موقع وجود نداشت که ساده روان مختصر مفید توضیح داده باشه؛
پس این به به الکی نیست، اساسا نباید شئ گرایی رو زیاد سخت نشون داد چون ذات ساده ای داره
این سرعت پست دهی‌ت هم ما رو متعجب کرد واقعا آفرین داره این همه پشت کار
ممنون که توجه کردی به این مسئله :)
منتظر ادامه‌اش هم هستم قطعا(عجب املا و انشایی:D)
ممنونم از توجهی که نشون دادی
شی گرایی پیچیده نیست. مخصوصآ توی PHP. ولی باید درک بشه
ممنون از پست هات امین
خیلی لطف کردی
آره و مخصوصا در حق تو :دی
کجایی ؟ تو چالیست ؟ :پی
قربون دستت، توی یه پست دیگه توضیح بده که چه کرمیه که میان برای set و get کردن متغیر های یک کلاس، یه تابع جدا می نویسند؟
مگه چی میشه که متغیرها رو public static تعریف کنیم و هرموقع دوست داشتیم مستقیما(بدون تایع) بهشون مقدار بدیم یا مقدارشونو بگیریم؟
ایمیلمو چک می کنم. خبرشو بده
مرسی
ضمنا، خروجی خط دوم این کد:
$user = new User('php', '123');
echo $user->getUsername(); // output: php
با توجه به کلاسی که اون بالا نوشتی، 123 هست.
دقت کن عزیزم

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی