منم گلوم خشک شد که همینو بگمنقل قول:
امنیت رو برقرار می کنه ولی نه امنیت مخفی کردن کد. امنیت
Printable View
منم گلوم خشک شد که همینو بگمنقل قول:
امنیت رو برقرار می کنه ولی نه امنیت مخفی کردن کد. امنیت
نمی دونم چرا این حرفو می زنی ؟!نقل قول:
من که نفهمیدم چرا اینو گفتی .
اگه بحث امنیت نیست پس بحث چیه ؟
آیا OO برای امنیت طراحی شده ؟!
من که جایی ندیدم که همچین حرفی کسی زده باشه . اگه شما دیدین خب خوشحال میشم که مارم آگاه کنین .
شما هم که هر بار یه چیز میگی ...نقل قول:
منم گلوم خشک شد که همینو بگم
هر بار چی گفتمنقل قول:
شما هم که هر بار یه چیز میگی
از اولش دارم یه چیز میگم که
خیر . من گفتم فقط برای نظم نیست . نگفتم فقط برای امنیت هست.نقل قول:
نمی دونم چرا این حرفو می زنی ؟!
آیا OO برای امنیت طراحی شده ؟!
مصداق کامل :
نقل قول:
....شی گرایی با n تا مزیتش....
بله.نقل قول:
آیا شما پروژه ای رو سراغ دارید که به این منظور از private ها استفاده کرده باشند؟
وحید جان سعی میکنم در صورتی که وقت آزاد پیدا کردم یک تاپیک عملی در ایران پی اچ پی بزنم.
ببخشید , اشتباه از من بود .نقل قول:
هر بار چی گفتم
از اولش دارم یه چیز میگم که
من هنوز قانع نشدم . من می گم جایی ندیدم که حرف شما رو زده باشه . اگه میشه منبعی رو که شما این حرف از روی اون داری میزنی به ما هم معرفی کن تا ماهم بدونیم . اگرم یه حرفیه که از روی تجربه بیان میشه میرسیم به اینکه توی طراحی OO امنیت مطرح نبوده .
خواهشا همینجا مطرحش کن . یا لینکشو بزار .نقل قول:
یک تاپیک عملی در ایران پی اچ پی بزنم.
سلام
چند وقتیه خدمت مجال نمی ده در کنار برو بچس باشم
به نظر من OOP مستقیما برای بالا بردن امنیت نیست ، بلکه برای بالا بردن قدرت مانور ، سرعت توسعه ، افزایش خوانایی بوده ، جلوگیری از تکرار کد بوده.
وقتی شما اسکریپت های غیر OOP و OOP رو با هم مقایسه کنید در اولین نگاه متوجه می شید که گسترش برنامه های غیر OOP خیلی سخت تر از OOP است . اما در هر دو امکان وجود حفره های امنیتی هست ، پس نمی شه گفت لزوما استفاده از OOP به معنای بالا بردن امنیت است . وقتی یکم دقیق بشید روی اسکریپت های خیلی بزرگ که از OOP استفاده می کنند می بینید که چقدر قدرت گسترشش بالاست (در مقایسه با اسکریپت های غیر OOP) .
اما اینکه استفاده از Protect یا Privat باعث افزایش امنیت می شه یا نه !
بستگی به این داره که نگاه شما نسبت به امنیت چیه ! پروژه شما چه امنیتی نیاز داره ، واقعا عدم استفاده از Protect باعث ایجاد حفره امنیتی میشه ؟
به نظر من استفاده از Protect و ... مانند انجام دادن اعمال مستحبه ، توی این 40 .. 50 پروژه ای که انجام دادم هیچ وقت عدم استفاده از گذینه های بالا باعث ایجاد حفره امنیتی نشده و هیچ وقت هم نمی شه ، چرا که استفاده از این گذینه ها فقط برای راحتی کار برنامه نویس هست نه بالا بردن امنیت .
امنیت یعنی منطق برنامه نویسی شما !
به نظر من بهتره یکم به مسائل با نگاه باز تری نگاه کنید.
نقل قول:
اگرم یه حرفیه که از روی تجربه بیان میشه میرسیم به اینکه توی طراحی OO امنیت مطرح نبوده .
فکر نمی کنم .. مقاله یا یه مطلب رسمی برای اثباتش نیاز هست .نقل قول:
این مواردی رو که گفتید رو بنده اطلاعی ندارم چون با php کار کردم. و می دونم در php اینگونه نیست. php هم به دلیل محدودیت هایی که در ram داره و ساختارش نمی تونه به معنای حقیقی OOP رو پیاده سازی کنه. ولی در حد نیاز برآورده کرده.
اول از همه خوشحالم که سر زدی
در موردش یه نکته توی کتاب php5 power progrmming بیان شده با این عنوان
php is not java
من یادمه یه مقاله خیلی خوب در موردش خوندم االان که دو دقیقه ای دارچ سرچ می کنم گیرش نمیارم
اما یه لینک دیگه دارم که در مورد oop در php مطالب مفیدی رو گفته
http://www.raditha.com/blog/archives/000476.html
دوستان می خواهم یک سئوال بکنم که لطف فرمائید من را که در زمینه OOP نا آشنا هستم را کمی روشن کند
من تا اینجا فهمیدم که می توانیم برای اطلاعات خودمان که مثلا اگر اطلاعات دانشگاه هست شی های مختلف بسازیم
ولی آیا می توان مفهوم شی گرایی را در خواندن اطلاعات از دیتابیس و نمایش آنها ویرایش یا حذف یا اضافه نمودن هم بفرمائید
منظورم اینست که شی گرایی در این مراحل چه نقشی دارند.
اولن سلام به همه دوستان و استادان ارجمند
بعد از خوندن اينهمه پست موندم چي بگم ... مبحث با چي شروع شد وبه كجا كشيده شد!
نظر خودم رو اگه بخوام در رابطه با اين بحث ها بگم بايد متذكر شم كه برنامه نويسي شعي گرا براي پي اچ پي درست نشده كه اينجوري به جون هم افتاديد و يه گروه هي كد ها رو زند ميكنه اونيكي ديزنند ميكنه ... برنامه نويسي شعي گرا يه معقوله جدايي است كه تو اكثر زبانهاي برنامه نويسي سطح بالا استفاده شده و ميتونه توي يه اپليكيشن وب و يا يه وبسايت استفاده شه يا تو يه برنامه ويندوز يا ... دوستان بايد توجه كنند كه اين خاصيت ها به دليل قشنگي و زيبايي در نظر گرفته نشده و علت به وجود اومدن هركدومشون احساس نيازيه كه بهشون شده ... در نظر بگيريد كه تو اپليكيشني يه متغير به عنوان فلگ كه نمايانگر دسترسي مديريت هست كه با ورود اعضاع به 0 يا 1 با توجه به دسترسي كاربر تغيير ميكنه حالا اگه قرار باشه هر پلاگيني كه به اپليكيشن اضافه ميشه بتونه اين فلگ رو تغيير بده كه ديگه ... ميشه هزاران مثال ديگه كه موجب به وجود اومدن نياز به اين خواص شده زد ولي توصيه ميشه به جاي اينكه دنبال دليلي براي زير سوال بردن اين موارد باشيد يكم در مورد علت به وجود اومدنشون فكركنيد .
دوست عزيز شما شعي گرايي مزاياي زيادي داره كه دوستان در پست هاي قبلي خيلي از اونا رو عنوان كردن. مانند توسعه سريع تر و راحت تر، جلوگيري از تكرار، نگهداري آسانتر، قابليت استفاده مجدد و ... در مورد سوال شما بايد بگم كه شئي گرايي ميتونه خيلي كار شما رو راحت تر كنه و سرعت برنامه نويسيتون رو بالاتر ببره و توسعه سيستم رو راحت تر كنه ، مثلا 2 قطعه كد زير را مقايسه كنيد :
$link = mysql_connect($host, $user, $pass);
$query = sprintf("SELECT `name`
FROM `users`
WHERE `username` = '%s'",
mysql_real_escape_string($username));
$Result = mysql_db_query($dbname, $query, $link);
if($Row = mysql_fetch_array($Result))
echo $Row['name'];
echo $user->fetchName("username={$username}");
شما به عنوان نفر سوم كدوم رو راحت تر متوجه ميشي ؟؟ فكر كن تو يه صفحه صدها خط كد مشابه كد اول بايد نوشته شه و اگه از شعي گرايي استفاده بشه چقدر كمتر ميشه حجم كدها و ... كلي مزيت ديگه ميشه پيدا كرد از اين مقوله شي گرايي
با تشکر از دوست عزیز PARSAJAX
می تونم خواهش کنم که چند نمونه تئوری دیگر همچون موردی که فرمودید معرفی کنید.
من به هیچ وجه قصد ندارم که پروژه ای را با کمک نمونه کدهای دوستان در این محفل علمی انجام دهم ولی نیاز دارم که از قالب برنامه نویس سنتی به یک برنامه نویس شی گرا تبدیل شوم بنابراین می خواهم با کاربرد های شی گرایی بیشتر آشنا شوم.
با تشکر
امیر
واقعا از همه ممنونم تا اینجا خیلی مفید بود .
این اولین بحث در مورد oop بود که می بینم داره به یه جایی میرسه .
مباحثی مثل کپسوله بندی ،سازنده ، شی ، در زبانهای مختلف شبیه به هم هستند
جالبترین و خنده دارترین مقاله شی گرایی!
- مفاهیم پایه شی گرایی:
http://amir87.persiangig.com/documen...ct%20class.pdf
پیاده سازی Polymorphism در PHP :
http://amir87.persiangig.com/document/Polymorphism.pdf
یک مقاله مفید دیگر :
ایجاد یک CMS با استفاده از PHP شی گرا:
http://amir87.persiangig.com/documen...OOP%20_CMS.pdf
http://estakhrian.blogfa.com
سلام دوستان.
چند روزي در خدمت شما هستم ، اميد وارم که تو اين مدت بتونم باز هم به برنامه نويس هاي ايراني کمک کنم.
Propel يک Object Relational Mapping يا همون ORM هست.
حتما پيش خودتون مي گيد که چه فايده اي داره که من از Propel استفاده کنم. بايد بگم شما با استفاده از Propel که يک فريم ورک بسيارکار آمد براي برقراري ارتباط با ديتابيس هست تمام پايگاه داده خودتون رو بصورت کلاس در مياريد و از همه مهم تر شما مي تونيد به پايگاه هاي داده MySQL, MS SQL Server, PostgreSQL, SQLite, Oracle وصل بشيد.
شما در Propel ديگه نيازي نداريد که براي ساخت database به phpmyadmin يا هر ابزار ديگه اي وصل بشيد.
اطلاعات ديتا بيس بصورت کد XML ذخيره مي شن و پروپل خودش ديتابيس رو مي سازه
براي مثال
سپس کافيه تا دستور زير رو در command prompt اجرا کنيدکد HTML:<database name="bookstore" defaultIdMethod="native">
<table name="book">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="title" type="varchar" size="255" required="true" />
</table>
<table name="author">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="first_name" type="varchar" size="128" required="true"/>
<column name="last_name" type="varchar" size="128" required="true"/>
</table>
</database>
> propel-gen /path/to/bookstore
حالا ديتابيس ساخته شده و پروپل از هر تيبل يک شي مي سازه به عنوان مثال براي جدول book دو فايل ايجاد مي کنه :
bookstore/Book.php
bookstore/BookPeer.php
فايل اول کلاس book هست که به BookPeer ارجاء داده شده . BookPeer تمام کلاسي هست که پروپل مي سازه و Book براي اين ايجاد مي شه که شما اگر نيازي داشتيد که فانکشني اضافه کنيد اينجا اضافه کنيد.
حالا نوبت به اين مي رسه که دستورات Create, Retrieve, Update, Delete رو اجرا کنيم
جدول author رو در نظر بگيريد. براي Create کافيه که
$author = new Author();
$author->setFirstName("Jack");
$author->setLastName("London");
$author->save();
دقيقا اين کد در پشت پرده اجرا مي شه
INSERT INTO author (first_name, last_name) VALUES ('Jack', 'London');
ديديد که به چه راحتي مي تونيد اطلاعات رو اضافه کنيد . اگر دقت کرده باشيد براي اينکه مقداريبه فيلدي بديد کافيه
$TableName->setFieldName("value")
در نهايت هم دستور
$TableName->save()
اطلاعات جدول رو ذخيره مي کنه .
براي Retrieve
$firstBook = BookPeer::retrieveByPK(1);
// now $firstBook is a Book object, or NULL if no match was found.
حالا اگه شما چند Primary Key داشته باشيد
$selectedBooks = BookPeer::retrieveByPKs(array(1,2,3,4,5,6,7));
براي Update
// 1) Fetch an object by primary key
$myBook = BookPeer::retrieveByPK(1);
// 2) update the values & save() it.
$myBook ->setTitle("War & Peace");
$myBook->save();
براي DELETE
$book = BookPeer::retrieveByPK(1);
BookPeer::doDelete($book);
خب حتما پيش خودتون مي گيد من چطوري کوئري دلخواه خودمو بزنم ؟ راهشش Criteriaهست.
به عنوان مثال
$c = new Criteria();
$c->add(AuthorPeer::FIRST_NAME, "Karl");
$c->add(AuthorPeer::LAST_NAME, "Marx", Criteria::NOT_EQUAL);
$authors = AuthorPeer::doSelect($c);
اين دستور SQL رو اجرا مي کنه
SELECT ... FROM author WHERE author.FIRST_NAME = 'Karl' AND author.LAST_NAME <> 'Marx';
البته Criteria خيلي پيچيده تر از اين کد سادست که ديديد.
حالا شايد شما خواستيد که يک دستور SQL رو وارد کنيد بايد چيکار کنيد ؟
<?php
$con = Propel::getConnection(DATABASE_NAME);
$sql = "SELECT books.* FROM books WHERE NOT EXISTS (SELECT id FROM review WHERE book_id = book.id)";
$stmt = $con->createStatement();
$rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM);
$books = BookPeer::populateObjects($rs);
همونطور که مي بينيد تمامي امکانات مورد نياز براي زدن کوئري در اختيار شما هست.
پيشنهاد مي کنم حتما يک بار تجربه کنيد ، احتمال زيادي مي دم که شما هم مثل من مجذوب قدرت و امنيت اين فريم ورک مي شيد.
موفق و پيروز باشيد
سلام ، ممنون که رو این تاپیک وقت گذاشتید، یه سوال داشتم. می خواستم ببینم میشه داخل یک اسکریپت پی اچ پی به متغیر های سراسری خارج از کلاس از داخل کلاس دسترسی داشت؟
اگر متغییر خارج از کلاس به صورت global تعریف شده باشه، تو کلاس و در متد ها هم میتونید این متغییر رو استفاده کنید.
ولی کلا بی معنی هست این کار
از دوست عزیزم zoghal تشکر می کنم که به این تاپیک پاسخ دادند.
لطفا سوال هایی که مربوط به مسائلی غیر از شی گرایی هست رو در انجمن بپرسید ، سریع تر پاسخ داده می شه.
از تمامی دوستانی که قادر هستند آموزش OOP یا مسائل مربوطه بدهند خواهش می کنم در اینجا آموزش هاشون رو در اختیار دیگران قرار بدند. من در حال حاضر در حال انجام خدمت سربازی هستم نمی تونم به این تاپیک برسم . از دوستانی که تا به امروز کمک کردند هم تشکر می کنم .
موفق و پیروز باشید.
خيلي ممنون از مطالب مفيد كه گذاشتيد
اگر ميشه ادامش بديد
سلام دوستان
من براي ايجاد كلاسهاي تودرتو مشكل دارم.
بدون استفاده از وراثت و غيره... فقط ميخوام يك كلاس a تعريف كنم و در كلاس b يك يا چند تا شيي a داشته باشم.
ممنون
oop هم برای خود عالمی داره ها خیلی شیرینه
دوستان ما در پی اچ پی همون طور که میدونیم نمی تونیم برای یک کلاس بیش از یک والد داشته باشیم آیا می شه برای حل این مشکل از این روش استفاده کرد که
کلاس اول والد کلاس دوم باشه و کلاس دوم وارلد کلاس سوم
1.آیا در این صورت اشیا کلاس سوم از کلاس اول توابع و متغییر هاشون را ارث می برند؟
2.ایا میشه از توابع اون و متغییر هاش در کلاس سوم استفاده کرد اگر میشه روشش چیه ؟
سلام دوستان.
مدتی هست که من در حال خدمت هستم و متاسفانه از بحث برنامه نویسی به شدت دور شدم و اطلاعاتم از همون چیزی که دوسال پیش بود فقط کمی بیشتر شده.
از تمامی دوستانی که در این مدت به پیشرفت آموزش کمک کردن ممونم .
بریم سر اصل مطلب
راستیتش چند رو زی هست که در حال نوشتن CMS اختصاصی خودم هستم و به شدت غرق در برنامه نویسی OOP شدم.
از اونجایی که دیدم بحث در رابطه با متود های جادویی هم تا جای خوبی رسیده گفتم خوبه اگه از ابتدا شروع به آموزش متود های جادویی کنیم.
کلیه متود های جادویی PHP اینها هستن.
__construct
__destruct
__call
__callStatic
__get
__set
__isset
__unset
__sleep
__wakeup
__toString
__invoke
__set_state
__clone
در ابتدا خودم construct و destruct رو بطور کامل توضیح دادم. توی تاپیک ها دیدم دوستان زحمت get و set رو هم کشیدن که بازم ازشون تشکر می کنم. حالا شروع می کنم به توضیح دادن یکی این متود های جادویی
toString
همونطور که مشخص هست متود toString برای گرفتن خروجی بصورت رشته یا همون متن هست.
کارش سادست و فکر نمی کنم زیاد جای بحث داشته باشه.
یه مثال می زنم.
<?php
class TestClass
{
public $foo;
public function __construct($foo) {
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
}
$class = new TestClass('Hello');
echo $class;
?>
خروجی
Hello
توضیحات خطی
class TestClass
کلاسی با نام TestClass شاخته می شه
public $foo;
متغیر foo$ بصورت public تعریف می شه. ** قبلا دوستان در مورد public و private و ... توضیحات لازم رو دادن.
public function __construct($foo) {
$this->foo = $foo;
}
همونطور که گفته شد متود سازنده (construct) بعد از ارجاء متغیر به کلاس به صورت خود کار اجرا می شه و تمامی آرگمانهای این متود رو شما هنگام ساخت باید به کلاس بدید.
متغیر foo$ رو مساوی با مقدار آرگمان foo$ این تابع قرار می ده. سعی کنید هم نام بودن توابع شما رو گول نزنه. توجه کنید که متغیر های داخل توابع اگر که هم نام با متغیر های کلاس باشند به هیج وجه با هم مرتبت نیستند.
public function __toString() {
return $this->foo;
}
اینجا با متود جادویی toString تعریف می کنیم که در صورت که خروجی متنی درخواست بشه محتوای foo$ این کلاس به خروجی بره.
$class = new TestClass('Hello');
شعی class$ به کلاس TestClass ارجاء داده می شه و آرگمان اول هم رشته "Hello" مقدار دهی میشه.
echo $class;
به خط بالا دقت کنید. از شعی class$ در خوست خروجی متنی می شه. در واقع PHP با رسیدن به این دستور تابع toString کلاس رو فراخوانی می کنه.
echo $class->__toString();
در نهایت "Hello" برای خرجی فرستاده می شه و چاپ می شه. البته این توضیح رو هم اضافه می کنم که شما نباید حتما از دستور echo استفاده کنید تا این متود اجرا بشه بلکه می تونید به یک متغیر هم ارجاء بدید. به عنوان مثال
$myVar = $class;
در واقع هرگاه در خواست خروجی به سورت مستیقیم از شعی ارجاء داده شده بشه این تابع اجرا می شه.
امید وارم مورد استفاده قرار بگیره.
موفق باشید.
ممنون از همتون
سلام
قبلا از ارسال این پست و ایجاد مطلب اضافی از همتون عذر می خوام.
من تا به امروز حدود 4 سال بود که برنامه نویسی می کردم و توی مدرسه و دانشگاه هم در بخش شیء گرایی چیزی که به ما گفته میشد یک چیز تئوری بود که هیچ ربطی به برنامه نویسی نداشت و من همیشه از این بخش هیچ چیزی متوجه نمیشدم و از برنامه های نوشته شده به صورت شیء گرایی هم چیزی نمی فهمیدم.
من به تازگی این تاپیک رو دیدم و از نویسنده این مطالب که خیلی ساده و روان دارند این موضوع رو پیش می برند و از مدیران که این تاپیک رو جزو تاپیکهای برتر این انجمن قرار دادن کمال تشکر رو دارم و تقاضا دارم که این موضوع ادامه داشته باشه و مرحله به مرحله و با مثال های گوناگون این آموزش رو ادامه بدین. چون فکر می کنم این مطلب یکی از دغدغه های مهم بچه های کامپیوتر مخصوصا برنامه نویس ها باشه که تا الان چیزی از شیء گرایی نمی دونن.
ممنون از زحماتی که می کشین :قلب::بوس:
منم از محمد عزیز تشکر می کنم که این همه برای این کار وقت گذاشته :قلب:
خسته نباشید گل پسر
invoke__
متود جادویی invoke زمانی فراخوانی می شه که شما از یک کلاس مانند یک تابع استفاده کنید.
به عنوان مثال :
<?phpخیلی سادست فقط اگه دوستان در مورد is_callable مشکل دارند باید بگم این تابع چک می کنه که آیا این پارامتر ارجا داده شده قابل فراخوانی هست یا نه . برای اطلاعات بیشتر متونید به منوال مراجعه کنید.
class CallableClass {
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
توجه توجه : این متود جادویی فقط در PHP 5.3 به بالا قابل اجراست
دست همتون درد نکنه خیلی خوب بود
سلام
لطفا مباحث را ادامه دهيد
با تشكر از همه دوستان
این Parent:: دقیقا چه میکند ؟ کلاسی که Function توش هست رو بر میگردونه ؟
اینم یک توضیحی برام بدید ممنون میشم که دقیق چی کار میکنه :
class myclass extends yourclass
{}
class myclass extends yourclass
{}
کلاس myclass رو فرزند کلاس yourclass می کنه.
با استفاده از parent::func می تونید به توابع استاتیک کلاس والد رو اجرا کنید.
سلام
ببخشید من هنوز روش های استفاده ی صحیح از این نوع برنامه نویسی رو خوب یاد نگرفتم اما علاقه ی زیادی دارم یاد بگیرم. یعنی الان یک هفته ای هست که 100% برنامه هایی که مینویسم رو دارم با کلاس نویسی مینویسم هر چند سرعت برنامه نویسیم در حد خیلی زیادی اومده پایین.
سوالاتی داشتم که شاید براتون ساده باشه :
فرض کنید من یک کلاسی دارم داخل فایل A.php که به عنوان مثال داخلش کلاسی ساده به اسم ClassA نوشته شده که دارای متدی به اسم PrintMyname ـه که یک رشته ای رو چاپ میکنه
کلاس دیگری به اسم ClassB در فایلی به اسم B.php نوشتم و میخوام از متد کلاس ClassA که یک رشته رو چاپ میکرد استفاده کنم.
* دستور require ای که من در فایل B استفاده میکنم که با اون فایل A رو باید فراخونی کنم ، باید داخل کلاس ClassB نوشته باشه یا اول فایل بیرون از کلاس ؟
* اگر بخوام از متد کلاس A در فایل های دیگم که حاوی کلاس های دیگه هستند استفاده کنم چه دستوری باید بنویسم ؟ این کددرسته ===> ClassA::PrintMyname ؟
* الزامی به استفاده از extends هست یا نه؟
سعی کردم به روان ترین حالت ممکن مشکلم رو بگم. امیدوارم عزیزان محترم منظورم رو فهمیده باشن ...
1. دوست من اگر از دستور مذکور برای فراخوانی کلاس A داخل کلاس B استفاده کنی ، این معنی رو میده که شما کلاس A رو فرزند کلاس B قرار دادید. پس باید خارج کلاس B فراخوانی بشه کلاس A.
2. منظورت از فایل های دیگه اگر همون کلاس B باشه و با extends بعنوان فرزند کلاس A شناخته شده باشه بله با دستور parent::PrinMyname یک متد از داخل کلاس A یا همون پدر یا والدین رو فراخوانی می کنید.
3. الزامی در کار نیست. زمانی شما نیاز دارید که بطور بسیار امن و راحت از متدی داخل یک کلاس که مربوط به کلاس دوم ما میشه استفاده کنید (البته بگم چند کلاسه کردن برای فهم و درک و عملکرد بهتر است) در اینجا می بایست از extends استفاده کنید تا با دستوری که در پاسخ شماره 2 نوشتم آن را فراخوانی کنید.
ممنون اما من نمیخوام از دستور Extends استفاده کنم
در استفاده از توابع میشه داخل یک تابع از تابعی دیگه استفاده کرد. من میخوام داخل متد یک کلاس متدی از کلاس دیگر رو استفاده کنم اما نمیخوام روابط والد و فرزندی بین این دو کلاس وجود داشته باشه. چنین قابلیتی وجود داره؟
این چه ربطی به شی گرایی داشت ؟!!
با سلام مجدد، ضمن تشكر از همه دوستان فعال در اين بحث، به زودي يك آموزش جامع درمورد شئ گرايي در PHP آماده ميكنم و كم كم در همين بحث قرار ميدم.
موفق باشيد.
در ابتدا از MMSHFE عزیز ممنونم که آموزش شئی گرایی رو می خوان بنویسن .
در مورد استفاده یه مند از یه کلاس در کلاس دیگه باید بگم که شما در هر شرایطی میتونید از هر متدی در هر متد دیگری استفاده کنید مگر اینکه شرایط زیر رو داشته باشه :
- متد مربوطه private ، protected باشه .
- کلاس حاوی متد اصلا فراخوانی نشده باشه .
در مورد static بودن متد هم باید بگم که در این حالت فقط از طریق نام کلاس و یا والد بودن حق دسترسی داریم ( البته اگه public باشه ) و یه توضیح دیگه هم اینکه اگر شئی از یه چنین کلاسی ایجاد کنید به متدهایی که حالت static هستن در اون شئی دسترسی ندارید . و فقط در خود کلاس بهش دسترسی دارید .
یه مثال :
<?php
class a{
function x(){ echo 'x method'; }
static function b(){ echo 'b method'; }
}
$objectA = new a();
$objectA->x(); // echo 'x method'
$objectA->b(); // error
a::x(); // echo 'x method'
a::b(); // echo 'b method'
?>
با سلام خدمت دوستان
من oop رو بلد نیستم و با خوندن این تاپیک تازه یه چیزایی دستگیرم شده
یه چند تا سوال داشتم میخواستم بدونم کاربرد اینها چیه ؟
var , public , private , protect , ...
به عنوان مثال :
private $a;
var $b;
public $c;
public function displayForm() {...}
private function _createEventObj() {...}
...
var که همون نسخه قدیمی public باید باشه و استفاده ازش توصیه نمیشه! public و private و protected برای دسترسی دادن یا ندادن در شی گرایی استفاده میشه. مثلاً اگر دسترسی یک تابع رو روی public بگذاریم از هر کجایی هر وقت بخوایم می تونیم ازش استفاده کنیم. اما اگر private باشه فقط خود کلاس می تونه ازش استفاده کنه و اما اگر protected باشه هر کلاس و مشتقاتش میتونه ازش استفاده کنه. و ربطی به امنیت اینا ندارن و این دسترسی رو خودمون تشخیص میدیم. و برای اینه که توسعه دهنده دچار اشتباه نشه!
با سلام، دوست گرامي از var در زماني استفاده ميشه كه بخواين يك متغير رو تعريف كنيد ولي فعلاً مقداري بهش ندين. private باعش ميشه يك عنصر كلاس (فيلد، متد يا هر چيز ديگه كه باشه)، بصورت خصوصي در بياد و public اون رو بصورت عمومي در مياره. براي اينكه دقيقاً فرقشون رو بدونيد، بايد اينطور توضيح بدم كه كلاً ما از عناصر يك كلاس در دو قسمت استفاده ميكنيم:
1- كد درون كلاس (يعني جايي كه با آكولاد باز و بسته ابتدا و انتهاي كلاس مشخص ميشه)
2- ازطريق يك شئ كه از روي كلاس ايجاد ميكنيم (خارج از كد كلاس و در جايي كه كلاس فراخواني ميشه)
عناصر public در هر دو قسمت قابل استفاده هستن ولي عناصر private فقط در قسمت اول يعني كد درون كلاس قابل استفادن. براي مثال، به كد زير دقت كنيد:
class Test
{
private PriMethod()
{
//codes
}
public PubMethod()
{
$this->PriMethod(); //It's ok
}
}
$test = new Test();
$test->PubMethod(); //It's ok
$test->PriMethod(); //Error
اما اين وسط، عناصر protected چه كاره هستن؟ بايد دقت كنيد كه اگه يك كلاس از كلاس ديگه مشتق بشه، تمامي كدهاي غير private اون رو به ارث ميبره. مثلاً اگه كلاس پايه، يك فيلد يا متد از نوع public داشته باشه، اين فيلد يا متد در كلاسهاي مشتق شده از اون و همچنين اشياء ايجاد شده از اون كلاس هم وجود خواهند داشت اما اگه private باشه، نه كلاسهاي مشتق شده بهش دسترسي دارن و نه اشيائي كه از اون كلاس ايجاد ميشن. حالا اگه بخوايم عنصري داشته باشيم كه در كلاس مشتق شده وجود داشته باشه (ارث برده بشه) ولي ازطريق اشياء قابل استفاده نباشه، راه حل چيه؟ جواب: عناصر protected راه حل ما هستن: اين عناصر براي كلاسهاي مشتق شده از كلاس پايه، مثل public عمل ميكنن و ارث برده ميشن ولي براي اشياء ايجاد شده از كلاس مثل private عمل ميكنن و از بيرون ديده نميشن.
اميدوارم خوب توضيح داده باشم.
موفق باشيد.
این چیزی که شما میگین ماله C# یا javascript ...
تو php4 از var برای تعریف عناصر کلاس استفاده میشد ...
تو php5 هم کار میکنه ولی یه E_STRICT میده تا 5.3 و از اون به بعد هم deprecated شده ...
توی 5 var به عنوان public تفسیر میشه ...
It's for declaring class member variables in PHP4, and is no longer needed. It will work in PHP5, but will raise an E_STRICT warning in PHP5 up to version 5.3, as of which it has been deprecated
و تو 6 هم E_STRICT حذف شده ...
The second issue was removing support for "var" altogether in PHP 6. Now it is an alias for "public", but it will raise an E_STRICT warning. As there is no real reason why we should remove it, we agreed on simply making "var" an alias to "public" and removing the warning.
با سلام، بنده توضیحاتی رو از یک کتاب در آورده ام راجع به متد ایستا (استاتیک ) که در اینجا برای دوستان قرار میدهم : (book name : php the complete reference)
هنگامی که متدهای ایستا ایجاد می کنید، می توانید این کار را انجام دهید: متد را فراخوانی کنید بدون اینکه مجبور باشید ابتدا یک شی از آن کلاس بسازید :
class Math{
public static function say_hi()
{
echo "The Math class says 'Hello there'. <br />";
}
}
ما در کد بالا یک متد استاتیک تعریف کردیم که یک رشته را برای ما چاپ می کند، حال برای صدا کردن این متد از کد زیر استفاده می کنیم :
Math::say_hi();
حالا فرض کنید که می خواهید متد squarer را بنویسید و آن را به کلاس Mathh اضافه کنید . عددی را که می خواهید مجذورش محاسبه شود به آن متد انتقال می دهید :
class Math{
public static function say_hi(){
echo "The Math class say 'Hello there'. <br />";
}
public static function squarer($op){
echo $op, "<sup>2</sup> = ", $op * $op, "<br />";
}
}
echo "Using the math class ...<br />";
Math::say_hi();
Math::squarer(8);
یه سوال:
استفاده از این روش چه کاربردی داره و کجا باید استفاده بشه؟
اين روش باعث ميشه براي استفاده از يك عنصر از كلاس، نياز نباشه يك شئ از اون ايجاد كنيم. اين كار هم در مصرف حافظه صرفه جويي ميكنه و هم اينكه به ما كمك ميكنه يكسري عناصر رو بين اشياء كلاس به اشتراك بگذاريم. براي مثال، اين حالت رو درنظر بگيريد:
public class MyClass {
private static int $count = 0;
public MyClass() {
MyClass->$count++;
}
public static Count() {
return MyClass->$count;
}
}
از اونجا كه count$ بصورت استاتيك تعريف شده، موقع ايجاد يك شئ جديد، دوباره 0 نميشه و سازنده هاي اشياء هم اون رو افزايش ميدن. حالا هرجا خواستين بدونيد چند تا شئ از كلاس ايجاد شده، ()MyClass->Count رو نمايش بدين. دقت كنيد كه براي دسترسي به عناصر استاتيك از نام كلاس استفاده ميشه نه نام اشياء ايجادشده از كلاس. اين روش مزاياي زيادي داره. مثلاً يك شئ، عنصر static رو مقداردهي كنه و شئ ديگه، اون رو بخونه و...
موفق باشيد.
با سلام
:چشمک:آیا کتاب فارسی برای آموزش OOP وجود دارد ، منظورم این است که آموزش دارای کد های بزرگ باشد.اگر دوستان پیدا کردن برای ما هم بگذارند.
موفق باشید.
به نام خدا
با سلام
تا به حال هر مثالی که زدید با برنامه نویسی عادی هم می شد انجام داد تازه انعطاف پذیرتر !!!:متعجب:
میشه یک مثال بزنید که نشه با برنامه نویسی عادی انجام داد.
با تشکر از همه ی دوستان مخصوصا hidensoft.
دوست خوبم من به شما کتاب راهنمای جامع PHP انتشارات نشر علوم رو پیشنهاد میکنم که به خوبی دو فصل را به شی گرایی اختصاص داده ...
به نام خدا
با سلام
کسی کتاب نداشت معرفی کنه! (فارسی و جدید)