PDA

View Full Version : سوال: class => __destruct



mosi2007
سه شنبه 05 اردیبهشت 1391, 00:14 صبح
سلام دوستان توی همین فروم خوندم که اگه از __destruct در کلاس استفاده شود در انتها یه دفعه فقط این تابع با این نام اجرا میشود ولی داشتم از یه ای بوک استفاده میکردم که یه مثالی زد


<?php
class employee {
protected $ename;
protected $sal;
function __construct($ename, $sal = 100) {
$this->ename = $ename;
$this->sal = $sal;
}function give_raise($amount) {
$this->sal+= $amount;
printf("Employee %s got raise of %d dollars\n<br />", $this->ename, $amount);
printf("New salary is %d dollars\n<br />", $this->sal);
}
function __destruct() {
printf("Good bye, cruel world: EMPLOYEE:%s\n<br />", $this->ename);
}
}
class manager extends employee {
protected $dept;
function __construct($ename, $sal, $dept) {
parent::__construct($ename, $sal);
$this->dept = $dept;
}
function give_raise($amount) {
parent::give_raise($amount);
print "This employee is a manager\n<br />";
}
function __destruct() {
printf("Good bye, cruel world: MANAGER:%s\n<br />", $this->ename);
parent::__destruct();
}
} // Class definition ends here.
$mgr = new manager("Smith", 300, 20);
$mgr->give_raise(50);
$emp = new employee("Johnson", 100);
$emp->give_raise(50);
?>


که خودش تو همون ای بوک خروجیه این کدو نشون داده بود ولی من همین کدو وقتی خروجی میگیرم با هر بار صدا زدن کلاس یه بار هم __destruct اجرا میشه نمیدونم چرا
خروجی من با این کد


Good bye, cruel world: MANAGER:Smith
Good bye, cruel world: EMPLOYEE:Smith
Employee Smith got raise of 50 dollars
New salary is 350 dollars
This employee is a manager
Good bye, cruel world: EMPLOYEE:Johnson
Employee Johnson got raise of 50 dollars
New salary is 150 dollars
Good bye, cruel world: EMPLOYEE:Johnson
Good bye, cruel world: MANAGER:Smith
Good bye, cruel world: EMPLOYEE:Smith


و این هم خروجی ای بوک



Employee Smith got raise of 50 dollars
New salary is 350 dollars
This employee is a manager
Employee Johnson got raise of 50 dollars
New salary is 150 dollars
Good bye, cruel world: EMPLOYEE:Johnson
Good bye, cruel world: MANAGER:Smith
Good bye, cruel world: EMPLOYEE:Smith

pejman_view
سه شنبه 05 اردیبهشت 1391, 01:53 صبح
سلام

تابع destruct وقتی اجرا می شود که دیگر که کلاس می خواهد بسته شود و آخرین تابعی است که اجرا می شود ببخشید بخاطر ضیع نمی تونستم همه اش را بخونم اما من مثال ساده تری گذاشتم که به آن نگاه می کنیم:


class BaseClass {
function __construct() {
print "In BaseClass constructor\n<br/>";
}
function __destruct() {
print "In BaseClass destructor\n<br/>";
}
}

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n<br/>";
}
function __destruct() {
parent::__destruct();
print "In SubClass destructor\n<br/>";
}
}

$obj = new BaseClass();
$obj = new SubClass();


خروجی:


In BaseClass constructor
In BaseClass constructor
In SubClass constructor
In BaseClass denstructor
In BaseClass denstructor
In SubClass denstructor


حالا با این دو خط توجه کنید:
$obj = new BaseClass();
$obj = new SubClass();
اولین کلاسی که ساخته شد کلاس baseclass بوده بنابراین تابع construct بیس اجرا می شود و نمایش می دهد:

In BaseClass constructor
دومین کلاسی که ساخته شد کلاس subclass است بنابراین تابع construct بیس اجرا می شود و نمایش می دهد اما باید دقت کنید یک بار تابع construct والد را قبل از پرینت خودش اجرا می کند بنابراین اول چاپ آنرا انجام داده سپس برای خود انجام می دهد:

In BaseClass constructor
In SubClass constructor
حالا برای DESTRUCT هم مانند construct انجام می شود اول بیس destruct می شود سپس subclass نابود می شود. که در ساب کلاس یک بار دیگر تابع بیس را هم اجرا می کند بنابراین خروجی:

In BaseClass destructor
In BaseClass destructor
In SubClass destructor

با امید موفقیت

mosi2007
سه شنبه 05 اردیبهشت 1391, 02:24 صبح
درست من هم میدونم ولی تو مرورگر من این جوری که ماله شما خروجی داده ماله من نمیده
خروجی کد شما در مروگر من


In BaseClass constructor
In BaseClass destructor
In BaseClass constructor
In SubClass constructor
In BaseClass destructor
In BaseClass destructor
In SubClass destructor
In BaseClass destructor
In SubClass destructor


چرا؟؟؟
بااینکه باید خروجی من مثل خروجی شما باشد ولی اینطورنیست من هم تو تاپک تو پست اول گفتم که باید یه بار اجرا بشه ولی نمیشه
اگه سوال رو خوب میخوندید دیگه لازم نبود مثال بزنید و خودتونه به زحمت بندازید به هر حال ممنون
ولی چرا اینطوریه؟؟؟؟