PDA

View Full Version : 15 سوال در php که اکثرا در مورد oop هستش جواب بدید ممنون می شم!



php_qq
پنج شنبه 28 آذر 1387, 22:55 عصر
سلام به همه دوستان
اگه می شه سوالای زیر رو پاسخ بدید ممنون می شم :لبخندساده:
1) نحوه نوشتن property ها در php چه طوری هستش؟ و چه اعمالی می شه روش انجام داد مثلا تو c# ما readonly داریم آیا توی php داریم؟ یا چیزای مخصوص properties؟
2) منظور از Field توی oop همون متغییرها هستش؟
3) آیا توی توابع clone می توانیم argumant پاس بدیم؟
4) آیا توی توابع destruct می توانیم argumant پاس بدیم؟
5) آیا حداکثر می توانیم از یک کلاس و Interface در کلاسی دیگر استفاده کنیم؟ ( ارث برد)؟
6) ما در php آیا enum داریم؟
7) چرا باید interface تعریف کرد؟ مثل یه interface تعریف کنیم بعد توی دو تا کلاس استفاده کینم و پیاده سازیشون کینم خوب دیگه به interface چه احتیاجی بود؟
8) دو کلاس داریم از یه کلاس ارث بردن حالا چرا بعضی جاها کلاس Parent رو abstract تعریف می کنیم؟
9) namespace توی php داریم؟ چطوری تعریف می شه؟
10) autoload چیست؟
12)

<?php
class Myclass
{
static $y=0;
function Counter()
{
return self::++$y;
}
};
$obj1=new Myclass();
$obj2=new Myclass();
echo $obj1->Counter();
echo "<br />";
echo $obj2->Counter();
?>
چرا اجرا نمی شه؟ یعنی نمی شه اول y رو زیاد کرد؟

13)

<?php
abstract class Shape
{
abstract function draw();
};
class Square extends Shape
{
function draw()
{
echo "Square Draw!";
}
};
class Circle extends Shape
{
function draw()
{
echo "Circle Draw!";
}
};
$obj1=new Square();
$obj1->Draw();
echo "<br />";
$obj2=new Square();
$obj2->Draw();
?>
آیا این همان polymorphism هستش؟

14)

<?php
class ParentClass
{
public $n1="salam1";
};
class ChildClass extends ParentClass
{
public $n2="salam2";
function __construct()
{
echo parent::$n1;
echo "<br />";
echo self::$n2;
}
};
$obj=new ChildClass();
?>
چرا کار نمی کنه؟

15) کلمه var برای تعریف متغییر هست؟!

مرسی ولی پست ندید بگید بی سواد و فلان و فلان و ...! من خیلی خوندم ولی سوال برام پیش اومد دیگه سرچ هم کردم انصافا اینا رو جواب بدید پست خوبی می شه چون خیلی سوالای خوبیه
تشکر
خداحافظ

reza.palang
جمعه 29 آذر 1387, 19:44 عصر
1 ) property چیزی جز یه کلاس نیست که متغیر های درونش private هستن نیست. که دسترسی به متغیر های داخلش با توابع get & set انجام میشه که public هستن
این یه property از prado frameworkeهست

<?php
/**
* TParameterPropert class file.
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @link http://www.pradosoft.com/
* @copyright Copyright &copy; 2005-2008 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Id: TParameterProperty.php 2541 2008-10-21 15:05:13Z qiang.xue $
* @package System.Data.SqlMap.Configuration
*/

/**
* TParameterProperty corresponds to the <property> tag and defines
* one object property for the <parameterMap>
*
* The {@link NullValue setNullValue()} attribute can be set to any valid
* value (based on property type). The {@link NullValue setNullValue()} attribute
* is used to specify an inbound null value replacement. What this means is
* that when the value is detected in the object property, a NULL will be written
* to the database (the opposite behavior of an inbound null value replacement).
* This allows you to use a magic null number in your application for types that
* do not support null values (such as int, double, float). When these types of
* properties contain a matching null value (for example, say, -9999), a NULL
* will be written to the database instead of the value.
*
* @author Wei Zhuo <weizho[at]gmail[dot]com>
* @version $Id: TParameterProperty.php 2541 2008-10-21 15:05:13Z qiang.xue $
* @package System.Data.SqlMap.Configuration
* @since 3.1
*/
class TParameterProperty extends TComponent
{
private $_typeHandler;
private $_type;
private $_column;
private $_dbType;
private $_property;
private $_nullValue;

/**
* @return string class name of a custom type handler.
*/
public function getTypeHandler()
{
return $this->_typeHandler;
}

/**
* @param string class name of a custom type handler.
*/
public function setTypeHandler($value)
{
$this->_typeHandler = $value;
}

/**
* @return string type of the parameter's property
*/
public function getType()
{
return $this->_type;
}

/**
* @param string type of the parameter's property
*/
public function setType($value)
{
$this->_type = $value;
}

/**
* @return string name of a parameter to be used in the SQL statement.
*/
public function getColumn()
{
return $this->_column;
}

/**
* @param string name of a parameter to be used in the SQL statement.
*/
public function setColumn($value)
{
$this->_column = $value;
}

/**
* @return string the database column type of the parameter to be set by this property.
*/
public function getDbType()
{
return $this->_dbType;
}

/**
* @param string the database column type of the parameter to be set by this property.
*/
public function setDbType($value)
{
$this->_dbType = $value;
}

/**
* @return string name of a property of the parameter object.
*/
public function getProperty()
{
return $this->_property;
}

/**
* @param string name of a property of the parameter object.
*/
public function setProperty($value)
{
$this->_property = $value;
}

/**
* @return mixed null value replacement
*/
public function getNullValue()
{
return $this->_nullValue;
}

/**
* The nullValue attribute is used to specify an outgoing null value replacement.
* @param mixed null value replacement.
*/
public function setNullValue($value)
{
$this->_nullValue = $value;
}
}



5) اصولا معنای ارث بری همینه. فکر میکنم منظورت رو درست متوجه نشدم

7) interfaceفقط برای اینه که مشخص کنی یه کلاس چه کار هایی انجام میده. همین

8) به هر دلیلی ممکنه برنامه نویس بخواد از کلاس پدر ارث بری نشه. abstract برای همینه
9) namespace به شکلی که توی زبان های دیگه هست نه. اما میدونم توی prado framework ازش استفاده شده
13) نه . polymorphismچیز دیگه ای هست.
یه متد (یا تابع) با یک اسم و با ترکیب های متفاوتی از پارامتر ها تعریف میشه.
و در زمان استفاده از تابع بر اساس نوع و تعداد پارامتر ها تشخیص میده که از کدوم استفاده کنه.

اگه اشتباه میکنم دوستان بگن

php_qq
جمعه 29 آذر 1387, 19:55 عصر
دمت گرم حداقل شما ما رو تحویل گرفتید اگه می شه یه مثال از polymorphism بنویسید یه مثال خیلی کوجیک!

جواب سوال 4) توی destruct طبق چیزی که توی آدرس
http://www.php.net/manual/en/language.oop5.decon.php گفته شده نمی تونیم آرگومانت پاس بدیم در واقع! نوشته :

void __destruct ( void )

reza.palang
جمعه 29 آذر 1387, 20:44 عصر
دمت گرم حداقل شما ما رو تحویل گرفتید اگه می شه یه مثال از polymorphism بنویسید یه مثال خیلی کوجیک!

جواب سوال 4) توی destruct طبق چیزی که توی آدرس
http://www.php.net/manual/en/language.oop5.decon.php گفته شده نمی تونیم آرگومانت پاس بدیم در واقع! نوشته :

void __destruct ( void )

polymorphism رو توی php باهاش برخورد نکردم. نمیدونم هست یا نه. اما توی زبان های دیگه مثل #C هست که اگر فقط میخواید با موضوع آشنا بشید توی بخش خودش هست.

destruct خوب مخرب کلاس هست. نمیتونه و نباید پارامتر بگیره.
بیشتر موارد سوالی شما در مورد مباحث شی گرایی هست و به زبان خاصی وابسته نیست. در این موارد میتونید جدا گانه مطالعه کنید

php_qq
جمعه 29 آذر 1387, 22:21 عصر
اینم کد اصلاح شده سوال 14 تا جواب درست شه


<?php
class ParentClass
{
public $n1="salam1";
}
class ChildClass extends ParentClass
{
public $n2="salam2";

function __construct()
{
echo $this->n1;
echo "<br />";
echo $this->n2;
}
}
$obj=new ChildClass();
?>


اصلا حواسم نبود خیلی بد سوتی دادم! اصلا از this$ استفاده نکردم که این ایرادم بود یعنی باید از this$ استفاده می کردم!

مهدی کرامتی
شنبه 30 آذر 1387, 00:54 صبح
1- در php چیزی بعنوان Property مانند اونچه در #C داریم وجود نداره. بلکه بر روی یک متغیر Local متدهای Accessor تعریف می کنیم، مانند مثال پست 2 همین تاپیک.

2- بله، به متغیرهایی که عضو یک کلاس باشند فیلد گفته میشه.

3- منظورت از توابع clone چیه؟ اگر منظورت پاس دادن پارامتر به توابع عضو object های clone شده است، خوب بدیهی است که میشه. اگر منظورت چیز دیگری است شرح بده.

4- خیر، به تابع destruct نمی تونید پارامتر پاس کنید.

5- بله. میتونید. به این مثال توجه کنید:

class Executive extends Employee implements IPillage
عبارتی که بعد از کلمه کلیدی extends نوشته میشه نام کلاسی است که از اون به ارث برده میشه و کلمه عبارتی که بعد از کلمه کلیدی implements نوشته میشه نام Interface ای هست که قرار پیاده سازی بشه. در مثال فوق کلاس Executive همزمان از یک کلاس دیگه و نیز از یک Interface اعضا رو به ارث میبره.

6- خیر.

7- استفاده از interface برنامه نویسی که کلاس خودش رو از interface به ارث میبره مجبور میکنه که اعضایی که بصورت خلاصه در interface معرفی شده اند رو در کلاس خودش بصورت کامل پیاده سازی کنه. در حقیقت interface قالب کار رو برای نوادگان خودش مشخص میکنه، اما نه عملکرد رو. عملکرد اصلی در کلاس های وارث مشخص و پیاده سازی میشه.

8- عملکرد کلاس های abstract مانند interface هاست. پاسخ شماره 7 رو مرور کنید.

9- بله، داریم، مثال:

namespace Library;

10- برای خلاص شدن از پروسه اعلام نیاز به فایل های کلاس هایی که داخل اسکریپت های جداگانه قرار دارند در PHP 5 امکانی بنام Autoloading Objects اضافه شده.
روش کار به این صورته که در اسکریپت مورد نظر (اسکریپتی که از یک کلاس دیگه استفاده میکنه) یک تابع بشکل زیر اضافه می کنید:

function __autoload($class) {
require_once("classes/$class.class.php");
}
این تابع بصورت خودکار و زمانی اجرا میشه که به کلاسی در اسکریپت تون ارجاع بدید که در همین اسکریپت تعریف نشده. در این صورت تابع فوق بصورت خودکار فراخوانی میشه. در داخل تابع فوق می تونید اعلام نیاز ها رو بنویسید و حتی اون رو در یکی از فایل هایی که در بقیه اسکریپت ها مشترکا استفاده میشه قرار بدید.
مزیت استفاده از این روش اینه که شما رو از تکرار کردن دستورات require در همه فایل ها خلاص میکنه.

11- سوال 11 تون رو جا انداختید!

12- اجرا نمیشه چون گرامر دستورتون اشکال داره. شکل صحیح استفاده از اپراتور ++ به صورت زیره:

++self::$y;

13- بله، تعریف پلی مورفیسم در PHP همینه.

14- پاسخ سوال رو خودتون در پست شماره 5 داده اید.

15- خیر. در PHP 6 ببعد کلمه کلیدی var بجای کلمه کلیدی public استفاده میشه.

موفق باشید.

php_qq
یک شنبه 01 دی 1387, 00:31 صبح
مرسی استاد واقعا لطف کردید :)
من منظورم اینه که می شه به تابع
function __clone() پارامتر ارسال کرد؟
ممنونم خیلیی کیف کردم سوالارو جواب دادید

مهدی کرامتی
یک شنبه 01 دی 1387, 15:17 عصر
خیر. این تابع هم مثل تابع __destruct() است و فقط برای توسعه عملکرد کلاس در هنگام رخداد واقعه فوق بکار میره. این گونه توابع چون نمونه های کلاس قابل دسترس نیستند پارامتر هم نمی پذیرند.