PDA

View Full Version : سوال: عنصر والد



ravand
یک شنبه 11 دی 1390, 15:20 عصر
سلام من اين كد ساده رو براي عنصر والد در شي گرايي نوشتم . در خروجي مقدار reza رو چاپ ميكنه.
به نظر شما اين كد اشكالي هم داره؟
نميخوام چند نمونه كد برام اينجا بذاريم ميخوام فقط اگه اين كد اشكالي داره برام بگيد.

<?php
class class1{
var $att=ahmad;
function operation(){
echo 'inclass-one'.$this->att;
}}
class class2 extends class1{
var $att=reza;
function operation(){
echo '-----------inclass-tow'.$this->att;
}}
$c2=new class1();
$c2=new class2();
$c2->operation();
$c2->operation();
?>

irGeek
یک شنبه 11 دی 1390, 17:32 عصر
constructor شما کو پس؟
وقتی یک شی می سازی constructor فراخوانی میشه!

ravand
یک شنبه 11 دی 1390, 18:06 عصر
ميشه در اين موردي كه ميگيد يه كم توضيح بديد؟

mtchabok
یک شنبه 11 دی 1390, 21:21 عصر
<?php
class class1{
public $att='ahmad';
function operation(){
echo 'inclass-one'.$this->att;
}
}

class class2 extends class1{
public $att='reza';
function operation(){
echo '-----------inclass-tow'.$this->att;
}
}
$c1=new class1();
$c2=new class2();
$c1->operation();
$c2->operation();
?>

ravand
یک شنبه 11 دی 1390, 21:32 عصر
متشكرم.
ميشه بگيد اين عنصر والد و فرزند توي برنامه نويسي چه كاربردي داره؟ و ميشه يه نمونه مثال در اين مورد كه در عمل به كار بياد رو بنويسيد؟
چون من در اين مورد چيزي گيرم نيومد.
متشكرم.

irGeek
یک شنبه 11 دی 1390, 21:59 عصر
ميشه بگيد اين عنصر والد و فرزند توي برنامه نويسي چه كاربردي داره؟ ببینید شما در برنامه نویسی شی گرا به یک سری ویپگی هایی میرسی که همیشه تکرار میشه فرض یک کلاس ماشین داریم
هر آماشینی یک سر ی ویژگی مشترک از قبیل رنگ پلاک داشتن فرمان ودنده و... مشترک هستند که در کلاس پدر آورده می شوند ویژگی های مختص برای هر کلاس فرزند نوشته میشه ونیازی به نوشتن توابعی مشترک نیست چون انها رو به ارث برده

ravand
یک شنبه 11 دی 1390, 22:03 عصر
اين مطلب رو هزار بار تا حالا خوندم ولي چون IQ من ضعيف زود يادم ميره :لبخند:
حالا ميشه يه مثال عملي بزنيد ؟ يه كدي كه يه كاري بكنه.

mtchabok
یک شنبه 11 دی 1390, 22:03 عصر
بهتره که سری به این تاپیک بزنی : http://barnamenevis.org/showthread.php?83103-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-OOP

ravand
یک شنبه 11 دی 1390, 22:07 عصر
بهتره که سری به این تاپیک بزنی : http://barnamenevis.org/showthread.php?83103-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-OOP

اين تاپيك رو قبلاً خوندم مطالبش هم از سايت مجيد آنلاين بدون ذكر منبع كپي شده :لبخند:
شما بهتر توضيح ميديد.
متشكرم

MMSHFE
دوشنبه 12 دی 1390, 09:46 صبح
دوست عزیز، اجازه بدین اینطور توضیح بدم که در برنامه نویسی شئ گرا، وراثت به معنای ارث بردن کد از کلاس والد هست. بعضی اوقات ممکنه دو کلاس داشته باشیم که شباهتهای زیادی به هم دارن ولی در عین حال، تفاوتهای جزئی هم بین اونها وجود داره. مثلاً توی سیستم دانشگاه، کلاس دانشجو و کلاس استاد رو درنظر بگیرین. قطعاً اطلاعاتی که برای این دو گروه ذخیره میشه، کاملاً یکسان نیست ولی شباهتهایی بین اونها هست. مثلاً هر دو گروه، شماره ملی، نام و نام خانوادگی، نام پدر و... دارن. حالا میتونیم برای سهولت بیشتر، یک کلاس به نام Person درست کنیم و اطلاعات مشترک اونها رو توی اون پیاده سازی کنیم و بعد، کلاسهای Student و Professor هر دو از اون کلاس مشتق بشن. اینطوری، کد مشترک موجود در کلاس Person رو به ارث میبرن و کلاس Person میشه کلاس والد اونها. اینطوری کار شما خیلی راحتتر میشه چون اگه مثلاً الگوریتمی برای بررسی صحت کد ملی نوشتین، یکبار اون رو توی کلاس والد مینویسین و هر دو کلاس مشتق شده، از اون استفاده میکنن. اگه قرار باشه تغییری هم ایجاد بشه، فقط توی کلاس والد تغییر میدین و کلاسهای مشتق شده خودبخود اصلاح میشن. حالا اگه توی کلاس مشتق شده، نیاز باشه یک تابع یا متغیر کلاس والد رو تغییر بدین، کافیه به همون نام، توی کلاس مشتق شده یک تابع یا متغیر دیگه تعریف کنید. اینطوری، اشیاء ایجاد شده از کلاس پایه، تابع موجود در کلاس پایه و اشیاء کلاس مشتق شده، تابع موجود در کلاس مشتق شده رو فراخوانی میکنند. به این عمل اصطلاحاً میگن Override (بازنویسی). ذکر این نکته هم خالی از لطف نیست که فقط عناصر public و protected در کلاس پایه، به ارث برده میشن. مثلاً اگه یک عنصر رو در یک کلاس بصورت private تعریف کنیم و از اون کلاس، کلاس دیگری مشتق بشه، اون عنصر private توی کلاس مشتق شده وجود نخواهد داشت. فرق public و protected هم در اینه که عناصر public ازطریق اشیاء قابل دسترسی هستن ولی عناصر protected خیر. درواقع، عناصر public همه جا قابل استفاده هستن ولی عناصر protected برای کلاسهای مشتق شده مثل public عمل میکنن (توی کد کلاسهای مشتق شده هم قابل استفاده هستن) ولی برای اشیاء ایجادشده از کلاس (چه کلاس والد و چه کلاس مشتق شده) مثل private عمل میکنن و از بیرون کلاس، دیده نمیشن.
موفق باشید.

ravand
دوشنبه 12 دی 1390, 09:53 صبح
خيلي ممنون.
ميشه در مورد اين constructor كه ايشون گفتن توضيح بديد ؟ يعني چه ؟ كاربردش چيه؟

MMSHFE
دوشنبه 12 دی 1390, 10:08 صبح
Constructor یا سازنده، تابع خاصی هست که همیشه public تعریف میشه و همنام کلاس هست یا از نام خاص construct__ برای اون استفاده میکنیم. وظیفه اصلی این تابع، مقداردهی اولیه به عناصر کلاس در زمان ایجاد شئ هست. این تابع میتونه دارای پارامتر ورودی باشه یا نباشه. اگه این تابع رو ننویسیم، یک سازنده پیشفرض برای کلاس درنظر گرفته میشه که متغیرهای عددی رو با صفر، متغیرهای منطقی رو با false و متغیرهای ارجاعی مثل رشته ها و اشیاء و... رو با null مقداردهی اولیه میکنه.
برای مثال به کد زیر دقت کنید:


class Point {
private $x;
private $y;

public function __construct() {
$this->x = 0;
$this->y = 0;
}

public function Point($x, $y) {
$this->x = $x;
$this->y = $y;
}

public function Set($x, $y) {
$this->Point($x, $y);
}

public function Display() {
echo 'X: '.$x.' - Y: '.$y;
}
}

توی کد فوق، همونطور که میبینید تو سازنده برای کلاس Point داریم که یکی دارای پارامتر ورودی هست و یکی دیگه، پارامتر ورودی نمیگیره. به اسم توابع سازنده هم دقت کنید. حالا برای ایجاد شئ از کلاس Point و مقداردهی به عناصر اون، دو راه دارین:


$p1 = new Point();
$p1->Set(5, 7);
$p1->Display();

$p2 = new Point(3, 4);
$p2->Display();

همونطور که میبینید، راه دوم راحتتر هست. ضمناً اگه دقت کنید، تابع Set با فراخوانی تابع سازنده، میتونه وظیفه مقداردهی رو به اون محول کنه. البته این روش فقط وقتی جواب میده که از اسم کلاس برای تابع سازنده استفاده کنیم یا به عبارت دیگه، تابعی که صدا میزنیم، اسم داشته باشه و از اسامی خاص مثل construct__ و... استفاده نکرده باشیم.
موفق باشید.