# زبان های اسکریپتی > PHP > تاپیک های آموزشی و دنباله دار >  آموزش برنامه نویسی OOP

## hidensoft

سلام
از عنوان انتخاب شده معلوم هست که در مورد چی هست ولی من واسه اون دسته از کسانی که به تازگی وارد برنامه نویسی شند توضیح می دم :
برنامه نویسی شی گرا (OOP مخفف Object Oriented Programming) شیوه ای از برنامه نویسی است که بیشتر بر روی شی کار میکند . 
هر شی دارای توابع و متغیر هایی می باشد که درون شی تعریف می شوند.
در PHP ما با استفاده از Class اشیا مورد نظر خود را تعریف می کنیم .
مثال : 
<?php
	class Myclass
	{
		// some code
	}
?>

همونطور که گفتم هر شی دارای یک سری متغیر و توابع می باشد. حالا ما برای شی خودمون یک تابع می سازیم که کلمه PHP رو برای ما چاپ کنه :

<?php
	class Myclass
	{
		function printphp()
		{
			echo 'php';
		}
	}
?>

حالا این کد رو اجرا می کنیم . ولی خروجی در صفحه مشاهده نمی کنیم ! چرا ؟
برای اینکه ما باید این شی را در برنامه به یک متغیر نسبت بدهیم . بدین صورت :

<?php
	class Myclass
	{
		function printphp()
		{
			echo 'php';
		}
	}
	
	$my_var = new Myclass();
?>

همانطور که می بینید توسط new بعد از مساوی نام کلاسی که ساختیم را می نویسیم.
تا اونجا که من میدونم در PHP 4 یک کپی از این کلاس درون متغیر یا شی قرار می گیره .. اما در PHP 5 فقط یک دستگیره از کلاس به شی ارجا می شود.
حالا نوبت به استفاده تابع درون کلاس می باشد. برای اینکه به توابع یا متغیر های درون Class دسترسی داشته باشیم باید از پس از نام متغیر از <- استفاده کنیم :

<?php
	class Myclass
	{
		function printphp()
		{
			echo 'php';
		}
	}
	
	$my_var = new Myclass();
	$my_var->printphp();
?>
پس از تعریف شی در خط 11 اسکریپت به PHP فرمان اجرای تابع ()printphp از Myclass رو میده و پس از اجرای این اسکریپت می بینید که php درون صفحه نمایش داده می شود.

خیلی ساده بود نه ؟

حالا یکم سخت ترش می کنیم.
به کلاسی که ساختیم یک متغیر اضافه می کنیم. بدین صورت :

<?php
	class Myclass
	{
		public $myname;
		
		function printphp()
		{
			echo 'php';
		}
	}
	
	$my_var = new Myclass();
	$my_var->printphp();
?>

تابع ()printphp رو به نام ()print_my_name تغییر نام می دهیم :

<?php
	class Myclass
	{
		public $myname;
		
		function print_my_name()
		{
			echo 'php';
		}
	}
	
	$my_var = new Myclass();
	$my_var->print_my_name();
?>

یک تابع جدید با نام ()set_my_name بوجود می آوریم :

<?php
	class Myclass
	{
		public $myname;
		
		function print_my_name()
		{
			echo 'php';
		}
		
		function set_my_name()
		{
			
		}
	}
	
	$my_var = new Myclass();
	$my_var->print_my_name();
?>

خب حالا یه سوال پیش میاد که ما به متغیر هایی که درون کلاس تعریف می کنیم به چه صورت دسترسی پیدا می کنیم ؟
جواب خیلی سادست .. همون طور که نام تابع رو صدا زدیم می تونیم بجای نام تابع نام متغیر رو بنویسیم و به متغیر درون کلاس دسترسی داشته باشیم.


	$my_var->myname = "ALI"; // می توانید به متغیر بدهید
	
	$x = $my_var->myname; // می توانید مقدار متغیر را درون متغیر دیگری بریزید


ما تاحالا از بیرون کلاس به متغیر ها و توابع دسترسی داشتیم .. اما راهی برای دسترسی از درون کلاس به اشیاء کلاس هست ؟
بله .. توسط متغیر this$ می توانید به متغیر ها درون یک شی دسترسی داشته باشید و به آنها مقدار بدهید یا مقدار آنها را درون متغیر دیگری قرار دهید یا مقدار آن را مورد مقایسه قرار دهید.
توی یک مثال ساده توسط this$ به متغیر myname$ مقداری می دهیم :

<?php
	class Myclass
	{
		public $myname;
		
		function print_my_name()
		{
			echo 'php';
		}
		
		function set_my_name()
		{
			$this->myname = 'Ali';		
		}
	}
	
	$my_var = new Myclass();
	$my_var->print_my_name();
?>

در تابع ()set_my_name توسط this$ به متغیر myname$ مقدار Ali را ارجا دادیم.
function set_my_name()
		{
			$this->myname = 'Ali';		
		}

حالا تابع ()print_my_name را با کمک this$ طوری تغییر می دهیم که متغیر myname$ را چاپ کند :

<?php
	class Myclass
	{
		public $myname;
		
		function print_my_name()
		{
			echo $this->myname;
		}
		
		function set_my_name()
		{
			$this->myname = 'Ali';		
		}
	}
	
	$my_var = new Myclass();
	$my_var->print_my_name();
?>

با اجرای این اسکریپت بازم شما هیچ خروجی نخواهید داشت .. زیرا شما باید ابتدا تابع ()set_my_name را اجرا کنید تا درون متغیر myname$ مقدار Ali قرار بگیرد .. سپس تابع ()print_my_name را اجرا کنید .. پس قبل از دستور اجرای تابع ()print_my_name دستور اجرای تابع ()set_my_name را صادر می کنیم :

<?php
	class Myclass
	{
		public $myname;
		
		function print_my_name()
		{
			echo $this->myname;
		}
		
		function set_my_name()
		{
			$this->myname = 'Ali';		
		}
	}
	
	$my_var = new Myclass();
	$my_var->set_my_name();
	$my_var->print_my_name();
?> 

حالا برای بهتر شدن این کد آخرین تغیرات رو انجام می دهیم در تابع ()set_my_name یک تغییر کوچک می دهیم :

function set_my_name($name)
		{
			$this->myname = $name;		
		}

فکر می کنم فهمیدید چیکار کردم ! با تغییرات انجام شده تابع ()set_my_name یک آرگمان اجباری از شما میخواهد و مقدار همون آرگمان رو در خروجی چاپ می کنه پس حالا باید دستور اجرا ی تابع ()set_my_name رو تغییر بدهیم تا رشته ای که به عنوان آرگمان می گیرد را چاپ کند.

$my_var->set_my_name('Ali'); 

این هم اسکریپت نهایی :

<?php
	class Myclass
	{
		public $myname;
		
		function print_my_name()
		{
			echo $this->myname;
		}
		
		function set_my_name($name)
		{
			$this->myname = $name;		
		}
	}
	
	$my_var = new Myclass();
	$my_var->set_my_name('Ali');
	$my_var->print_my_name();
?>

فایل پیوست شده هم همین اسکریپت هست .

انشا الله اگر این جلسه مورد استقبال دوستان قرار گرفت در جلسه دوم به بحث در مورد :

__construct()
__destruct()
self::
parent::

می پردازیم .. 

اگر سوالی در این مورد داشتید بپرسید .. فقط سوالاتی که در همین مورد هستند رو مطرح کنید .



موفق و پیروز باشید

----------


## Folaani

ضمن تشکر از مطلب مفیدتون.
اجازه بدید چند مطلب کوچک هم بنده اضافه کنم.
تعریف کلاس فقط یک الگو هست و وقتی با دستور new به یک متغییری نسبتش میدیم، یک نمونه از روی اون کلاس میسازه و در حافظه ذخیره میشه (درحالیکه تعریف کلاس فقط یک الگو هست که میتونه توی حافظه هم نباشه) و اون متغییر با اون کلاس مرتبط میشه.
البته این مفهوم کلی هست و پیاده سازی میتونه خیلی پیچیده تر باشه بنا به بهینه سازی و غیره. مثلا اینکه هر نمونه از کلاس نیاد و کل ساختار و تعریف و تابعها رو بخواد درخودش حمل کنه و بجاش یک رفرنس به الگو داده بشه درموقع نیاز به اجرای تابع و غیره.
بهرحال این تقریبا بدیهی هست که متغییرهای هر نمونه از کلاس (در اصطلاحات فنی شیء گرایی Instance یا نمونه گفته میشه) هرکدوم باید در مکان جداگانهء خودشون ذخیره شده باشن و غیره (همش و غیره شد!!).
فقط خواستم بگم این تفکر که فکر کنیم اون تعریف کلاس چیزی فراتر از یک الگو هست و متغییرهای تعریف شده از اون کلاس چیزی ندارن جز یک مرجع منفرد، چندان درست بنظر نمیرسه.
این رو مقایسه کنید با مفهوم استراکچر که از مدتها قبل از اختراع شیء گرایی، در بسیاری زبانهای برنامه نویسی وجود داشته. در اونجا هم ما یک تعریف داریم که بخودی خود چیزی موجود و قابل دستیابی نیست (احتمالا در کد کامپایل شدهء اجرایی هم اثری ازش باقی نمیمونه)، بلکه بعنوان الگویی برای ساخت و اختصاص حافظه برای متغییرهایی از اون نوع و دسترسی به محتویات اونها مورد استفاده قرار میگیره.
بنظرم تفاوت عمدهء استراکچر با کلاس این هست که استراکچر فقط محتوی دیتا/متغییر هست و هیچ تابعی (در اشیاء متد گفته میشه) نداره.


در پی اچ پی ۴ هم پیاده سازی شیء گرایی پایه ای نبوده (میشه گفت تاحدی شبیه سازی شده) و شاید موردی که ذکر کردید هم مربوط به همون میشه که موقعی که متغییرهای محتوی کلاس رو به هم نسبت میدیم در متغییر جدید یک کپی از کلاس ذخیره میشه. خب این روش حافظه و منابع بیشتری رو مصرف میکنه.
بهرحال برنامه نویسی با شیء گرایی بسیار راحتتر و با مزایای زیادی هست. خصوصا برنامه نویسیهایی چنین سطح بالا مثل اپلیکیشن نویسی وب. پس بهتره از ابتدا به برنامه نویسی شیء گرا عادت کنیم. حتی کار اول آدم میتونه در این زمینه بسیار راحتتر و با کیفیت تر از چیزی باشه که بنظرش میرسه.

پی اچ پی ۵ قابلیت شیء گرایی رو بصورت خیلی اساسی تر و اصولیتری پیاده کرده و تعدادی قابلیت پیشرفته و مفید بهش اضافه کرده و همچنین استانداردهاش رو اصولی تر کرده؛ بطور مثال همین توابع __construct و __destruct که مربوط به پی اچ پی ۵ هستن و در پی اچ پی ۴ شناسایی نمیشن، اما حداقل درمورد تابع __construct معادلش در پی اچ پی ۴ هم وجود داره که عبارت از تابعی با نام کلاس محتوی آن تابع هست.

----------


## hidensoft

سلام
امروز می خوایم در این موارد باهم صحبت کنیم

__construct() 
__destruct() 
self:: 
parent:: 
اول در باره هر کدوم توضیح مختصری می دم.

()construct__
تابعی که با این نام باشه هنگام ساختن یک شی از کلاس بطور خود کار اجرا میشه

()destruct__
تابعی که با این نام باشه هنگامی که شما عملیاتتون با شی تموم بشه بطور خود کار اانجام می شه

::self
با این متد می تونید از داخل کلاس یک تابع از کلاس رو صدا بزنید
::parent
این متد به کلاس والد اشاره می کنه .. زمانی که شما یک کلاس رو فرزند کلاس دیگری قرار بدید

با یک مثال ساده کار رو شروع می کنیم. به کد زیر نگاه کنید

<?php
class Myclass {
   function __construct() {
       print "construct";
   }
}
$obj = new Myclass();
?>
خروجی
construct
همون طور که می بینید با اینکه ما فقط یک شی رو به یک متغیر نسبت دادیم باز هم متد construct__ اجرا شد .
حالا اگه این تابع construct__ چند تا آرگمان در ابتدا از ما بخواد باید چطوری این آرگمان ها رو مقدار دهی بکنیم ؟ 
حالا به کد زیر نگاه کنید

<?php
class Myclass {
   function __construct($name) {
       print $name;
   }
}
$obj = new Myclass('Ali');
?>
و خروجی :
Ali

پس اگر تابع construct__  در ابتدا نیاز به آرگمان داشت می بایست در هنگام تعریف شی آرگمان رو مقدار دهی کرد.
وگر نه شما با خطایه
Warning: Missing argument 1 for Myclass::__construct(), called in FILE ADRESS on line LINE NUMBER and defined in FILE ADRESS on line LINE NUMBER
 

در PHP 4 شما می تونید بجای استفاده از construct__  از نام کلاس به عنوان نام تابع استفاده کنید و این تابع هم مانند construct __ عمل خواهد کرد.

<?php
class Myclass {
   function Myclass($name) {
       print $name;
   }
}
$obj = new Myclass('Ali');
?> 
باز هم خروجی Ali خواهد بود.
(این قابلیت در php 5 هم support می شود)

حالا به این کد نگاه کنید :

<?php
class Myclass {
   function Myclass($name) {
   		print $name;
   }
   function t_empty(){
   		print '$';
   }
   function __destruct(){
   		print 'Akbar';
   }
}
$obj = new Myclass('Ali');
?>
خروجی :
AliAkbar
همون طور که دید باز هم فقط متغیر رو به شی نسبت دادیم ولی پس از پایان اسکریپت تابع destruct__ عمل کرد و خروجی رو تغییر داد . شاید این سوال براتون پیش بیاد که در هر بار استفاده از شی در پایان destruct__ اجرا می شه ؟ جواب منفی هست و با این کد ثابتش می کنیم

<?php
class Myclass {
   function Myclass($name) {
   		print $name;
   }
   function t_empty(){
   		print '$';
   }
   function __destruct(){
   		print 'Akbar';
   }
}
$obj = new Myclass('Ali');
$obj->t_empty();
?> 
خروجی :
Ali$Akbar
اگر هر بار بعد از استفاده از شی destruct__ اجرا می شد باید دوبار Akbar چاپ می شد اما دیدید که این طور نبود.

حالا به این کد نگاه کنید :

<?php
class Myclass {
   function Myclass() {
   		self::t_empty();
   }
   function t_empty(){
   		print '$';
   }
}
$obj = new Myclass('');
?> 
خروجی : $
همون طور که دید ما از داخل تابع Myclass تابع t_empty رو صدا زدیم. شما می تونید با استفاده از این متد به دیگر توابع دسترسی داشته باشید و آنها رو اجرا کنید.

اما ::parent

قبل از توضیح parent باید به شما یاد بدم که چطوری یک کلاس رو والد کلاس دیگری قرار بدیم .
 به این کد نگاه کنید :

<?php
class A {
    function example() {
        echo " I am parent";
    }
}

class B extends A {
    function example() {
        echo "I am Child ";
        parent::example();
    }
}

$b = new B;

$b->example();
?>
همون طور که می بینید ما اینجا 2 کلاس داریم. کلاس B فرزند کلاس A هست. در مثال کاملا واضح هست که توسط  extends  یک کلاس رو فرزند کلاس دیگری قرار دادیم.
و توسط متد ::parent تابع example کلاس مادر رو صدا زدیم .
فکر نمی کنم مطلبی مونده باشه .. 

با آرزوی موفقیت برای شما

----------


## hidensoft

سلام
من نمی دونم چرا به برنامه نویسی Oop اصلا احمیت داده نمی شه ! واسه پیدا کردن یک کار معمولی هم حداقل شما باید Oop بلد باشی .. بریم سر اصل مطلب

امروز در رابطه با یکی از نکات قدرت Php می خوایم صحبت کنیم . 

*پولی مورفیسم* 

می شه گفت پیچیده ترین روش برنامه نویسی در مبحث oop بر می گرده به این بخش . با استفاده از این روش می توانید کنترل برنامه را افزایش داده و از تعریف چند آبجکت برای چند کلاس جلوگیری کرد .
این مثال از صفحه 67 و 68 PHP 5 Power Programming هست . 

class Cat {
	function miau()
	{
		print "miau";
	}
}
class Dog {
	function wuff()
	{
		print "wuff";
	}
}
function printTheRightSound($obj)
{
	if ($obj instanceof Cat) 
	{
		$obj->miau();
	} 
	else if ($obj instanceof Dog) 
	{
		$obj->wuff();
	} 
	else 
	{
		print "Error: Passed wrong kind of object";
	}
	print "\n";
}
printTheRightSound(new Cat());
printTheRightSound(new Dog());


/* 
خروجی :

	miau
	wuff
*/


جالب بود نه ؟

_عملکرد برنامه :
_
دو کلاس یکی با نام Cat و دیگری با نام Dog وجود دارد . تابع printTheRightSound با استفاده از پولی مورفیسم به دنبال کلاس مورد نظر می گردد و تابع موجود در کلاس را صدا می زند . 

ولی یک اشکال در این روش وجود دارد .. اگر بخواهیم چند صدا از دیگر حیوانات اضافه کنیم باید بدنه Else If را گسترش بدهیم که این روش خوانایی برنامه را پایین می آورد  .. راه حل جالبی برای این کار در PHP وجود دارد . آن هم استفاده از توارث است . 

این بار یک کلاس با نام Animal به برنامه اضافه می کنیم.  به این کد با دقت نگاه کنید :

class Animal {
	function makeSound()
	{
		print "Error: This method should be re-implemented in the children";
	}
}
class Cat extends Animal {
	function makeSound()
	{
		print "miau";
	}
}
class Dog extends Animal {
	function makeSound()
	{
		print "wuff";
	}
}
function printTheRightSound($obj)
{
	if ($obj instanceof Animal) 
	{
		$obj->makeSound();
	} 
	else 
	{
		print "Error: Passed wrong kind of object";
	}
	print "\n";
}
printTheRightSound(new Cat());
printTheRightSound(new Dog());

/* 
خروجی :

	miau
	wuff
*/
خب همونطور که دیدید مشکل گسترش بدنه Else If هم حل شد . 
نیاز به توضیح خاصی نیست (اینجور که فکر می کنم). در صورت اینکه سوالی بود همینجا بپرسید (پیام خصوصی نفرستید  :چشمک: ).

----------


## hidensoft

> مزایای این نوع برنامه نویسی چه چیزی هست؟


این لینک رو مطالعه بفرمایید .. اگر مفهموم نبود بگید براتون توضیح می دم




> و مهمتر اینکه اصلا چه اصراری هست که برنامه نویسان از شی گرایی استفاده کنند؟


هیچ اصراری وجود نداره .. در اکثر مقالات برنامه نویسان را تشویق به روی آوردن به این روش می کنند . در کتاب PHP 5 Power Programming بار ها و بار ها توصیه شده از برنامه نویسی معمولی دست برداشته و به سمت شی گرایی حر کت کنید . با اطمینان تمام می تونم بگم 100% پرتال ها و CMS ها قدرتمند از OO استفاده کرده .. بدون استفاده از شی گرایی هیچ وقت این چنین پیش رفت نمی کنند .. برای مثال همین vBulletin یکی از موفق ترین انجمن های موجود هست و می شه گفت نزدیک به 75% در کدهاش از شی گرایی استفاده کرده .. با کمی جست و جو و تحقیق خودتون به نتایج بهتری می رسید.




> و اینکه آیا در این بین واقعا تفاوت بسیاری وجود دارد؟


100%

----------


## pooyesh

نحوه تدریس جالب هست
ساده ، روان و کار آمد
من فکر می کنم دوستانی که دائم درباره مزایا سوال می کنند هنوز یک برنام بزرگ رو ننوشتند یا می شه گفت شاید هنوز متوجه نشدن که در صورتی که برنامه بزرگ بشه و قرار باشه یک نفر دیگه توی انجام کار وارد بشه یا انکه قرار باشه گروهی کد نویسی بشه بدون oo امکان نداره یا اینکه خیلی سخته
البته از ابتدا OO نوشتن سخته به عبارتی باعث می شه فرد یادگیرنده کمی کیج بشه و شاید باعث دلسردی از کد نویسی پیدا بشه اون هم PHP که واقعا ساده و زیباست 
بخاطر همین توسعه من به دوستان تازه کار اینه که خودشون رو خیلی درگیر OO نکنن ولی یادشون باشه دیر یا زود باید به این سمت برن و اون زمان ، زمانی که فرد خودش متوجه میشه  که داره کار سخت می شه

درضمن آموزش رو ادامه بده
ممنون

----------


## hidensoft

سلام
دوستانی که بحث رو دنبال کردند دیگه حالا آمدگی پروژه های خیلی بزرگ تر رو دارند.
با یک تمپلت انجین کار رو شروع می کنیم. 
_زنگ تفریح_
این موتور تمپلت خیلی سادست پس زیاد خوشحال نشید و فردا برید یه smrty برا خودتون بسازید و پس فردا هم یک PHP جدید  :لبخند گشاده!:   :چشمک: 
ابتدا به کد مربوط به فایل کلاس اصلی نگاه کنید.
<?php
class template
{
	var $tpl_vars;
	
	function template()
	{
		$this->tpl_vars = array();
	}

	function assign($var_array)
	{
		
		if (!is_array($var_array))
		{
			die('template::assign() - $var_array must be an array.');
		}
		$this->tpl_vars = array_merge($this->tpl_vars, $var_array);
	}

	function parse($tpl_file)
	{

		if (!is_file($tpl_file))
		{
			die('template::parse() - "' . $tpl_file . '" does not exist or is not a file.');
		}
		$tpl_content = file_get_contents($tpl_file);

		foreach ($this->tpl_vars AS $var => $content)
		{
			$tpl_content = str_replace('{' . $var . '}', $content, $tpl_content);
		}
		return $tpl_content;
	}

	function display($tpl_file)
	{
		echo $this->parse($tpl_file);
	}
}
?>
این فایل آموزش استفاده از کلاس :

<?php

require_once('tpl.class.php');
$tpl =& new template();
$tpl->assign(array(
    'title'   => 'Simple Template Engine Test',
    'content' => 'This is a test of the <a href="http://www.php.net">Simple Template Engine</a>'
));
$tpl->display('example.tpl');

?>

این هم فایل example.tpl 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>{title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>

<p>{content}</p>

</body>
</html>

_عملکرد کلاس_

3 تا تابع اصلی داره این کلاس
function assign($var_array)
این تابع کار مقدار دهی رو انجام می ده . بهتر بگم ذخیره مقدار ها
اول از همه چک می کنه که ورودی تابع یک آرایه باشه .. در غیر این صورت خطا صورت می گیره
سپس متغیر جدید با متغیر های قبلی ادقام می شوند. در صورت وجود ابهام در مورد عملکرد array_merge به اینجا نگاهی بی اندازید.

function parse($tpl_file)
این تابع کار اصلی رو انجام می ده ، یعنی باید مقدار متغیر ها رو جایگذین کنه .
ابتدا بررسی می کنه که آیا فایلی که آدرس داده شده موجو هست یا خیر. در صورتی که وجود نداشته باشه خطا صادر می شه .
در خط بعد توسط تابع file_get_contents تمامی اطلاعات موجود در فایل مورد نظر بصورت استرینگ به متغیر tpl_content$ داده می شود. در صورت وجود ابهام در مورد عملکرد تابع file_get_contents به اینجا نگاهی بی اندازید. 
سپس توسط یک foreach ساده و با کمک تابع str_replace مقدار متغیر ها جایگذین نام متغیر ها می شوند.
در صورت وجود ابهام در مورد عملکرد تابع str_replace به اینجا نگاهی بی اندازید.
در صورت وجود ابهام در مورد عملکرد foreach به اینجا نگاهی بی اندازید

function display($tpl_file)
این تابع هم وظیفه نمایش اطلاعات رو به عهده داره.

_عملکرد فایل آموزش استفاده از کلاس_

ابتدا فایل کلاس رو صدا زده . سپس یک شی رو به کلاس نسبت داده . سپس یک آرایه رو در موتور تمپلت ذخیره کرده . با استفاده از تابع Display فایل رو نمایش داده . 

فکر نمی کنم موضوع مبهمی مونده باشه .. موفق باشید.

----------


## hidensoft

خوشبختانه دوستان زیادی به استفاده از Oop تشویق شدن و دارن روش کار می کنند .
قدم بعدی ساخت یک وبلاگ هست که در ابتدا هیچ امکاناتی نداره ولی در ادامه می خوایم گسترشش بدیم تا دوستان با مفاهیم Mvc .. طراحی دیتا بیس .. منطق کلی Oop .. بیشتر آشنا بشوند .
موفق باشید

----------


## hidensoft

ساخت یک موتور جستو جو گر سریع و کارآمد یکی از دق دقه های یک برنامه نویسه ، من حتی قبل از اینکه یک پروژه رو شروع کنم روس سرچ فکر می کنم . .. امروز یک کلاس بسازیم که به سریع ترین وجه ممکن و به بهترین نحوه به ما جواب مورد نظرمون رو بده ، از همه مهم تر اصولی باشه و قابل ارتقاع و سفارشی باشه .. 

class.search.php

<?php

class search_engine
{
    function search_engine($mysql)
    {
        # set database connection
        $this->host = $mysql[0];
        $this->username = $mysql[1];
        $this->password = $mysql[2];
        $this->database = $mysql[3];
        $this->link = mysql_connect($this->host,$this->username,$this->password) or die(mysql_error());
        $this->db_selected = mysql_select_db($this->database,$this->link) or die(mysql_error());
        $this->found = array();
    }
    function set_table($table)
    {
        # set table
        $this->table = $table;
    }
    function set_keyword($keyword)
    {
        # set keywords
        $this->keyword = explode(" ", $keyword);
    }
    function set_primarykey($key)
    {
        # set primary key
        $this->key = $key;
    }
    function set_fields($field)
    {
        # set fieldnames to search
        $this->field =$field;
    }
    function set_dump()
    {
        # var dump objects
        echo '<pre>';
        var_dump($this->found);
        echo '</pre>';
    }
    function set_total()
    {
        # total results found
        return sizeof($this->found);
    }
    function set_result()
    {
        # find occurence of inputted keywords
        $key =  $this->key;
        for ($n=0; $n<sizeof($this->field); $n++)
        {
            for($i =0; $i<sizeof($this->keyword); $i++)
            {
                $pattern = trim($this->keyword[$i]);
                $sql = "SELECT * FROM ".$this->table." WHERE `".$this->field[$n]."` LIKE '%".$pattern."%'";
                $result = mysql_query($sql);
                while ($row = mysql_fetch_object($result) AND !empty($pattern))
                {
                    $this->found[] = $row->$key;
                }
            }
        }
        $this->found = array_unique($this->found);
        return $this->found;
    }
}
?>
process.php

<?php

require_once 'class.search.php';

$config = array('localhost','root','','database');
$table = 'bizmain';
$key = 'biz_id';
$fields = array('biz_name','biz_address','biz_cat');

$keyword = $_POST['keyword'].' '.$_POST['location'];

$found = new search_engine($config);
$found->set_table($table);
$found->set_primarykey($key);
$found->set_keyword($keyword);
$found->set_fields($fields);

$result = $found->set_result();
print_r($result);

?>form.php

<form method=post action=process.php>
<table border=1>
<tr>
    <td>Search by name, category or keywords</td>
    <td><input  name=keyword></td>
</tr>
    <td>&nbsp;</td>
    <td><input type=submit value=Submit></td>
</table>
</form>sql

CREATE TABLE `bizmain` (
  `biz_id` mediumint(8) unsigned NOT NULL auto_increment,
  `biz_name` varchar(100) default NULL,
  `biz_address` varchar(255) default NULL,
  `biz_phone` varchar(100) default NULL,
  `biz_email` varchar(100) default NULL,
  `biz_url` varchar(100) default NULL,
  `biz_cat` varchar(100) default NULL,
  PRIMARY KEY  (`biz_id`)
) ;

INSERT INTO `bizmain` (`biz_id`, `biz_name`, `biz_address`, `biz_phone`, `biz_email`, `biz_url`, `biz_cat`) VALUES (1, 'LocalFilipino.com', 'Makati, Philippines', '(632) 848-0886', 'info@localfilipino.com', 'http://www.localfilipino.com', 'Advertising'),
(2, 'Liberty Realty', '2451 S. Buffalo Drive, Suite 145, Las Vegas, NV 89117', '(702) 248-8899', 'info@libertyrealty.com', 'http://www.libertyrealty.com', 'Real Estate, Realty'),
(3, 'FRS Philippine Freight', '5960 Spring Mtn Rd, 3-D<br> Las Vegas, NV 89146', '(702) 253-7555', 'info@frsphilippines.com', 'http://www.frsphilippines.com', 'Freight, Cargo');

Output

output.jpg

----------


## oxygenws

به نظرت این پست آخر به OOP ربطی داره؟؟؟؟؟؟؟

----------


## zamanphp

محمد عزیز
بهتره این بحث های تکراری  رو بزاری کنار و درباره الگوهای طراحی مطلب بزاری تا ملت حال کنند
نظیر :
Strategy Pattern
Factory Pattern
A bstract Factory
Ad apter Pattern
Sin gleton Pattern
Iterator Pattern
Observer Pattern
Proxy Pattern یا Lazy Loading
Decorator Pattern
Active Record Pattern
Facade Pattern

----------


## hidensoft

سلام به شما دوست عزیز .
سرم خیلی شلوغه نمی رسم بیام درست حسابی روی آموزش کار کنم اما به محض اینکه سرم خلوت بشه حتما این کارو می کنم .. از توجه شما هم بسیار سپاس گذارم.

----------


## cs2007

سلام.
من فکر میکنم کار خوبی است که از ابتدا به طرف بالا برویم ... همین کاری را که شما دارید انجام میدهید ...

----------


## Sociant7

مقدمه ای بر الگوهای طراحی 
منبع : (professional php5  ,wiley publishing)
در فصلهای پیشی (فصلهای قبلی از همین منبع) یاد گرفتید که اشیا می توانند از اشیاء پدر بوسیله ارث بری مشتق شوند. همچنین دیدید که اشیا میتوانند ارجاء هایی به اشیاء دیگر را نیز شامل شوند. بطور کلی تکنیک ترکیب کردن اشیاء از اشیاء دیگر را در اصطلاح ترکیب اشیاء می نامند (object composition).
هر دوی ارث بری و ترکیب اشیاء ابزارهای قدرتمندی برای طراحی نرم افزار های شی گرا هستند و امکان  وسیعی برای  انتخاب طراحی (نوع طراحی ) فراهم می کنند. البته داشتن گستردگی انتخاب همیشه تصمیم گیری را آسانتر نمی کند! شما نرم افزارتان را چگونه طراحی میکنید که نگهداری و توسعه پذیری آسانی داشته باشد؟ اجزاء برنامه تان را چگونه طراحی میکنید که افراد دیگر تیم براحتی با استفاده از یک واسط ساده بتوانند از آن استفاده کنند؟ شما میتوانید مشکلات معینی را خودتان با استفاده از هوش ، تجربه ، خوش شانسی و ترکیبی از این ها حل کنید. 
ممکن است شما از کدهای موجود نوشته شده توسط خودتان برای حل مشکلی استفاده کنید. شاید شما اسکریپت استانداردی برای اتصال به پایگاه داده داشته باشید. الگوهای طراحی اندکی متفاوت هستند، آنها درباره استفاده مجدد از کد نیستند، آنها خیلی کلی تر از این هستند. الگوهای طراحی درباره استفاده مجدد از ایده ها هستند. وقتی شما یک الگو را بشناسید ، تشخیص خواهید داد که در کجا سودمند خواهد بود. سپس میتوانید پیش بروید و آنرا پیاده سازی کنید، با علم به اینکه یک راه حل پذیرفته شده است.
یک الگوی طراحی راهی برای حل یک مشکل مرسوم است. روشی است که نشان می دهد که یک شی یا مجموعه ای از اشیاء ساخت یافته چگونه با اشیاء دیگر موجود در الگو همکاری و ارتباط برقرار می کند. 
هر الگو نامی توصیف کننده دارد ، مانند مشاهده گر (observer) یا مشاهده شونده (observable) و هر الگو طراحی مشخصی دارد که بوسیله نمودار کلاس نمایش داده می شود(نمودار کلاس یکی از نمودارهای زبان   UML می باشد).
ممکن است دز ابتدا الگوها در ابتدا گیج کننده به نظر برسند. اگر این مقدمه اولیه واضح به نظرتان نرسید نگران نباشید ، شما در این فصل روی 5 الگوی متفاوت بر مبنای کدهایی که در چند فصل گذشته دیدید، کار خواهید کرد.
-----
ببخشید اگه خوب ترجمه نکردم!
بطور خلاصه الگوهای طراحی روشهای مرسوم و از قبل تعریف شده ای برای حل مشکلات و مسائل مرسومی هستند که شما حین انجام پروژه هاتون بهشون برخورد میکنید ، مثلا الگوی singleton موقعی کاربرد داره که شما بخواید از یک کلاس در یک زمان فقط یک شی وجود داشته باشه، الگوی factory وقتی مفیده که بخواین از یک کلاس برای ایجاد اشیائی از کلاسهای متفاوت استفاده کنید و ...

----------


## majoran

خیلی بحث جالبی بود تا حالا به اینجا سر نزده بودم دستتون درد نکنه آقا یک لطف می کنید در رابطه با اینکه چطور با آجاکس این کلاس ها را ترکیب کنیم صحبت بکنید که مثلا با فشار دادن فلان دکمه فلان کلاس اجرا شود و.....
باز هم متشکرم

----------


## niaz_85

سلام
ببخشید من یه مشکل دلرم.phpeditor رو نصب کردم...ولی وقت اجرا پیغام میده مفسری پیدا نکرده....باید چیکار کنم؟

----------


## hidensoft

زدن کلید تشکر به تنهایی راضی کننده نبود. از Sociant7 و سایر دوستان کمال تشکر رو دارم
واقعا عالی بود Sociant7

----------


## hidensoft

سلام . بازم برگشتم که یکی دوتا مقاله توپ در مورد PHP براتون بگذارم. اما این تمام مقاله ها رو در مورد Pattern ها در PHP می نویسم. امید وارم مورد توجه شما دوستان عزیز قرار بگیرد.

امروز می خام MVC Pattern که یکی از مهم ترین نکات PHP هست رو براتون شرح بدم . 

MVC چیست ؟

Model View Control

Model
کلاس های مربوط به دیتابیس در این قسمت قرار می گیرند.
View
اطلاعات مربوط به صفحه خروجی در این قسمت قرار می گیرند.
control
اطلاعات اصلی در این قسمت قرار می گیرد .



همونطور که در عکس می بینید ابتدا درخاست به control فرستاده می شود . ابتدا control در صورت نیاز اطلاعات در دیتا بیس را از Model می گیرد و در نهایت اطلاعات نهایی رو به View می فرستد.

نحوه استفاده از Model و View و Control بسیار مهم هست . اگر شما یک MVC قوی داشته باشید . حتما یک framework قوی هم دارید. بله شما می توانید با استفاده از MVC یک فریم ورک مختص به خودتون داشته باشید . نیاز های خودتون را در یک فریم ورک جمع اوری کنید و براحتی پرتال بسازید.

در مرحله بعد باهم یک MVC ساده رو می سازیم تا شما بیشتر با این Pattern آشنایی پیدا کنید.

موفق و پیروز باشید.

----------


## hidensoft

سلام دوستان . 
امروز نوبت ساختن یک mvc سادست.
در ابتدا این تمام کد هارو می نویسم . شما سوال حاتون رو بپرسید . من و دیگر دوستان هر زمان که بتونیم جواب می دیم.

index.php
<?php
require_once('lib/DataAccess.php');
require_once('lib/ProductModel.php');
require_once('lib/ProductView.php');
require_once('lib/ProductController.php');

$dao=& new DataAccess ('localhost','user','pass','dbname');
$productModel=& new ProductModel($dao);
$productController=& new ProductController($productModel,$_GET);
echo $productController->display();
?>

lib/ProductView.php
<?php
/**
 *  Binds product data to HTML rendering
 */
class ProductView {
    /**
    * Private
    * $model an instance of the ProductModel class
    */
    var $model;

    /**
    * Private
    * $output rendered HTML is stored here for display
    */
    var $output;

    //! A constructor.
    /**
    * Constucts a new ProductView object
    * @param $model an instance of the ProductModel class
    */
    function ProductView (&$model) {
        $this->model=& $model;
    }

    //! A manipulator
    /**
    * Builds the top of an HTML page
    * @return void
    */
    function header () {
        $this->output=
		<<<EOD
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> Our Products </title>
<style>
body { font-size: 13.75px; font-family: verdana }
td { font-size: 13.75px; font-family: verdana }
.title { font-size: 15.75px; font-weight: bold; font-family: verdana }
.heading {
    font-size: 13.75px; font-weight: bold;
    font-family: verdana; background-color: #f7f8f9 }
.nav { background-color: #f7f8f9 }
</style>
</head>
<body>
<div align="center" class="title">Our Products</div>
EOD;
        $this->output.="\n<div align=\"right\"><a href=\"".
            $_SERVER['PHP_SELF']."\">Start Over</a></div>\n";

    }

    //! A manipulator
    /**
    * Builds the bottom of an HTML page
    * @return void
    */
    function footer () {
        $this->output.="</body>\n</html>";
    }

    //! A manipulator
    /**
    * Displays a single product
    * @return void
    */
    function productItem($id=1) {
        $this->model->listProduct($id);
        while ( $product=$this->model->getProduct() ) {
            $this->output.="<p><b>Name</b>:".$product['PRODUCTNAME']."</p>".
                "<p><b>Price</b>:".$product['UNITPRICE']."</p>".
                "<p><b># In Stock</b>:".$product['UNITSINSTOCK']."</p>";
            if ( $this->$product['DISCONTINUED']==1 ) {
                $this->output.="<p>This product has been discontinued.</p>";
            }
        }
    }

    //! A manipulator
    /**
    * Builds a product table
    * @return void
    */
    function productTable($rownum=1) {
        $rowsperpage='20';
        $this->model->listProducts($rownum,$rowsperpage);
        $this->output.="<table width=\"600\" align=\"center\">\n<tr>\n".
                "<td class=\"heading\">Name</td>\n".
                "<td class=\"heading\">Price</td>\n</tr>\n";
        while ( $product=$this->model->getProduct() ) {
            $this->output.="<tr>\n<td><a href=\"".$_SERVER['PHP_SELF'].
                "?view=product&id=".$product['PRODUCTID']."\">".
                $product['PRODUCTNAME']."</a></td>".
                "<td>".$product['UNITPRICE']."</td>\n</tr>\n";
        }
        $this->output.="<tr class=\"nav\">\n";
        if ( $rownum!=0 && $rownum > $rowsperpage ) {
            $this->output.="<td><a href=\"".$_SERVER['PHP_SELF'].
                "?view=table&rownum=".($rownum-$rowsperpage).
                "\"><< Prev</a></td>";
        } else {
            $this->output.="<td>&nbsp;</td>";            
        }
        if ( $product['PRODUCTID'] < ($rownum + $rowsperpage) ) {
            $this->output.="<td><a href=\"".$_SERVER['PHP_SELF'].
                "?view=table&rownum=".($rownum+$rowsperpage).
                "\">Next >></a></td>";
        } else {
            $this->output.="<td>&nbsp;</td>\n";            
        }
        $this->output.="</tr>\n</table>\n";
    }

    //! An accessor
    /**
    * Returns the rendered HTML
    * @return string
    */
    function display () {
        return $this->output;
    }
}
?>

lib/ProductController.php
<?php
/**
 *  Controls the application
 */
class ProductController extends ProductView {

    //! A constructor.
    /**
    * Constucts a new ProductController object
    * @param $model an instance of the ProductModel class
    * @param $getvars the incoming HTTP GET method variables
    */
    function ProductController (&$model,$getvars=null) {
        ProductView::ProductView($model);
        $this->header();
        switch ( $getvars['view'] ) {
            case "product":
                $this->productItem($getvars['id']);
                break;
            default:
                if ( empty ($getvars['rownum']) ) {
                    $this->productTable();
                } else {
                    $this->productTable($getvars['rownum']);
                }
                break;
        }
        $this->footer();
    }
}
?>

lib/ProductModel.php
<?php
/**
 *  Fetches "products" from the database
 */
class ProductModel {
    /**
    * Private
    * $dao an instance of the DataAccess class
    */
    var $dao;

    //! A constructor.
    /**
    * Constucts a new ProductModel object
    * @param $dbobject an instance of the DataAccess class
    */
    function ProductModel (&$dao) {
        $this->dao=& $dao;
    }

    //! A manipulator
    /**
    * Tells the $dboject to store this query as a resource
    * @param $start the row to start from
    * @param $rows the number of rows to fetch
    * @return void
    */
    function listProducts($start=1,$rows=50) {
        $this->dao->fetch("SELECT * FROM products LIMIT ".$start.", ".$rows);
    }

    //! A manipulator
    /**
    * Tells the $dboject to store this query as a resource
    * @param $id a primary key for a row
    * @return void
    */
    function listProduct($id) {
        $this->dao->fetch("SELECT * FROM products WHERE PRODUCTID='".$id."'");
    }

    //! A manipulator
    /**
    * Fetches a product as an associative array from the $dbobject
    * @return mixed
    */
    function getProduct() {
        if ( $product=$this->dao->getRow() )
            return $product;
        else
            return false;
    }
}
?>

Dataaccess.php
<?php
/**
 *  A simple class for querying MySQL
 */
class DataAccess {
    /**
    * Private
    * $db stores a database resource
    */
    var $db;
    /**
    * Private
    * $query stores a query resource
    */
    var $query; // Query resource

    //! A constructor.
    /**
    * Constucts a new DataAccess object
    * @param $host string hostname for dbserver
    * @param $user string dbserver user
    * @param $pass string dbserver user password
    * @param $db string database name
    */
    function DataAccess ($host,$user,$pass,$db) {
        $this->db=mysql_pconnect($host,$user,$pass);
        mysql_select_db($db,$this->db);
    }

    //! An accessor
    /**
    * Fetches a query resources and stores it in a local member
    * @param $sql string the database query to run
    * @return void
    */
    function fetch($sql) {
        $this->query=mysql_unbuffered_query($sql,$this->db); // Perform query here
    }

    //! An accessor
    /**
    * Returns an associative array of a query row
    * @return mixed
    */
    function getRow () {
        if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
            return $row;
        else
            return false;
    }
}
?>

----------


## tabib_m

سلام
ممنون بابت مطالب خوب و آموزنده :)

ProductView::ProductView($model); 
میشه توضیح بدی که این خط چه کاری میکنه؟
باز هم ممنون

موفق باشید.

----------


## hidensoft

ProductView::ProductView($model); 
یا
parent::ProductView($model); 
یا
$this->ProductView($model);

هر سه یک عمل رو انجام می دن . اما کاری که انجام می ده که تابع ProductView رو اجرا می کنه .
توجه داشته باشید دوستان که ProductController بچه کلاس ProductView هستش . و همون طور که قبلا هم توضیح داده شد هر شی می تونه از توابع والد خودش با استفاده از parent و this$ استفاده کنه . باید اضافه کنم که با استفاده از نام شی والد هم می شه به توابع آن دسترسی داشت.

امید وارم جواب سوالتون رو داده باشم.
موفق باشید.

----------


## musiox

ProductView::ProductView($model); 

برای فراخوانی متد های استاتیک هستش . در صورتی که متد استاتیک نباشه اینجوری فراخوانی بشه ( البته تا اونجایی که من یادمه ) یه E_NOTICE ایجاد می شه .

----------


## aryaei2000

تاپیک جالبی بود ممنون

----------


## aryaei2000

این تاپیک عالیه

----------


## aryaei2000

فوق العاده است
ممنونم

----------


## aryaei2000

فوق العاده است

----------


## hidensoft

بی شک یکی از مشکلات برنامه نویسان Valid کردن اطلاعات ورودی هست . معمولا هم ما با استفاده از IF ... ELSE کار خودمونو راه می ندازیم. اما بهتره از Strategy Pattern استفاده بشه . بی شک به شما خیلی بیشتر کمک می کنه . برنامه هم خانایی بیشتری پیدا می کنه .
بهتره بریم سر اصل مطلب . 
validator.php
<?php
/**
 *  کلاس اصلی
 */
class Validator {
    /**
    * Private
    * $errorMsg نگهداری خطا ها در صورت وجود
    */
    var $errorMsg;
    //! A constructor.
    /**
    * ساخت یک شی validator جدید
    */
    function Validator () {
        $this->errorMsg=array();
        $this->validate();
    }
    /**
    * @return void
    */
    function validate() {
       
    }
    /**
    * اضافه کردن خطا به آرایه
    * @return void
    */
    function setError ($msg) {
        $this->errorMsg[]=$msg;
    }
    /**
    * بازگشت درست و غلط 
    * @return boolean
    */
    function isValid () {
        if ( isset ($this->errorMsg) ) {
            return false;
        } else {
            return true;
        }
    }
    /**
    *  بدست آوردن خطا ها
    * @return string
    */
    function getError () {
        return array_pop($this->errorMsg);
    }
}
/**
 *valid کردن username
 */
class ValidateUser extends Validator {
    /**
    * $user متغیر مورد نیاز
    */
    var $user;
    /**
    * اخت یک شی validatoruser جدید
    * @param $user the string to validate
    */
    function ValidateUser ($user) {
        $this->user=$user;
        Validator::Validator();
    }
    /**
    * Validates کردن username
    * @return void
    */
    function validate() {
        if (!preg_match('/^[a-zA-Z0-9_]+$/',$this->user )) {
            $this->setError('Username contains invalid characters');
        }
        if (strlen($this->user) < 6 ) {
            $this->setError('Username is too short');
        }
        if (strlen($this->user) > 20 ) {
            $this->setError('Username is too long');
        }
    }
}
/**
 *  Validate کردن  password
 */
class ValidatePassword extends Validator {
    /**
    * $pass متغیر مورد نیاز
    */
    var $pass;
    /**
    * $conf متغیر تکرار کلمه عبور
    */
    var $conf;
    /**
    * ساخت ValidatePassword شی جدید
    * @param $pass the string to validate
    * @param $conf to compare with $pass for confirmation
    */
    function ValidatePassword ($pass,$conf) {
        $this->pass=$pass;
        $this->conf=$conf;
        Validator::Validator();
    }
    /**
    * Validates کردن  password
    * @return void
    */
    function validate() {
        if ($this->pass!=$this->conf) {
            $this->setError('Passwords do not match');
        }
        if (!preg_match('/^[a-zA-Z0-9_]+$/',$this->pass )) {
            $this->setError('Password contains invalid characters');
        }
        if (strlen($this->pass) < 6 ) {
            $this->setError('Password is too short');
        }
        if (strlen($this->pass) > 20 ) {
            $this->setError('Password is too long');
        }
    }
}
/**
 *  Validates کردن email address
 */
class ValidateEmail extends Validator {
    /**
    * $email متغیر مورد نیاز
    */
    var $email;
    /**
    * جدید ValidateEmail ساخت شی
    * @param $email the string to validate
    */
    function ValidateEmail ($email){
        $this->email=$email;
        Validator::Validator();
    }
    /**
    * Validates کردن email address
    * @return void
    */
    function validate() {
        $pattern=
    "/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)+/";
        if(!preg_match($pattern,$this->email)){
            $this->setError('Invalid email address');
        }
        if (strlen($this->email)>100){
            $this->setError('Address is too long');
        }
    }
}
?>
index.php
<?php
if ( $_POST['register'] ) {
    require_once('lib/Validator.php');
    $v['u']=new ValidateUser($_POST['user']);
    $v['p']=new ValidatePassword($_POST['pass'],$_POST['conf']);
    $v['e']=new ValidateEmail($_POST['email']);
    foreach($v as $validator) {
        if (!$validator->isValid()) {
            while ($error=$validator->getError()) {
                $errorMsg.="<li>".$error."</li>\n";
            }
        }
    }
    if (isset($errorMsg)) {
        print ("<p>There were errors:<ul>\n".$errorMsg."</ul>");
    } else {
        print ('<h2>Form Valid!</h2>');
    }
} else {
?>
<h2>Create New Account</h2>
<form action="<?php echo ($_SERVER['PHP_SELF']); ?>" method="post">
<p>Username: <input type="text" name="user"></p>
<p>Password: <input type="password" name="pass"></p>
<p>Confirm: <input type="password" name="conf"></p>
<p>Email: <input type="text" name="email"></p>
<p><input type="submit" name="register" value=" Register "></p>
</form>
<?php
}
?>
فکر نمی کنم نیاز به توضیح خاصی باشه .
موفق باشید.

----------


## Arman_gh

من قبلا نوشتاری در زمینه‌ی ساخت فریم‌ورک MVC با PHP نوشته‌ام. شاید به درد کسی خورد.

----------


## hidensoft

سلام
امید وارم که آموزش های قبلی به شما کمک کرده باشه که در برنامه نویسی PHP پیشرفت داشته باشید .
امروز می خوام براتون یک کلاس رو بگذارم . این کلاس به شما کمک می کنه خیلی راحت اواع کوئری رو انجام بدید و خیالتون راحت باشه که هیچ وقت SQL Injection نمی تونه به برنامه شما نفوذ کنه .

<?php

class mysql {

	// Database server information 
    var $host;                 // (string)  Host server of database
    var $user;                 // (string)  User
    var $password;             // (string)  Password
    var $db_name;              // (string)  Database that will be selected
    var $port;                 // (int)     Server port
    var $connection = false;   // (link identifier)   MySQL connection link identifier 
    var $result;               // (link identifier)   MySQL result link identifier 
    
    // Class operation setup
    
    
    // 0 LOG_NONE 
    // 1 ECHO
    // 2 HIDDEN ECHO
    // 3 LOG FILE
    var $debuglv  = 2 ;
    var $error_level  = 0 ;
    var $error_desc   = "No errors" ;
    var $logfile      = "datalog" ;
    var $filehdl      = 0 ;
    var $messsages    = array() ;  
      
    var $affected_rows = 0 ;    
    var $num_rows      = 0 ;    
    var $recordcount   = 0 ;    
    var $lastid        = 0 ;
    var $sqlString;
    
    var $query_no     = 0 ;    



	function mysql($host = "", $user = "", $password = "", $db_name = "", $port = "")
	{
        $this->host     = ( !empty( $host ) )      ?  (string)$host      :  "localhost";
        $this->user     = ( !empty( $user ) )      ?  (string)$user      :  "root";
        $this->password = ( !empty( $password ) )  ?  (string)$password  :  "";
        $this->db_name  = ( !empty( $db_name ) )   ?  (string)$db_name   :  "";
        $this->port     = ( !empty( $port ) )      ?  (int)$port         :  3306;
	}




    function connect($is_persistent = false)
    {    	    	
    	$this->logfile_init() ;

        if (!$is_persistent) {
            $this->connection = @mysql_connect($this->host.':'.$this->port, $this->user, $this->password);
        } else {
            $this->connection = @mysql_pconnect($this->host.':'.$this->port, $this->user, $this->password);
        }
        $this->error_report() ;
        
        if (!$this->connection) {
	      // Conection failed
	      $this->add_debug_message ( date("d/m/Y - H:i:s") . " - ERROR " . $this->error_level . ": " . $this->error_desc . "\r\n" ) ;	      
	      $this->release_db() ;
        } else { $this->select_db(); }        
    }

	function  select_db($db_name=false){
		 if ($db_name !== false) $this->db_name=$db_name;
		 
      // Select a database...
      if (@mysql_select_db($this->db_name,$this->connection)) {
        // Selecting Database OK
        $this->add_debug_message ( date("d/m/Y - H:i:s") . " - OPERATION O.K.: Connected to database " . $this->db_name .  "\r\n" );
      } else {
        // Failed to select the database... abort connection process
        $this->error_report() ;
        $this->add_debug_message ( date("d/m/Y - H:i:s") . " - ERROR " . $this->error_level . ": " . $this->error_desc . "\r\n" ) ;
        $this->release_db() ;
        }        		 
	}
	
  // Releasing database connection
  function release_db()
    {
    // Checking if a conection is open?
    if ($this->connection) {
      // Trying to close the connection ...
      if (mysql_close($this->connection)) {
        $this->add_debug_message ( date("d/m/Y - H:i:s") . " - OPERATION O.K.: Database " . $this->db_name . " released" . "\r\n" );
      } else {
        // Failed to liberate the database...
        $this->error_report() ;
        $this->add_debug_message ( date("d/m/Y - H:i:s") . " - ERROR " . $this->error_level . ": " . $this->error_desc . "\r\n" );
        }
    } else {
      // No database open
      $this->add_debug_message ( date("d/m/Y - H:i:s") . " - OPERATION CANCELLED: No database open" . "\r\n" );
      }
    // LOG the operation and close logging operations
    $this->debug() ;
    $this->logfile_close() ;
    }
    

  // Error reporting auxiliary method
  function error_report()
    {
    $this->error_level = mysql_errno() ;
    $this->error_desc = mysql_error() ;
    }

  // Log operations initialization
  function logfile_init()
    {      
    if ($this->debuglv==3) {
         $this->add_debug_message ( date("d/m/Y - H:i:s") . " ===== SESSION STARTED BY " . $GLOBALS["PHP_SELF"] . " =====" .  "\r\n" );
         $this->logfile = $this->logfile . "-" . date("m") . "-" . date("Y") ;
         $this->filehdl = fopen($this->logfile,'a') ;
         if (!$this->filehdl) {
                echo "<!-- UNABLE TO OPEN SPECIFIED LOG FILE " . $this->logfile . " -->" ;
                $this->debuglv-- ;
                $this->logfile_init() ;
                }
              break ;
      }
    $this->debug() ;
    }
    
  // Closing log operations
  function logfile_close()
    {
    if ($this->filehdl) {
      // If we opened a file to log operations need to close it
      fclose($this->filehdl) ;
      }
    }

  function add_debug_message($message)
    {
    	$this->messsages[]=$message;
    }

  // Debugging operations
  function debug()
    {
    switch ($this->debuglv) {
      case 0: // NO LOG OPERATIONS
              break ;
      case 1: // SCREEN OUTPUT
              foreach ($this->messsages as $m) {
                echo '<BR>DEBUG: ' . $m . '<BR>' ;
              }  
              break ;
      case 2: // SILENT OUTPUT (<!-- -->)
              foreach ($this->messsages as $m) {
                echo "\n<!-- DEBUG: " . $m . "-->\n" ;
              }  
              break ;
      case 3: // FILE OUTPUT
              foreach ($this->messsages as $m) {
                fwrite($this->filehdl,$this->msg) ;
              }  
              break ;
      }
    }    


  // Destructor
    function destroy()
      {
        $this->release_db() ;
      } 
    
       
    // performes an sqlQuery
	function query($sqlString)
	  {
	  	$this->sqlString=$sqlString;
	  	$this->query_no++;  
	  	
	    if ($this->connection !== false) {
	      $this->result = mysql_query($sqlString,$this->connection) ;	
	      $this->error_report() ;
	      // Affectected rows...
	      if ($this->result) {
	        // Execution was o.k.	      
	        $this->affected_rows = mysql_affected_rows( $this->connection );
	        if (is_resource($this->result)) { 
	        	$this->num_rows = mysql_num_rows( $this->result ); 
	        } else $this->num_rows = 0;
	        $this->lastid = mysql_insert_id( $this->connection );
	        $this->add_debug_message( date("d/m/Y - H:i:s") . " - OPERATION O.K.: Executed [" . $this->sqlString ."] [affected " . $this->affected_rows . " rows] [rows in result " . $this->num_rows . " ]" . "\r\n" );
	        return true;
	      } else {
	        // Execution Failed
	        $this->affected_rows = 0 ;       
	        $this->num_rows = 0 ;       
	        $this->add_debug_message( date("d/m/Y - H:i:s") . " - OPERATION FAILED: Executed [" . $this->sqlString . "] got " . $this->error_level . " " . $this->error_desc . "\r\n" );
	        return false;
	        }
	    } else {
	      // No database ready to query
	      $this->affected_rows = 0 ;
	      $this->num_rows = 0 ;
	      $this->add_debug_message( date("d/m/Y - H:i:s") . " - OPERATION FAILED: No database open OR no SQL command provided" . "\r\n"  );
	      return false;
	      }	       
	  } 
	  
	function fetch_assoc( $result = false )
	   {
            if ( $result === false ) $result = $this->result;
	    return mysql_fetch_assoc( $result  );
	   }
	
	function clean_data($data)
	  {
	  return mysql_real_escape_string($data,$this->connection);	
	  }

	function fetch_data_array () 
	   {
    	$data=array();
        while( $row = $this->fetch_assoc() )
            { $data[]=$row; } 
        return $data;    
	   }

	// grabs a list of rows from a tabel ... returnes an array of data  
	function list_table( $table_name, $where = false, $parameters = array () )
	   {
	    $range       = ( isset($parameters['range'])       && !empty($parameters['range']) )       ? $parameters['range']       : " * " ;
	    $sortColumn  = ( isset($parameters['sortColumn'])  && !empty($parameters['sortColumn']) )  ? $parameters['sortColumn']  : false ;
	    $sortType    = ( isset($parameters['sortType'])    && !empty($parameters['sortType']) )    ? $parameters['sortType']    : "ASC" ;
	    $limitOffset = ( isset($parameters['limitOffset']) && !empty($parameters['limitOffset']) ) ? $parameters['limitOffset'] : false ;
	    $rowCount    = ( isset($parameters['rowCount'])    && !empty($parameters['rowCount']) )    ? $parameters['rowCount']    : false ;
	    
	    $queryString= "SELECT $range FROM $table_name ";
	    if ( $where !== false ) $queryString .= " WHERE ".$where;
	    if ( $sortColumn !== false ) $queryString .= " ORDER BY `$sortColumn` $sortType ";	    
	    if ( $rowCount !== false ) {
	    	$queryString .= " LIMIT ";
	    	if ( $limitOffset !== false ) $queryString .= " $limitOffset, ";
	    	$queryString .= " $rowCount ";
	    }
	    
	    $this->query($queryString);
	    if( $this->num_rows < 1 ) { return false; }
	    else { return $this->fetch_data_array(); }
	  }

    // fetch a row from a table 
	function fetch_row( $table_name, $where = false , $parameters = array () )
	  {
      $range       = ( isset($parameters['range'])       && !empty($parameters['range']) )       ? $parameters['range']       : " * " ;
      $range       = ( isset($parameters['range'])       && !empty($parameters['range']) )       ? $parameters['range']       : " * " ;
	  	    	
  	  $queryString= "SELECT $range FROM $table_name ";
  	  if ( $where != false ) $queryString .= " WHERE $where LIMIT 1";

	  $this->query($queryString);	 

	  if( $this->num_rows < 1 ) { return false; }
	  else { return $this->fetch_assoc(); }	    	  
  	  }

    function count_records( $table_name, $where =false , $parameters = array() )
  	  {      	  	    	
  	  $queryString= "SELECT COUNT(*) as rNumber FROM $table_name ";
  	  if ( $where != false ) $queryString .= " WHERE $where ";
	  if ($this->query($queryString) == true ){
	  	$row=$this->fetch_assoc();
	  	return $row["rNumber"];
	  } else return false;	  
  	  }
  	  
    function increment_field( $table_name, $field, $where, $parameters = array() )
      {
  	  $queryString= "UPDATE $table_name SET `$field`=`$field`+1  WHERE $where ";
	  $this->query($queryString);	       	
      }

    function record_update( $table_name, $data, $where, $parameters = array() )
	  {
	  $queryString="UPDATE ".$table_name." SET ";
	  $fields=array();
		
	  foreach ($data as $key=>$value)	{ 
	  	$fields[] = " `$key`='".$this->clean_data( $value )."' "; 
	  }
	  $queryString .= implode(',',$fields)." WHERE ".$where;    	
		
	  return $this->query($queryString);	       	
	  }

    function record_insert( $table_name, $data, $parameters = array() )
      {
	  $queryString="INSERT INTO ".$table_name." (";  
	  $columns=array();    	
	  $values=array();
	  
      foreach ($data as $key=>$value)
      	{ 
          	$columns []= '`'.$key.'`'; 
          	$values  []= "'".$this->clean_data( $value )."'";
        }	  
          
      $queryString .= implode(',',$columns) .") VALUES (". implode(',',$values) .") ";          
      
	  return $this->query($queryString);	       	      
      }
 
    function record_delete( $table_name, $where, $parameters = array() )
      {
      $queryString = "DELETE FROM ". $table_name ." WHERE ". $where; 
	  $this->query($queryString);	       	            	
      }      

    function table_info($table_name)
      {
	   $this->query(" SELECT * FROM $table_name LIMIT 1");	       	            	
	   $fields = mysql_num_fields($this->result);
	
	   for ($i=0; $i <= $fields; $i++) {
	     $fields[$i]['type'] = mysql_field_type($result, $i);
	     $fields[$i]['name'] = mysql_field_name($result, $i);
	     $fields[$i]['len']  = mysql_field_len($result, $i);
	   }
	
	return $fields;
	}

   function table_max_value( $table, $field)
     {
     $this->query(" SELECT max($field) as max_value FROM $table ");
     $data=$this->fetch_assoc();

     return $data["max_value"];
     }
     
} 
?>


این هم نمونه استفاده از این کلاس


 <?php 

// conection 
$mysql= new mysql('localhost' , 'userSQL', 'passwSQL', 'Selected_DB' ); 
$mysql->connect(); 

// fetch row 
$row=$mysql->fetch_row( 'TableName', " id='12' "); 

// fetch array of rows 
$rows=$mysql->list_table( 'TableName', " column='3' ", array ('range' => 'id,name') );  

// fetch rows from multiple tables 
$rows=$mysql->list_table( ' TableName1 t1,TableName1 t2 ', " t1.column1=t2.column2 ", array ('range' => ' t1.column1_1, t2.column1_2 ') );  


// fetch whole table 
$tableList=$mysql->list_table( 'TableName', false ,  ); 


// fetch a part of a table - pagination example  
$parameters['limitOffset']=10; # Offet Start  
$parameters['rowCount']=10; # No of rows returned 
$where=" columnName='3' "; 
$tableList=$mysql->list_table( 'TableName', where , $parameters ); 

$data=array('columnName1' => 'value1', 
            'columnName2' => 'value2', 
            'columnName3' => 'value3',         
            );         
// insert data ... it returns true or false 
$insertAtempt=$mysql->record_insert('TableName',$data); 

// update data 
$updateAtempt=$mysql->record_update('TableName',$data," id='3' ");   

     
?>  


این یه آموزش نبود اما شما با استفاده از این کلاس هم کارتون راحت تر میشه هم با نگاه کردن به کدش می تونید چیزای جدیدی یاد بگیرید.

موفق و پیروز باشید

----------


## vahid4134

عزیز دلم چرا از امکانات php5 استفاده نمی کنی و OOP رو به صورت کامل پیاده سازی نکردی (البته استفاده از ابزارها بسیار مناسب بوده) اما نه خبری از protect بود نه public نه ...

----------


## hidensoft

شما گسترشش بدید . اصلاحش کنید . 
من لزومی برای اصتفاده از از protect , public ندیدم . اگه فکر می کنید لازمه اضافه کنید . ممنون می شم که به دیگر برنامه نویسان هم کمک کنید.

----------


## vahid4134

> شما گسترشش بدید . اصلاحش کنید . 
> من لزومی برای اصتفاده از از protect , public ندیدم . اگه فکر می کنید لازمه اضافه کنید . ممنون می شم که به دیگر برنامه نویسان هم کمک کنید.


قربان تو اگر وقت کنم حتما (ولی روی اینکه وقتم باز میشه اصلا حساب باز نکن :لبخند گشاده!: )
به خاطر مطالب مفیدت واقعا ممنون. (واقعا خوندنش رو به هر کسی که می خواد شی گرایی رو یاد بگیره توصیه می کنم)

----------


## vahid4134

> وحید تو هیچ وقت عوض نمی شی . نمی دونی شناختی یا نه ! اما روزای خوشی رو برات آرزو می کنم.


 :لبخند گشاده!:  (اتفاقا دیدمت حال و هوای شوخی بهم دست داد)
مگه میشه بهترین دوست و عزیزترین دوستم رو یادم بره
عزیز من دیگه توی یاهو نمیام اگر خواستی پیام خصوصی بدم تا .... مخلصتم هستیم
(یادش به خیر)

----------


## vcldeveloper

دوستان، تاپیک عمومی محل یادآوری خاطرات گذشته و دوستان و آشنایان نیست. برای همچین کارهایی از پیام خصوصی یا چت استفاده کنید.

با تشکر

----------


## musiox

به نظر من هم بهتره ( الزامی! ) یه کم بروز تر بگی .

----------


## naser67

> من لزومی برای اصتفاده از از protect , public ندیدم


اشتباه نکن البته یکی رو جا گزاشتی private

اطلاعات مهم مثل user,pass رو که نیازی نیست تو جای دیگه استفاده نشه میتونی private تعریف کنی تا امنیت کدت بالاتر بره

----------


## musiox

> تا امنیت کدت بالاتر بره


چطور؟میشه بیشتر توضیح بدی؟

----------


## naser67

خوب وقتی به یک متغیر فقط از همون کلاس بشه دسترسی داشت به نظر شما امنیت بالاتر نمیره اونم پروپرتی مثل user ,pass که برای اتصال به دیتابیس استفاده میشه

----------


## vahid4134

> خوب وقتی به یک متغیر فقط از همون کلاس بشه دسترسی داشت به نظر شما امنیت بالاتر نمیره اونم پروپرتی مثل user ,pass که برای اتصال به دیتابیس استفاده میشه


البته نمیشه گفت امنیت کد بالاتر میره. چون به هر حال سورس کلاس پدر هم در دسترس هست.
در واقع اینها برای این هستند که وقتی یک نفر می خواد از این کلاس به عنوان object استفاده کنه می دونه که کاری به private و public نداره و کسی هم که می خواد این کلاس رو به عنوان کلاس والد استفاده کنه کاری به private نداره.
اینجوری استفاده از کلاس راحتتر میشه

----------


## naser67

خوب معلومه  کسی که سورس در اختیارشه همه کار میتونه بکنه ولی فکر کن کسی به سورس دسترسی نداشته باشه اونوقت چی؟

حالا یه مثال ساده
فکر کن سورستو زند کردی و نمی خوای که کسی که سورس زند شده رو داره یه متغیر یا مت رو  عوض کنه
حالا اونوقت تکلیف چیه؟

----------


## vahid4134

> خوب معلومه  کسی که سورس در اختیارشه همه کار میتونه بکنه ولی فکر کن کسی به سورس دسترسی نداشته باشه اونوقت چی؟
> 
> حالا یه مثال ساده
> فکر کن سورستو زند کردی و نمی خوای که کسی که سورس زند شده رو داره یه متغیر یا مت رو  عوض کنه
> حالا اونوقت تکلیف چیه؟


حرفهای شما صحیح اما فلسفه وجودی اینها برای توسعه هست نه برای محافظت.
مقوله OOP بیشتر حرفش روی توسعه راحتتر و سریعتر بنا نهاده شده و این خصوصیات برای این هست که توسعه دهنده بدونه که کدی رو که داره برای چی هست و کدوم قسمتهاش رو مهم هست که بدونه.
کسی تا به حال به این صورت کار نکرده که کد زند شده رو به یک توسعه دهنده بده.(البته خود نظر خوبی هم شاید باشه که از کد محافظت بشه).

----------


## naser67

به نظر شما فلسفه وجودی private اینه که کسی که داره برنامه رو توسعه میده بدونه با اون متد یا متغیر نباید کاری داشته باشه؟




> فلسفه وجودی اینها برای توسعه هست نه برای محافظت.


100% مخالفم




> مقوله OOP بیشتر حرفش روی توسعه راحتتر و سریعتر بنا نهاده شده


موافقم البته مقوله امنیت هم حتما لحاظ کردن




> کسی تا به حال به این صورت کار نکرده که کد زند شده رو به یک توسعه دهنده بده.


این یه مثال بود که بگم شرایطی هم هست که کاربر به سورس دسترسی نداره

----------


## musiox

object(myCls)#1 (1) { ["user:private"]=> string(3) "asd" }

بحثش بحث امنیت نیست . اصلا محافظتی در کار نیست , یه ارث بری کافیه که من هر چی بخوام داشته باشم . یه var_dump کافیه که من براحتی مقادیر رو ببینم , توی هر زبون برنامه نویسی دیگه ای این جوری باشه ( که من تا حالا ندیدم باشه ) توی php اینجوری نیست .
اگه مثال از این نوع سرقت اطلاعات داری خواهشا بزن , اگه نداری خوب حرفی باقی نمی مونه .

----------


## naser67

> یه ارث بری کافیه که من هر چی بخوام داشته باشم


من یه کد ساده میزارم ، شما اون متد get_name را خارج از کلاس صدا بزن


class valed
{
    private $name;
    public function __construct($name)
    {
        $this->name=$name;
    }
    
    private function get_name()
    {
        return $this->name;
    }
}

class test extends valed
{
    public function _construct(){}
}

$obj=new test("Naser");
echo $obj->get_name();


اول یکم تحقیق کن بعد بیا پست بزن

----------


## vahid4134

> من یه کد ساده میزارم ، شما اون متد get_name را خارج از کلاس صدا بزن
> 
> 
> class valed
> {
>     private $name;
>     public function __construct($name)
>     {
>         $this->name=$name;
> ...


دوست عزیز ایشون دانششون بیشتر از این حرفهاست (البته من هم فکر می کردم که میشه ولی تست نکرده بودم اشاره ای نکردم که دوست استاد بنده موضوع رو بیان کردند) شما کد زیر رو امتحان کنید

<?php
    class valed
{
    private $name;
    public function __construct($name)
    {
        $this->name=$name;
    }
    
    private function get_name()
    {
        return $this->name;
    }
}

class test extends valed
{
    
}

$obj=new test("Naser");
print_r($obj);
?>

----------


## naser67

> دوست عزیز ایشون دانششون بیشتر از این حرفهاست


دوست من من تو این قضیه شکی ندارم ، منم نخواستم بگم که من حالیمه فلانی حالیش نیست
داریم دوستانه بحث میکنیم تا سطح دانشمون بره بالا ، شما هم از حرفای من ناراحت نشو

درسته شما میتونی مقادیر متغیر رو ببینی

ولی نمیتونی تغیرشون بدی یا خارج از کلاس ازشون استفاده کنی

من یه مثال از دنیای واقعی میزنم 

فکر کن شما یه نفری هستی که می خوای به من آسیب برسونی منم تو ماشین نشستم و در رو قفل کردم درسته شما منو میبینی و دستت که به من نمیرسه

----------


## tabib_m

اونی که داخل کلاس رو نوشته، خودش خارج کلاس رو نوشته.... پس در استفاده از متغیر در خارج از کلاس، اختیار تام داره... در این مسئله *اصلا مبحث امنیت پیش نمیات* که بخوات به کد مذکور ربط داشته باشه یا نه!
فقط ایجاد نظم هست.

مثل این میمونه که شما توی یک تابع یک متغیر رو global بکنی یا نکنی... حالا اگه global نکنی، رو این حساب که از این متغیر در خارج از تابع نمیشه استفاده کرد، امنیت کدت میره بالا؟؟

----------


## musiox

آقا وحید مارو شرمنده نکنید ما کوچیک همه هستیم .
اول باید به مفاهیم OO یه نگاهی بندازیم . بحث کپسوله سازی و اینکه کلا برای چی بکار میره . 
وقتی یه کلاس نوشته میشه برای اینکه دیگران از اون استفاده کنند یک API لازم دارن که نحوه استفاده و ارتباط متقابل رو با کلاس بدونن . کاربری که از کلاس استفاده می کنه گاهی اوقات نیازی به استفاده مستقیم از یک متد یا یک پراپرتی رو نداره چون اساسا به کارش نمیاد و صرفا برای استفاده خصوصی داخل کلاسه. مثلا من برای کار با یه ابزار که از اجزای پیچیده ای تشکیل شده درگیر جزئیات اون نمیشم و فقط نیاز دارم به اینکه اون ابزار یه سری واسط در اختیار من قرار بده تا از کارایی های اون ابزار استفاده مورد نظرمو بکنم . با این اوصاف متدهای پابلیکم میشن اون واسط ها و متد های پراویتم میشن اون پیچیدگی ها . اساس و فلسفه پشت این قضیه اینه . که از دید من از یه جا ناشی میشه و اونم چیزی جز راحتی پیاده سازی یه سیستم و قابلیت توسعه پذیری اون نمی تونه باشه .
حالا اینکه این وسط استفاده های دیگه ای هم ازین مفاهیم می کنن یه مقوله جداست . بله راه هایی وجود داره که امنیت رو بالا ببری ( البته در برابر آدم بی سوادی مثله من ) . ولی :
1. کدایی که نوشتی رو باید اینکد کنی , بطوری که دیکدرش توی اینترنت نباشه !
2. مقدار پراپرتیات چیزی نباشه که اهمیت زیادی داشته باشه ( چون من به متدای پراویتت دسترسی ندارم می تونی مقادیر پراپرتیات رو اینکد کنی و بوسیله یه متد پرایویت اونا رو هر وقت بخوای استفاده کنی دیکد کنی )
3. اگه مقادیر پراپرتیات مهما باید کلاست هم final باشه هم singleton
یه راه دیگه هم هست که به بحث مربوط نیست .

<?php
class valed
{
    public $name;
    public function __construct($name)
    {
        $this->name=$name;
    }
    
    private function get_name()
    {
        return $this->name;
    }
	

}

class test extends valed
{

	public function parent_props(){
		eval(var_export($this,true).';');
	}

	static function __set_state($parent_props){
		foreach($parent_props as $prop=>$value){
			echo $prop.'='.$value.'<br />';
		}
	}

}

?>

اینم یه دعوای جالب

----------


## alimokhlesi

> اونی که داخل کلاس رو نوشته، خودش خارج کلاس رو نوشته.... پس در استفاده از متغیر در خارج از کلاس، اختیار تام داره


خوب شد گفتی. شما اصلا به این نکته توجه نکردی که یک کار استاندارد که به صورت کامپوننت در میاد در اصل به همین صورت که یکی کلاس رو می نویسه دیگران ازش استفاده می کنند 
به عنوان مثال : PEAR,ZF,....




> بحثش بحث امنیت نیست . اصلا محافظتی در کار نیست


من که نفهمیدم چرا اینو گفتی . 
اگه بحث امنیت نیست پس بحث چیه ؟ 
فقط نظم ! یعنی سیستم های ساخت یافته نظم نداشتند که شی گرایی با n تا مزیتش ( ازجمه همین Private) امودن تا نظم برقرار کنن ؟ البته این یک از اهدافش هست .اما بهتره بدونید که تعریف متغییر ها و متد های Public,private,.. در امنیت برنامه نقش بسزایی داره
یک از دلایلش اینه که متغییر های خصوصی به محض تموم شدن عمرشون از حافظه خارج میشن . اصولا متغییر های خصوصی در حافظه پشته تعریف میشن و به محض تمام شدن دوره عمرشون از حافظه خارج می شن . اینستنت ها و پابلیک ها در حافظه هیپ و البته قابل دسرسی خواهند بود البته در اغلب موارد در این قسمت از حافظه پابلیک های زیادی هست که میشه دسترسی بهشون رو باز سازی کرد و ازشون استفاده کرد.
بماند که پی اچ پی متاسفانه هنوز کاملا از مفاهیم شیگرایی پشتیبانی نمی کنه  و لی این واقعیت هایی که گفتم در تمام سیستم های واقعا شی گرا وجود داره .





> البته نمیشه گفت امنیت کد بالاتر میره. چون به هر حال سورس کلاس پدر هم در دسترس هست.


؟

----------


## vahid4134

> خوب شد گفتی. شما اصلا به این نکته توجه نکردی که یک کار استاندارد که به صورت کامپوننت در میاد در اصل به همین صورت که یکی کلاس رو می نویسه دیگران ازش استفاده می کنند 
> به عنوان مثال : PEAR,ZF,....
> 
> 
> 
> من که نفهمیدم چرا اینو گفتی . 
> اگه بحث امنیت نیست پس بحث چیه ؟ 
> فقط نظم ! یعنی سیستم های ساخت یافته نظم نداشتند که شی گرایی با n تا مزیتش ( ازجمه همین Private) امودن تا نظم برقرار کنن ؟ البته این یک از اهدافش هست .اما بهتره بدونید که تعریف متغییر ها و متد های Public,private,.. در امنیت برنامه نقش بسزایی داره
> 
> ...


امنیت رو برقرار می کنه ولی نه امنیت مخفی کردن کد. امنیت رو از نظر اینکه شخص دیگری که می خواد از این کلاس استفاده کنه یا ازش به ارث ببره  امکان تغییر در اصلیت و پارامترهای اصلی کلاس پدر رو نداشته باشه. اگر منظور شما از امنیت به همین معناست واقعا درست عرض کردید.





> یک از دلایلش اینه که متغییر های خصوصی به محض تموم شدن عمرشون از حافظه خارج میشن . اصولا متغییر های خصوصی در حافظه پشته تعریف میشن و به محض تمام شدن دوره عمرشون از حافظه خارج می شن . اینستنت ها و پابلیک ها در حافظه هیپ و البته قابل دسرسی خواهند بود البته در اغلب موارد در این قسمت از حافظه پابلیک های زیادی هست که میشه دسترسی بهشون رو باز سازی کرد و ازشون استفاده کرد.
> بماند که پی اچ پی متاسفانه هنوز کاملا از مفاهیم شیگرایی پشتیبانی نمی کنه و لی این واقعیت هایی که گفتم در تمام سیستم های واقعا شی گرا وجود داره .


این مواردی رو که گفتید رو بنده اطلاعی ندارم چون با php کار کردم. و می دونم در php اینگونه نیست. php هم به دلیل محدودیت هایی که در ram داره و ساختارش نمی تونه به معنای حقیقی OOP رو پیاده سازی کنه. ولی در حد نیاز برآورده کرده.

من از کتابهایی که خوندم به این نتیجه رسیدم که:
دلیل استفاده از private و public و protect این هست که وقتی که یک توسعه دهنده دیگه میاد و از کد شما استفاده می کنه (یا شما بعد از مدت طولانی می خواید از کد خودتون استفاده کنید) دچار سردرگمی نشه و وارد جزئیات موجود در کد که ممکنه خیلی نکات در اون رعایت بشه نشه. بیشتر پیشنهاد میشه private ها در داکیومنت قرار نگیرند.

من یک سوال دارم. آیا شما پروژه ای رو سراغ دارید که به این منظور از private ها استفاده کرده باشند؟ (حتی پروژه هایی که خودتون استفاده کردید و این رو جهت این می خوام بدونم که آیا واقعا به این منظور کسی استفاده کرده یا نه چون من تا به حال جایی ندیدم و نه خوندم و البته اطلاع نداشتن من به حتم به دلیل بی تجربگی من هست)

----------


## naser67

> امنیت رو برقرار می کنه ولی نه امنیت مخفی کردن کد. امنیت


منم گلوم خشک شد که همینو بگم

----------


## vahid4134

> منم گلوم خشک شد که همینو بگم


پس شد مثل قضیه عنب و انگور و ازوم و غیره :لبخند گشاده!:

----------


## musiox

> من که نفهمیدم چرا اینو گفتی . 
> اگه بحث امنیت نیست پس بحث چیه ؟


نمی دونم چرا این حرفو می زنی ؟!
آیا OO برای امنیت طراحی شده ؟!
من که جایی ندیدم که همچین حرفی کسی زده باشه . اگه شما دیدین خب خوشحال میشم که مارم آگاه کنین .



> منم گلوم خشک شد که همینو بگم


شما هم که هر بار یه چیز میگی ...

----------


## naser67

> شما هم که هر بار یه چیز میگی


هر بار چی گفتم

از اولش دارم یه چیز میگم که

----------


## alimokhlesi

> نمی دونم چرا این حرفو می زنی ؟!
> آیا OO برای امنیت طراحی شده ؟!


خیر . من گفتم فقط برای نظم نیست . نگفتم فقط برای امنیت هست. 
مصداق کامل :



> ....شی گرایی با n تا مزیتش....







> آیا شما پروژه ای رو سراغ دارید که به این منظور از private ها استفاده کرده باشند؟


بله.
وحید جان سعی میکنم در صورتی که وقت آزاد پیدا کردم یک تاپیک عملی در ایران پی اچ پی بزنم.

----------


## musiox

> هر بار چی گفتم
> 
> از اولش دارم یه چیز میگم که


ببخشید , اشتباه از من بود .
من هنوز قانع نشدم . من می گم جایی ندیدم که حرف شما رو زده باشه . اگه میشه منبعی رو که شما این حرف از روی اون داری میزنی به ما هم معرفی کن تا ماهم بدونیم . اگرم یه حرفیه که از روی تجربه بیان میشه میرسیم به اینکه توی طراحی OO امنیت مطرح نبوده .



> یک تاپیک عملی در ایران پی اچ پی بزنم.


خواهشا همینجا مطرحش کن . یا لینکشو بزار .

----------


## hidensoft

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

به نظر من OOP مستقیما برای بالا بردن امنیت نیست ، بلکه برای بالا بردن قدرت مانور ، سرعت توسعه ، افزایش خوانایی بوده ، جلوگیری از تکرار کد بوده.

وقتی شما اسکریپت های غیر OOP و OOP رو با هم مقایسه کنید در اولین نگاه متوجه می شید که گسترش برنامه های غیر OOP خیلی سخت تر از OOP است . اما در هر دو امکان وجود حفره های امنیتی هست ، پس نمی شه گفت لزوما استفاده از OOP به معنای بالا بردن امنیت است . وقتی یکم دقیق بشید روی اسکریپت های خیلی بزرگ که از OOP استفاده می کنند می بینید که چقدر قدرت گسترشش بالاست (در مقایسه با اسکریپت های غیر OOP) . 
اما اینکه استفاده از Protect یا Privat باعث افزایش امنیت می شه یا نه ! 

بستگی به این داره که نگاه شما نسبت به امنیت چیه ! پروژه شما چه امنیتی نیاز داره ، واقعا عدم استفاده از Protect باعث ایجاد حفره امنیتی میشه ؟

به نظر من استفاده از Protect و ... مانند انجام دادن اعمال مستحبه ، توی این 40 .. 50 پروژه ای که انجام دادم هیچ وقت عدم استفاده از گذینه های بالا باعث ایجاد حفره امنیتی نشده و هیچ وقت هم نمی شه  ، چرا که استفاده از این گذینه ها فقط برای راحتی کار برنامه نویس هست نه بالا بردن امنیت .

امنیت یعنی منطق برنامه نویسی شما !

به نظر من بهتره یکم به مسائل با نگاه باز تری نگاه کنید.

*



اگرم یه حرفیه که از روی تجربه بیان میشه میرسیم به اینکه توی طراحی OO امنیت مطرح نبوده .


*




> این مواردی رو که گفتید رو بنده اطلاعی ندارم چون با php کار کردم. و می دونم در php اینگونه نیست. php هم به دلیل محدودیت هایی که در ram داره و ساختارش نمی تونه به معنای حقیقی OOP رو پیاده سازی کنه. ولی در حد نیاز برآورده کرده.


فکر نمی کنم .. مقاله یا یه مطلب رسمی برای اثباتش نیاز هست .

----------


## vahid4134

> سلام
> چند وقتیه خدمت مجال نمی ده در کنار برو بچس باشم 
> 
> به نظر من OOP مستقیما برای بالا بردن امنیت نیست ، بلکه برای بالا بردن قدرت مانور ، سرعت توسعه ، افزایش خوانایی بوده ، جلوگیری از تکرار کد بوده.
> 
> وقتی شما اسکریپت های غیر OOP و OOP رو با هم مقایسه کنید در اولین نگاه متوجه می شید که گسترش برنامه های غیر OOP خیلی سخت تر از OOP است . اما در هر دو امکان وجود حفره های امنیتی هست ، پس نمی شه گفت لزوما استفاده از OOP به معنای بالا بردن امنیت است . وقتی یکم دقیق بشید روی اسکریپت های خیلی بزرگ که از OOP استفاده می کنند می بینید که چقدر قدرت گسترشش بالاست (در مقایسه با اسکریپت های غیر OOP) . 
> اما اینکه استفاده از Protect یا Privat باعث افزایش امنیت می شه یا نه ! 
> 
> بستگی به این داره که نگاه شما نسبت به امنیت چیه ! پروژه شما چه امنیتی نیاز داره ، واقعا عدم استفاده از Protect باعث ایجاد حفره امنیتی میشه ؟
> ...


اول از همه خوشحالم که سر زدی
در موردش یه نکته توی کتاب php5 power progrmming بیان شده با این عنوان
php is not java 
من یادمه یه مقاله خیلی خوب در موردش خوندم االان که دو دقیقه ای دارچ سرچ می کنم گیرش نمیارم
اما یه لینک دیگه دارم که در مورد oop در  php مطالب مفیدی رو گفته
http://www.raditha.com/blog/archives/000476.html

----------


## OCTAGON

دوستان می خواهم یک سئوال بکنم که لطف فرمائید من را که در زمینه OOP نا آشنا هستم را کمی روشن کند
من تا اینجا فهمیدم که می توانیم برای اطلاعات خودمان که مثلا اگر اطلاعات دانشگاه هست شی های مختلف بسازیم
ولی آیا می توان مفهوم شی گرایی را در خواندن اطلاعات از دیتابیس و نمایش آنها ویرایش یا حذف یا اضافه نمودن هم بفرمائید
منظورم اینست که شی گرایی در این مراحل چه نقشی دارند.

----------


## parsajax

اولن سلام به همه دوستان و استادان ارجمند 

بعد از خوندن اينهمه پست موندم چي بگم ... مبحث با چي شروع شد وبه كجا كشيده شد!
نظر خودم رو اگه بخوام در رابطه با اين بحث ها بگم  بايد متذكر شم كه برنامه نويسي شعي گرا براي پي اچ پي درست نشده كه اينجوري به جون هم افتاديد و يه گروه هي كد ها رو زند ميكنه اونيكي ديزنند ميكنه ... برنامه نويسي شعي گرا يه معقوله جدايي است كه تو اكثر زبانهاي برنامه نويسي سطح بالا استفاده شده و ميتونه توي يه اپليكيشن وب و يا يه وبسايت استفاده شه يا تو يه برنامه ويندوز يا ... دوستان بايد توجه كنند كه اين خاصيت ها به دليل قشنگي و زيبايي در نظر گرفته نشده و علت به وجود اومدن هركدومشون احساس نيازيه كه بهشون شده ... در نظر بگيريد كه تو اپليكيشني يه متغير به عنوان فلگ كه نمايانگر دسترسي مديريت هست كه با ورود اعضاع به 0 يا 1 با توجه به دسترسي كاربر تغيير ميكنه حالا اگه قرار باشه هر پلاگيني كه به اپليكيشن اضافه ميشه بتونه اين فلگ رو تغيير بده كه ديگه ... ميشه هزاران مثال ديگه كه موجب به وجود اومدن نياز به اين خواص شده زد ولي توصيه ميشه به جاي اينكه دنبال دليلي براي زير سوال بردن اين موارد باشيد يكم در مورد علت به وجود اومدنشون فكركنيد . 




> دوستان می خواهم یک سئوال بکنم که لطف فرمائید من را که در زمینه OOP نا آشنا هستم را کمی روشن کند
> من تا اینجا فهمیدم که می توانیم برای اطلاعات خودمان که مثلا اگر اطلاعات دانشگاه هست شی های مختلف بسازیم
> ولی آیا می توان مفهوم شی گرایی را در خواندن اطلاعات از دیتابیس و نمایش آنها ویرایش یا حذف یا اضافه نمودن هم بفرمائید
> منظورم اینست که شی گرایی در این مراحل چه نقشی دارند.


دوست عزيز شما شعي گرايي مزاياي زيادي داره كه دوستان در پست هاي قبلي خيلي از اونا رو عنوان كردن. مانند توسعه سريع تر و راحت تر، جلوگيري از تكرار، نگهداري آسانتر، قابليت استفاده مجدد و ... در مورد سوال شما بايد بگم كه شئي گرايي ميتونه خيلي كار شما رو راحت تر كنه و سرعت برنامه نويسيتون رو بالاتر ببره و توسعه سيستم رو راحت تر كنه ، مثلا 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}");


شما به عنوان نفر سوم كدوم رو راحت تر متوجه ميشي ؟؟ فكر كن تو يه صفحه صدها خط كد مشابه كد اول بايد نوشته شه و اگه از شعي گرايي استفاده بشه چقدر كمتر ميشه حجم كدها و ... كلي مزيت ديگه ميشه پيدا كرد از اين مقوله شي گرايي

----------


## OCTAGON

با تشکر از دوست عزیز PARSAJAX

می تونم خواهش کنم که چند نمونه تئوری دیگر همچون موردی که فرمودید معرفی کنید.
من به هیچ وجه قصد ندارم که پروژه ای را با کمک نمونه کدهای دوستان در این محفل علمی انجام دهم ولی نیاز دارم که از قالب برنامه نویس سنتی به یک برنامه نویس شی گرا تبدیل شوم بنابراین می خواهم با کاربرد های شی گرایی بیشتر آشنا شوم.

با تشکر
امیر

----------


## hoja06101001

واقعا از همه ممنونم تا اینجا خیلی مفید بود .

این اولین بحث در مورد oop بود که می بینم داره به یه جایی میرسه .

----------


## Abalfazl

مباحثی مثل کپسوله بندی ،سازنده ، شی ، در زبانهای مختلف شبیه به هم هستند


جالبترین و خنده دارترین مقاله شی گرایی!
- مفاهیم پایه شی گرایی:
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

----------


## hidensoft

سلام دوستان. 
چند روزي در خدمت شما هستم ، اميد وارم که تو اين مدت بتونم باز هم به برنامه نويس هاي ايراني کمک کنم.

Propel يک Object Relational Mapping  يا همون ORM هست.
حتما پيش خودتون مي گيد که چه فايده اي داره که من از Propel استفاده کنم. بايد بگم شما با استفاده از Propel که يک فريم ورک بسيارکار آمد براي برقراري ارتباط با ديتابيس هست تمام پايگاه داده خودتون رو بصورت کلاس در مياريد و از همه مهم تر شما مي تونيد به پايگاه هاي داده MySQL, MS SQL Server, PostgreSQL, SQLite, Oracle وصل بشيد.

شما در Propel ديگه نيازي نداريد که براي ساخت database به phpmyadmin يا هر ابزار ديگه اي وصل بشيد.
اطلاعات ديتا بيس بصورت کد XML ذخيره مي شن و پروپل خودش ديتابيس رو مي سازه
براي مثال


```
<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>
```

سپس کافيه تا دستور زير رو در command prompt اجرا کنيد

> 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);  

همونطور که مي بينيد تمامي امکانات مورد نياز براي زدن کوئري در اختيار شما هست.

پيشنهاد مي کنم حتما يک بار تجربه کنيد ، احتمال زيادي مي دم که شما هم مثل من مجذوب قدرت و امنيت اين فريم ورک مي شيد.

موفق و پيروز باشيد

----------


## mojtaba00

سلام ، ممنون که رو این تاپیک وقت گذاشتید، یه سوال داشتم. می خواستم ببینم میشه داخل یک اسکریپت پی اچ پی به متغیر های سراسری خارج از کلاس از داخل کلاس دسترسی داشت؟

----------


## zoghal

اگر متغییر خارج از کلاس به صورت global تعریف شده باشه،  تو کلاس و در متد ها هم میتونید این متغییر رو استفاده کنید.
ولی کلا بی معنی هست این کار

----------


## hidensoft

از دوست عزیزم zoghal تشکر می کنم که به این تاپیک پاسخ دادند.
لطفا سوال هایی که مربوط به مسائلی غیر از شی گرایی هست رو در انجمن بپرسید ، سریع تر پاسخ داده می شه.

از تمامی دوستانی که قادر هستند آموزش OOP یا مسائل مربوطه بدهند خواهش می کنم در اینجا آموزش هاشون رو در اختیار دیگران قرار بدند. من در حال حاضر در حال انجام خدمت سربازی هستم نمی تونم به این تاپیک برسم . از دوستانی که تا به امروز کمک کردند هم تشکر می کنم .

موفق و  پیروز باشید.

----------


## tanha2007

سلام دوستان،
میشه لطف نموده این کلاس جستجو را انعطاف پذیر درست نمایند، یعنی بشه برای چند جدول کار نماید و هم چنان فیلد قسمت رابطه ...

چون فعلا برای یک جدول کار مینماید 




> ساخت یک موتور جستو جو گر سریع و کارآمد یکی از دق دقه های یک برنامه نویسه ، من حتی قبل از اینکه یک پروژه رو شروع کنم روس سرچ فکر می کنم . .. امروز یک کلاس بسازیم که به سریع ترین وجه ممکن و به بهترین نحوه به ما جواب مورد نظرمون رو بده ، از همه مهم تر اصولی باشه و قابل ارتقاع و سفارشی باشه .. 
> 
> class.search.php
> 
> <?php
> 
> class search_engine
> {
>     function search_engine($mysql)
> ...

----------


## Mo_hasan1366

خيلي ممنون از مطالب مفيد كه گذاشتيد
اگر ميشه ادامش بديد

----------


## omid_safari

سلام دوستان
من براي ايجاد كلاسهاي تودرتو  مشكل دارم.
بدون استفاده از وراثت و غيره... فقط ميخوام يك كلاس a تعريف كنم و در كلاس b يك يا چند تا شيي a داشته باشم.
ممنون

----------


## click2ir

oop هم برای خود عالمی داره ها خیلی شیرینه 
دوستان ما در پی اچ پی همون طور که میدونیم نمی تونیم برای یک کلاس بیش از یک والد داشته باشیم آیا می شه برای حل این مشکل از این روش استفاده کرد که 
کلاس اول والد کلاس دوم باشه و کلاس دوم وارلد کلاس سوم 
1.آیا در این صورت اشیا کلاس سوم از کلاس اول توابع و متغییر هاشون را  ارث می برند؟
2.ایا میشه از توابع اون و متغییر هاش در کلاس سوم استفاده کرد اگر میشه روشش چیه ؟

----------


## امیـرحسین

> سلام دوستان
> من براي ايجاد كلاسهاي تودرتو  مشكل دارم.
> بدون استفاده از وراثت و غيره... فقط ميخوام يك كلاس a تعريف كنم و در كلاس b يك يا چند تا شيي a داشته باشم.
> ممنون


فکر کنم باید از implements استفاده کنید (البته فقط در PHP5)
class b implements a {
....
}

----------


## hidensoft

سلام دوستان.
مدتی هست که من در حال خدمت هستم و متاسفانه از بحث برنامه نویسی به شدت دور شدم و اطلاعاتم از همون چیزی که دوسال پیش بود فقط کمی بیشتر شده.
از تمامی دوستانی که در این مدت به پیشرفت آموزش کمک کردن ممونم .

بریم سر اصل مطلب

راستیتش چند رو زی هست که در حال نوشتن 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;
در واقع هرگاه در خواست خروجی به سورت مستیقیم از شعی ارجاء داده شده بشه این تابع اجرا می شه.

امید وارم مورد استفاده قرار بگیره.

موفق باشید.

----------


## Cyletech

ممنون از همتون

----------


## mahmood3d

سلام
قبلا از ارسال این پست و ایجاد مطلب اضافی از همتون عذر می خوام.
من تا به امروز حدود 4 سال بود که برنامه نویسی می کردم و توی مدرسه و دانشگاه هم در بخش شیء گرایی چیزی که به ما گفته میشد یک چیز تئوری بود که هیچ ربطی به برنامه نویسی نداشت و من همیشه از این بخش هیچ چیزی متوجه نمیشدم و از برنامه های نوشته شده به صورت شیء گرایی هم چیزی نمی فهمیدم.
من به تازگی این تاپیک رو دیدم و از نویسنده این مطالب که خیلی ساده  و روان دارند این موضوع رو پیش می برند و از مدیران که این تاپیک رو جزو تاپیکهای برتر این انجمن قرار دادن کمال تشکر رو دارم و تقاضا دارم که این موضوع ادامه داشته باشه و مرحله به مرحله و با مثال های گوناگون این آموزش رو ادامه بدین. چون فکر می کنم این مطلب یکی از دغدغه های مهم بچه های کامپیوتر مخصوصا برنامه نویس ها باشه که تا الان چیزی از شیء گرایی نمی دونن.

ممنون از زحماتی که می کشین  :قلب:  :بوس:

----------


## mahyar13652000

منم از محمد عزیز تشکر می کنم که این همه برای این کار وقت گذاشته  :قلب: 

خسته نباشید گل پسر

----------


## hidensoft

*invoke__*


متود جادویی invoke زمانی فراخوانی می شه که شما از یک کلاس مانند یک تابع استفاده کنید.
به عنوان مثال :
<?php
class CallableClass {
    function __invoke($x) {
        var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
خیلی سادست فقط اگه دوستان در مورد is_callable مشکل دارند باید بگم این تابع چک می کنه که آیا این پارامتر ارجا داده شده قابل فراخوانی هست یا نه . برای اطلاعات بیشتر متونید به منوال مراجعه کنید.

*توجه توجه : این متود جادویی فقط در PHP 5.3 به بالا قابل اجراست*

----------


## major_,agic_majid

دست همتون درد نکنه خیلی خوب بود

----------


## famarini

سلام
لطفا مباحث را ادامه دهيد
با تشكر از همه دوستان

----------


## sonixax

این Parent:: دقیقا چه میکند ؟ کلاسی که Function توش هست رو بر میگردونه ؟

اینم یک توضیحی برام بدید ممنون میشم که دقیق چی کار میکنه :

class myclass extends yourclass
{}

----------


## hidensoft

class myclass extends yourclass
{}

کلاس myclass رو فرزند کلاس yourclass می کنه.
با استفاده از parent::func می تونید به توابع استاتیک کلاس والد رو اجرا کنید.

----------


## Metal Gear Solid

سلام
ببخشید من هنوز روش های استفاده ی صحیح از این نوع برنامه نویسی رو خوب یاد نگرفتم اما علاقه ی زیادی دارم یاد بگیرم. یعنی الان یک هفته ای هست که 100% برنامه هایی که مینویسم رو دارم با کلاس نویسی مینویسم هر چند سرعت برنامه نویسیم در حد خیلی زیادی اومده پایین.
سوالاتی داشتم که شاید براتون ساده باشه :
فرض کنید من یک کلاسی دارم داخل فایل A.php که به عنوان مثال داخلش کلاسی ساده به اسم ClassA نوشته شده که دارای متدی به اسم PrintMyname ـه که یک رشته ای رو چاپ میکنه
کلاس دیگری به اسم ClassB در فایلی به اسم B.php نوشتم و میخوام از متد کلاس ClassA که یک رشته رو چاپ میکرد استفاده کنم.

* دستور require ای که من در فایل B استفاده میکنم که با اون فایل A رو باید فراخونی کنم ،  باید داخل کلاس ClassB نوشته باشه یا اول فایل بیرون از کلاس ؟
* اگر بخوام از متد کلاس A در فایل های دیگم که حاوی کلاس های دیگه هستند استفاده کنم چه دستوری باید بنویسم ؟ این کددرسته ===> ClassA::PrintMyname ؟
* الزامی به استفاده از extends هست یا نه؟

سعی کردم به روان ترین حالت ممکن مشکلم رو بگم. امیدوارم عزیزان محترم منظورم رو فهمیده باشن ...

----------


## Cyletech

> سلام
> ببخشید من هنوز روش های استفاده ی صحیح از این نوع برنامه نویسی رو خوب یاد نگرفتم اما علاقه ی زیادی دارم یاد بگیرم. یعنی الان یک هفته ای هست که 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 نوشتم آن را فراخوانی کنید.

----------


## Metal Gear Solid

ممنون اما من نمیخوام از دستور Extends استفاده کنم
در استفاده از توابع میشه داخل یک تابع از تابعی دیگه استفاده کرد. من میخوام داخل متد یک کلاس متدی از کلاس دیگر رو استفاده کنم اما نمیخوام روابط والد و فرزندی بین این دو کلاس وجود داشته باشه. چنین قابلیتی وجود داره؟

----------


## Metal Gear Solid

این چه ربطی به شی گرایی داشت ؟!!

----------


## MMSHFE

> ممنون اما من نمیخوام از دستور Extends استفاده کنم
> در استفاده از توابع میشه داخل یک تابع از تابعی دیگه استفاده کرد. من میخوام داخل متد یک کلاس متدی از کلاس دیگر رو استفاده کنم اما نمیخوام روابط والد و فرزندی بین این دو کلاس وجود داشته باشه. چنین قابلیتی وجود داره؟


 با سلام، مشروط بر اينكه اون متد به صورت static تعريف شده باشه، ميتونيد فراخوانيش كنيد، حتي اگه از extends استفاده نكنيد. فقط به جاي ::parent بايد از ::classname استفاده كنيد و به جاي classname نام اون كلاس رو قرار بدين.
موفق باشيد.

----------


## MMSHFE

با سلام مجدد، ضمن تشكر از همه دوستان فعال در اين بحث، به زودي يك آموزش جامع درمورد شئ گرايي در PHP آماده ميكنم و كم كم در همين بحث قرار ميدم.
موفق باشيد.

----------


## mtchabok

در ابتدا از 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'
?>

----------


## alasht

با سلام خدمت دوستان
من oop رو بلد نیستم و با خوندن این تاپیک تازه یه چیزایی دستگیرم شده
یه چند تا سوال داشتم میخواستم بدونم کاربرد اینها چیه ؟
var , public , private , protect , ...
به عنوان مثال :

private $a;
var $b;
public  $c;
public function displayForm() {...} 
private function _createEventObj() {...}

...

----------


## Cyletech

> با سلام خدمت دوستان
> من oop رو بلد نیستم و با خوندن این تاپیک تازه یه چیزایی دستگیرم شده
> یه چند تا سوال داشتم میخواستم بدونم کاربرد اینها چیه ؟
> var , public , private , protect , ...
> به عنوان مثال :
> 
> private $a;
> var $b;
> public  $c;
> ...


var که همون نسخه قدیمی public باید باشه و استفاده ازش توصیه نمیشه! public و private و protected برای دسترسی دادن یا ندادن در شی گرایی استفاده میشه. مثلاً اگر دسترسی یک تابع رو روی public بگذاریم از هر کجایی هر وقت بخوایم می تونیم ازش استفاده کنیم. اما اگر private باشه فقط خود کلاس می تونه ازش استفاده کنه و اما اگر protected باشه هر کلاس و مشتقاتش میتونه ازش استفاده کنه. و ربطی به امنیت اینا ندارن و این دسترسی رو خودمون تشخیص میدیم. و برای اینه که توسعه دهنده دچار اشتباه نشه!

----------


## MMSHFE

با سلام، دوست گرامي از 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 عمل ميكنن و  از بيرون ديده نميشن.
 اميدوارم خوب توضيح داده باشم.
 موفق باشيد.

----------


## exlord

> از var در زماني استفاده ميشه كه بخواين يك متغير رو  تعريف كنيد ولي فعلاً مقداري بهش ندين.


 این چیزی که شما میگین ماله 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.

----------


## hpsarvari

با سلام، بنده توضیحاتی رو از یک کتاب در آورده ام راجع به متد ایستا (استاتیک ) که در اینجا برای دوستان قرار میدهم : (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);

----------


## aliramazani

یه سوال:

استفاده از این روش چه کاربردی داره و کجا باید استفاده بشه؟

----------


## MMSHFE

> یه سوال:
> 
> استفاده از این روش چه کاربردی داره و کجا باید استفاده بشه؟


 اين روش باعث ميشه براي استفاده از يك عنصر از كلاس، نياز نباشه يك شئ از اون ايجاد كنيم. اين كار هم در مصرف حافظه صرفه جويي ميكنه و هم اينكه به ما كمك ميكنه يكسري عناصر رو بين اشياء كلاس به اشتراك بگذاريم. براي مثال، اين حالت رو درنظر بگيريد:

public class MyClass {
    private static int $count = 0;
    public MyClass() {
        MyClass->$count++;
    }
    public static Count() {
        return MyClass->$count;
    }
 }

از اونجا كه count$ بصورت استاتيك تعريف شده، موقع ايجاد يك شئ جديد، دوباره 0 نميشه و سازنده هاي اشياء هم اون رو افزايش ميدن. حالا هرجا خواستين بدونيد چند تا شئ از كلاس ايجاد شده، ()MyClass->Count رو نمايش بدين. دقت كنيد كه براي دسترسي به عناصر استاتيك از نام كلاس استفاده ميشه نه نام اشياء ايجادشده از كلاس. اين روش مزاياي زيادي داره. مثلاً يك شئ، عنصر static رو مقداردهي كنه و شئ ديگه، اون رو بخونه و...
موفق باشيد.

----------


## armsoftpc

با سلام 

 :چشمک: آیا کتاب فارسی برای آموزش OOP وجود دارد ، منظورم این است که آموزش دارای کد های بزرگ باشد.اگر دوستان پیدا کردن برای ما هم بگذارند.
موفق باشید.

----------


## armsoftpc

به نام خدا 
با سلام 
تا به حال هر مثالی که زدید با برنامه نویسی عادی هم می شد انجام داد تازه انعطاف پذیرتر !!! :متعجب: 
میشه یک مثال بزنید که نشه با برنامه نویسی عادی انجام داد.
با تشکر از همه ی دوستان مخصوصا hidensoft.

----------


## hpsarvari

دوست خوبم من به شما کتاب راهنمای جامع PHP انتشارات نشر علوم رو پیشنهاد میکنم که به خوبی دو فصل را به شی گرایی اختصاص داده ...

----------


## armsoftpc

> دوست خوبم من به شما کتاب راهنمای جامع PHP انتشارات نشر علوم رو پیشنهاد میکنم که به خوبی دو فصل را به شی گرایی اختصاص داده ...


به نام خدا
با عرض سلام
با تشکر از پاسختون
اما منظور من این نبود ، من خودم آموزش های تئوری زیاد دیده ام و خونده ام! منظور من پروژه های عملی و حرفه ای است. :قلب: 
کسی پروژه ای داره بذاره ما هم استفاده کنیم.
با تشکر از همه ی دوستان.

----------


## armsoftpc

به نام خدا
با سلام
کسی کتاب نداشت معرفی کنه! (فارسی و جدید)

----------


## ...!M.J!...

سلام دوست عزیزم شی گرایی وقتی خودش رو نشون میده که پروژه عظیم باشه نه تو این مثال هایی که واسه یاد گیری دوستان زحمتشو کشیدن
میخوای عملی ببینی برو vBulletin و جوملا رو دانلود کن و کرهاشو بررسی کن اینم یه مثال عملی :لبخند گشاده!:

----------


## armsoftpc

به نام خدا
با سلام



> سلام دوست عزیزم شی گرایی وقتی خودش رو نشون میده که پروژه عظیم باشه نه تو این مثال هایی که واسه یاد گیری دوستان زحمتشو کشیدن
> میخوای عملی ببینی برو vBulletin و جوملا رو دانلود کن و کرهاشو بررسی کن اینم یه مثال عملی


من که چیزی از ویبولتین نمی فهمم ، چون خیلی پیچیده است ، اگه شما می دونید ، بیایید کد هاش رو درس به درس تشریح کنید ، خیلی طرفدار داره این کار! اگه سایتی هم داشته باشید ، رنک سایتتون رو این کار خیلی بالا می بره! :تشویق: 
در ضمن نظر من هم تشریح یک پروژه عظیم شی گرایی به زبان فارسی است ، البته تاکنون جدید ترین کتاب فارسی که در این مورد خوندم ، کتاب شی گرایی آقای امجدی بوده است ، اما در این کتاب پروژه ای ندارد.
حالا اگر شما و دیگر دوستان می تونید ، این کار رو انجام بدید بسم الله! :متفکر:

----------


## ...!M.J!...

سلام دوست عزیزم حالا اون که در حد یه شوخی بود :لبخند گشاده!: امیدوارم ناراحتت نکرده باشم
ولی یه سورس از کتاب Wrox PHP and MySQL Create Modify Reuse از فصل اول این کتاب میزارم که ساخت یه سیستم ورود خروج کاربر با استفاده از کلاس user است هم حجم کمه هم واسه شروع بنظرم جالب میاد!
البته بگم فقط واسه شروع وگرنه اونقد پیشرفته نیست ولی اگه تا حالا پروژه ای نزدی که توش شی گرایی باشه این حتما کمکت میکنه
فصلهای دیگه کتاب هم مثالهای جالبی داره میتونی بخونی
امیدوارم کمکت کنه و البته از من دلگیر نشده باشی :چشمک:

----------


## armsoftpc

به نام خدا
با سلام
مرسی ، اما خوبه قبل از این که انتشار بدید یه تغییراتی تو کد بدید ، منظور این که هم نسخه اصلی رو بزارید و هم نسخه خودتون رو چون کد ها پر از اشکاله!
بازم دستتون درد نکنه، بازم ادامه بدید.

----------


## aghasoroush

با سلام
اینم یه کلاس ساده کاری از بنده ی حقیر
امید وارم خوشتون بیاد
http://www.phpclasses.org/package/71...-tooltips.html

----------


## armsoftpc

به نام خدا
با سلام
با تشکر از دوستان ولی کلاستون کاربرد زیادی نداره و تقریبا ضعیف است ، خوب است کد کلاس را مستقمیا نگذارید و فقط از آن ها بهره گرفته و کدی بنابر سلیقه خودتان منتشر کنید.
چون اگر بنا به قرار دادن لینک ها مستقیم از سایت یا آپلودشده در برنامه نویس باشد، دیگر نیازی به این کار نیست یه سر به سایت هایی مانند راکس و phpclass می زنیم که کداش خیلی بهتر و جامع تر و زیاد تره.
به نظر من اگر کد ها رو خودتون بنویسید خیلی بهتره.
من هم یک کد که مربوط به موضاعات سایت است برای شما قرار دادم ، البته اصل کد مال خودم نیست و فقط ویرایشش کردم ، اما کد خوب و مفیدی است. :چشمک:  :تشویق: 
arm_cat.zip
موفق باشید.

----------


## ravand

بهتره در مورد ساخت سيستم مديريت محتوا با شي گرايي يه كم بحث كنيم اصلا ببينيم چجوري كار ميكنه. اين لينك يه آموزش خوب در موردش داره و خيلي هم ساده است.
ساخت ساده ترين سيستم مديريت محتوا با شي گرايي

----------


## saina2006

بهتره در مورد design pattern ها و نحوه استفادشون یه آموزش راه بیفته چون خیلی از برنامه نویسها باهاش آشنایی ندارن یا ازش استفاده نمیکنن

حالا اگر کسی پیدا نشد شاید خودم شروع کنم

----------


## javadbayani

با سلام حضور دوستان بنده هم با saina2006 موافقم ، لطفا در مورد الگوهای طراحی بحث بشه تا در این مورد هم مطالبی رو یاد بگیریم!!!!
ممنون .
همیشه شاد باشید

----------


## hometgah1

> سلام دوست عزیزم حالا اون که در حد یه شوخی بودامیدوارم ناراحتت نکرده باشم
> ولی یه سورس از کتاب Wrox PHP and MySQL Create Modify Reuse از فصل اول این کتاب میزارم که ساخت یه سیستم ورود خروج کاربر با استفاده از کلاس user است هم حجم کمه هم واسه شروع بنظرم جالب میاد!
> البته بگم فقط واسه شروع وگرنه اونقد پیشرفته نیست ولی اگه تا حالا پروژه ای نزدی که توش شی گرایی باشه این حتما کمکت میکنه
> فصلهای دیگه کتاب هم مثالهای جالبی داره میتونی بخونی
> امیدوارم کمکت کنه و البته از من دلگیر نشده باشی


دوست خوبم از مطلب مفیدت ممنون امکان داره برات کتاب رو برای دانلود بزاری ممنون

----------


## hometgah1

> اين روش باعث ميشه براي استفاده از يك عنصر از كلاس، نياز نباشه يك شئ از اون ايجاد كنيم. اين كار هم در مصرف حافظه صرفه جويي ميكنه و هم اينكه به ما كمك ميكنه يكسري عناصر رو بين اشياء كلاس به اشتراك بگذاريم. براي مثال، اين حالت رو درنظر بگيريد:
> 
> public class MyClass {
>     private static int $count = 0;
>     public MyClass() {
>         MyClass->$count++;
>     }
>     public static Count() {
>         return MyClass->$count;
> ...


دوست عزیز خیلی دنبال این مطلب بودم بسیار سپاس گزار و اینکه چرا همین کدی که گزاشتین رو در phpDesigner  کپی کردم prse error میده؟؟؟ درود

----------


## MMSHFE

بخاطر یک $ که اشتباهاً قبل از count توی توابع نوشته شده. کد صحیح اینه. شرمنده سریع تایپ کرده بودم:

public class MyClass {
    private static int $count = 0;
    public MyClass() {
        MyClass->count++;
    }
    public static Count() {
        return MyClass->count;
    }
}

موفق باشید.

----------


## hometgah1

> بخاطر یک $ که اشتباهاً قبل از count توی توابع نوشته شده. کد صحیح اینه. شرمنده سریع تایپ کرده بودم:
> 
> public class MyClass {
>     private static int $count = 0;
>     public MyClass() {
>         MyClass->count++;
>     }
>     public static Count() {
>         return MyClass->count;
> ...


مرسی از پیگیری شما،دوست عزیز پیغام خطایی که به من میده باز پارسه هستش ، از خط اول public رو که بر میدارم  بازم پیغام خطا از خط دوم داد که int  رو حذف کردم ،باز حطا از خط بعدش ...

class MyClass {
    private static $count = 0;
    public function MyClass() {
        MyClass->count++;
    }
    public static  function Count() {
        return MyClass->count;
    }
}

با این کد باز از خط MyClass->count++; خطا میگیره شما گفتید باید نام کلاس رو استفاده کرد برای متغیر های static
و سوال مهمتر  کلا برای اینکه یکسری متغیر ها (پروپرتی ها)با ایجاد فرضا دو شی که با شی اول مقدار پروپرتی مورد نظر عوض کرد و با شی دوم مقدار پروپرتی رو بخونه و همان مقداری باشه که اولی وارد کرده باید اون پروپرتی static تعریف شده باشه؟

با این کد کار میکنه


class MyClass {
    private static $count = 0;
    public function MyClass() {
        MyClass::$count++;
    }
    public static function  Count() {
        return MyClass::$count;
    }
}

----------


## narsic

این نمونه کد هست مشکل اصلی کد هم این بود که count جز کلمات رزرو هستش برای همین خطا میداد
class MyClass {
  static private $varCount;
  public function __construct() // Or init
  {
    self::$varCount++;
  }
  static public function getCount()
  {
        return self::$varCount;
  }
}
$test = new MyClass();
$test = new MyClass();
$test = new MyClass();

echo MyClass::getCount();// echo 3

$test = new MyClass();
echo MyClass::getCount();// echo 4
پاسخ سوآلتون هم مثبته
کلا بیشترین جایی که در هر پروژه MVC استفاده از Static رو میبینید در ارتباط با بانک اطلاعاتی هستش برای نگه داشتن ارتباط
موفق باشید

----------


## MMSHFE

شرمنده حقیقتش اون موقعی که مثال رو گذاشته بودم، از #C کپی کردم و سریع یکسری تغییرات دادم چون فقط قصدم آشنایی با کاربرد مقادیر بود ولی الآن که دقت کردم دیدم یکسری اشتباهات در Syntax وجود داشته که عذرخواهی میکنم. کد صحیح اینه:

class MyClass {
    private static $objCount = 0;
    public function MyClass() {
        self::objCount++;
    }
    public static function ObjCount() {
        return self::objCount;
    }
}

$t1 = new MyClass();
$t2 = new MyClass();
$t3 = new MyClass();

echo MyClass::ObjCount(); // echo 3

$t4 = new MyClass();

echo MyClass::ObjCount(); // echo 4

موفق باشید.

----------


## mosi2007

سلام 
من داشتم مطالب رو از اول یاد می گرفتم که وقتی اقای hidensoft  به قسمت اموزش یه موتور جستجوگر و mvc رسیدند اصلا هیچ توضیحی ندادند و من هم که تازه کارم خیلی برام سخت بود درک این دو درس   تا قبلش همه اموزشهاشو خط به خط توضیح میداد البته اموزشها ماله سال 86 فک کنم باشه    و نمیدونم که خود اقای hidensoft اصلا دیگه تو این انجمن  هست یا نه  
و از اساتید محترم تقاضا دارم که این دو درسو برام تشریح کنید (صفحات 1 و 2 اموزش ساخت موتور جستجوگر و mvc )

----------


## hidensoft

قسمت موتور جستوجو فقط یک نمونست می تونید از این قسمت فعلا رد بشید ادامه بدید. در مورد MVC سوالی اگر دارید بپرسید در خدمتم.

----------


## armsoftpc

به نام خدا
با سلام و خیر مقدم به جناب *hidensoft*



> قسمت موتور جستوجو فقط یک نمونست می تونید از این قسمت فعلا رد بشید  ادامه بدید. در مورد MVC سوالی اگر دارید بپرسید در خدمتم.


فکر کنم که Mvc توی php زیاد کاربرد نداشته باشه، چون الان تا اون جایی که میدونم ویبولتین، وردپرس و... هیچ کدام بر اساس Mvc طراحی نشده اند و Mvc فقط کار رو در برنامه نویسی پیچیده تر می کنه! :متفکر: 
نظر شما چیست؟

----------


## MMSHFE

بطور کلی MVC موقعی که پروژه بزرگ باشه و قصد توسعه و نگهداری طولانی مدت از اون رو داشته باشین مفید هست. کلاً ایده کدنویسی ساخت یافته در پروژه های جدی و حرفه ای، ایده خوبیه و MVC هم یک الگوی ساخت یافته و منسجم و خوب هست. حالا یک نفر یا یک تیم برنامه نویسی دوست نداره ازش استفاده کنه، نمیشه بگیم که بدرد نمیخوره یا کاربرد کمی داره، حتی اگه اون یک نفر یا تیم برنامه نویس، گروه سازنده vBulletin باشه!

----------


## rezaonline.net

در تکمیل حرفهاتون
الان 99 درصد فریم ورک ها معماری MVC رو رعایت میکنن همچنین سیستم های مدیریت محتوا دارن به این سمت میرم .
جوملا رو نگاه کنید ورژن فعلی

----------


## hidensoft

همونطور که دوستان گفتند MVC به شما قدرت مانور بالایی می ده تا کار رو درست و صحیح جلو ببرید از به هم ریختن کد جلوگیری کنید و توسعه کد رو برای دیگر برنامه نویس ها آسون کنید. در مورد وردپرس یا وی‌بی که از MVC استفاده نمی کنند : ببینید اگر من برم خودمو بندازم تو چاه ولی نمیرم کار درستی نکردم دلیلی نداره شما این کارو تکرار کنید. وردپرس نمی تونه MVC بشه قبلا توی ایران پی‌اچ‌پی گفتم در موردش که اگر وردپرس بیاد از این شکله احمقانه خودش رو به بقیه فریمورک یا اسکریپت ها حرفه ای برسونه چند نفر باز هم براش پلاگین می نویسند ؟ جواب اینه که تعداد یوزر هاش کم می شه و این همه پلاگین موجود رو هم از دست می ده پس این سیاست اگر چه در حال حاضر به نفع وردپرس هست اما نمی شه گفت چون وردپرس اینجوریه پس ما هم نیاز نداریم.

این پست که حذف شد اسپم بود ؟ :دی ندیدمش حیف شد :دی

----------


## armsoftpc

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

----------


## armsoftpc

> جوملا رو نگاه کنید ورژن فعلی


جوملا که بدرد نمی خوره!

----------


## tux-world

استاد  	*armsoftpc* 
*میشه بفرمایید چرا جوملا به درد نمیخوره*. این حرفتون فکر نمیکنید خیلی خیلی مضحکه. جوملا الان پلتفرم هستش میدونین یعنی چی؟

----------


## rezaonline.net

هر وقت جوملا تونست اطلاعات FTP رو توی فایل کانفیگ نذاره میشه اسمش رو سیستم مدیریت محتوا گذاشت .

همه ما روزانه و ماهانه بک آپ میگیریم ، فکر نکنم کسی دوست داشته باشه اگه بک آپش دست یکی بیافته سایتش هک بشه ؟

جوملا از نظر معماری الان چیز خوبیه اما سنگینه 
یه نگاه به elxis بندازید اونم مامبو بیسه .
متاسفانه بهش بهاداده نمیشه ویلا از نظر پرفورمنس از جوملا بهتره .

موفق باشید

----------


## tux-world

مامبو بیس؟ احسنت. فکر کنم نسخه 1.3 رو دارید میگید نه؟ جوملا از صفر کد نویسی شد بعد این نسخه . خوب شما که خبر ه هستید چرا خودتون تنظیمش نمیکنید؟ امنیت همیشه به سیستم بر نمیگرده به شرایطش هم بستگی داره. شما همینطور نصب میکنید و میشینید؟

----------


## hidensoft

> *میشه بفرمایید چرا جوملا به درد نمیخوره*. این حرفتون فکر نمیکنید خیلی خیلی مضحکه. جوملا الان پلتفرم هستش میدونین یعنی چی؟


اگر دوستانه از من بپرسند جوملا به درد می خوره می گم نه به درد نمی خوره. اکثر پروژه هایی که من پیاده سازی می کنم اینقدر کاستوم هستند که اگر بخووام با جوملا پیادشون کنم بادی خیلی وقت بزارم و فریم ورک جوملا بیشتر دست و پا گیرم هست تا عصای دست. اما اگر بنا باشه یه سایت مدیریت محتوا بسازم شخصا ترجیح می دم بجای WP از جوملا استفاده کنم چون حداقل یه MVC داره. من فکر می کنم منظور شما از پلتفرم همون فریم ورک هست چون پلتفرم بودن یه کد یه مقدار بی معنیه.




> هر وقت جوملا تونست اطلاعات FTP رو توی فایل کانفیگ نذاره میشه اسمش رو سیستم مدیریت محتوا گذاشت .


این حرفو یکی تو ایران پی اچ پی هم زد نکنه خودت بودی ؟ اونجا جواب دادم یا ندادم ؟ :دی نه باور کن با این دلیل نمی شه جوملا رو زیر سوال برد اما دلایل دیگه ای وجود داره برای نشون دادن ضعفش.



> یه نگاه به elxis بندازید اونم مامبو بیسه .


عامو این که پروژه که مرده دیگه پشت سر مرده حرف نزنیم خوب نی :دی




> مامبو بیس؟ احسنت. فکر کنم نسخه 1.3 رو دارید میگید نه؟ جوملا از صفر کد نویسی شد بعد این نسخه .


کی به شما گفته بعد از این نسخه جوملا از صفر نوشته شد ؟ :دی نوچ از صفر نوشته نشد اما از 1.4 بود که تغییرات اساسی توی جوملا شکل گرفت.

به طور کلی تاپیک در مورد OO هست در مورد فریم ورک و سی ام اس بحث نکنید  :تشویق:

----------


## rezaonline.net

> مامبو بیس؟ احسنت. فکر کنم نسخه 1.3 رو دارید میگید نه؟ جوملا از صفر کد  نویسی شد بعد این نسخه . خوب شما که خبر ه هستید چرا خودتون تنظیمش  نمیکنید؟ امنیت همیشه به سیستم بر نمیگرده به شرایطش هم بستگی داره. شما  همینطور نصب میکنید و میشینید؟


http://www.elxis.org/eblog/evolution...joomla254.html

----------


## parsboy

سلام دوستان من میخوام یه برنامه ای بنوسیم که 2 نفر بتونند باهم تصویری و صوتی در ارتباط باشند کسی مطلب یا فیلم مفید در رابطه با این موضوع داره؟!!!

----------


## hidensoft

فکر نمی کنم ربطی به این موضوع داشته باشه.

----------


## engmmrj

> سلام دوستان من میخوام یه برنامه ای بنوسیم که 2 نفر بتونند باهم تصویری و صوتی در ارتباط باشند کسی مطلب یا فیلم مفید در رابطه با این موضوع داره؟!!!


دوست عزیز سوال شما ربطی به موضوع این تاپیک نداره

----------


## parsboy

> فکر نمی کنم ربطی به این موضوع داشته باشه.


میدونم من در تالار هم مطرح کردم اما جوابی نگرفتم گفتم شاید دوستان کمک کنند!!!

----------


## engmmrj

> میدونم من در تالار هم مطرح کردم اما جوابی نگرفتم گفتم شاید دوستان کمک کنند!!!


شما مگه به php و js مسلط هستید که همچین سوالی میکنید :متفکر:

----------


## parsboy

اونش به خودم مربوطه عزیزم فکرنکنم به شما مربوط باشه :لبخند:

----------


## engmmrj

آقای hidensoft خیلی ممنون بابت تاپیک خوبتون
خیلی قشنگ هم یاد گرفتم
فقط در بحث وارثت و.. نگفتین به چه دردی میخره و چه کاری هایی میشه انجام داد
اگه میشه یه مثال بزنید

----------


## engmmrj

> اونش به خودم مربوطه عزیزم فکرنکنم به شما مربوط باشه


اگه مربوط نمیشه پس چرا پست زدید؟ :قهقهه:

----------


## lordofphp

سلام
دوستان لطفا با هم دیگه دعوا نکنین
ببینید سوال برای هر فردی پیش میاد چه مسلط باشه چه نباشه 
بهتره دوستان با همدیگه باشیم تا دشمن باشیم این دوستی خیلی بهتره
ان شاء الله که این دوستی حفظ میشه 
یاعلی

----------


## hidensoft

> قای hidensoft خیلی ممنون بابت تاپیک خوبتون
> خیلی قشنگ هم یاد گرفتم
> فقط در بحث وارثت و.. نگفتین به چه دردی میخره و چه کاری هایی میشه انجام داد
> اگه میشه یه مثال بزنید


ببینید به عنوان مثال ما می خوایم کلاس هایی با اسم یه سری حیوان بسازیم و حرکات این هارو پیاده سازی کنیم. به عنوان مثال حیوانات شیر  ، گوسفند ، تمساح. به این کد نگاه کنید.

<?php
class Lion{

  function Attack(){}

  function Eating(){}

  function Runing(){}

}

class Sheep{

  function Eating(){}

  function Walking(){}

}

class Alligator{
  
  function Attack(){}

  function Eating(){}

  function Crawl(){}

}
?>

همونطور که میبینید تابع Eating در بین تمام حیوانات تکرار شده. حالا برای جلوگیری از duplicate شدن کد میایم و یه کلاس مادر در نظر میگیریم که لازم نباشه این تابع توی همه کلاس ها تکرار بشه. حالا به این کد نگاه کنید.

<?php

class Animal{
  
  function Eating(){}

}

class Lion extends Animal{

  function Attack(){}

  function Runing(){}

}

class Sheep extends Animal{

  function Walking(){}

}

class Alligator extends Animal{
  
  function Attack(){}

  function Crawl(){}

}
?>

حالا تمام حیوانات از کلاس مادر که Animal هست تابع Eating رو به ارث می برند و دیگه نیاز نیست که برای تمامشون یک تابع رو تکرار کنیم. اما همونطور که میبینید تابع Attack هم بین شیر و تمساح مشترک هست. پس میایم یه کلاس دیگه اضافه می کنیم که این تابع رو در خودش داشته باشه و کلاس شیر و تمساح ازش ارث ببرند.

<?php

class Animals{
  
  function Eating(){}

}

class Predator_Animals extends Animals{
  
  function Attack(){}

}

class Lion extends Predator_Animals{

  function Runing(){}

}

class Sheep extends Animals{

  function Walking(){}

}

class Alligator extends Predator_Animals{
  
  function Crawl(){}

}
?>

سوالی بود در خدمتم.

----------


## engmmrj

ممنون از مثال خوبتون

----------


## engmmrj

باتوجه به مثالتون من این کد رو نوشتم.که هیچی نشون نمیده

class oop{
	function sample88($name){
	$this->name=$name;
	
	}
	}
class bg extends oop{
	function sample088(){	
print $this->name;
}
}
$oop=new oop;
$bg=new bg;
$oop->sample88('ok');
$bg->sample088();
بازم ممنون از آموزش خوبت به نظر من شما باید معلم بشن شایدم باشید(مطلب رو ذوب میکنیت عین کره میریزن تو دهان ما :قلب: )
یه سول دیگه دستور زیر چیکار میکنه
پست چهار
function printTheRightSound($obj)
{
    if ($obj instanceof Animal) 
    {
        $obj->makeSound();
    } 
    else
    {
        print "Error: Passed wrong kind of object";
    }
    print "\n";
}

----------


## hidensoft

> باتوجه به مثالتون من این کد رو نوشتم.که هیچی نشون نمیده


ببینید وراثت در صورتی اتفاق میوفته که توابع دارای یک نام یک سان نباشند. (در مورد صدا کردن توابع) شما وقتی می گی 
$oop->sample88('ok');
تابع sample88 از کلاس oop رو داری اجرا می کنی که توی دستور بالا میاد متغیر name رو با مقدار ok ست می کنه. بعد توی خط بعد 
$bg->sample088();
خب ببین این الان یه متغیر دیگست که از کلاس bg گرفته شده و ارث بری داره از oop. این متغیر دیگه اون متغیر نیست. یک شی دیگه است. درسته که شما از extends استفاده کردی اما دلیلی نداره که متغیر name از bg$ همون مقداری رو داشته باشه که  این متغیر در oop$ داره. استفاده صحیح از وراثت این شکلیه :

<?php

class oop{
    function setName($name){
	$this->name=$name;
    }
}
class bg extends oop{
    function getName(){   
	print $this->name;
    }
}

$bg = new bg;
$bg->setName('xXx');
$bg->getName();

در مورد سوال دومتون این مربوط به بحث پولی مورفیسم هست. مطالب مربوط بهش رو بیشتر مطالعه کنید.
کار این تابع اینه که اگر کلاسی که بهش داده شده خود کلاس Animal باشه یا کلاسی باشه که از این کلاس ارث بری داشته باشه تابع makeSound رو فراخوانی می کنه.

----------


## Tarragon

ببخشید من یه سوال داشتم درباره ی public ، protected و private.
من می خوام نوع متغیر $class->error; را جوری بزارم که زمان استفاده بشه خوندش اما نشه تغیرش داد بنظر شما باید چکار کنم؟

----------


## MMSHFE

نوعش رو private بگذارین و بعد یک متد public بنویسید که مقدارش رو return میکنه و متدی برای مقداردهی بهش ننویسید. اینطوری فقط با کمک متدی که نوشتین، میشه خوندش و نمیشه تغییرش داد. موفق باشید.

----------


## dr_hsy

سپاس بی کران از همه دوستان مخصوصا *hidensoft*  عزیز ..
به قول یکی از دوستان تشکر خالی کافی نبود 
درود درود درود 
در ضمن تقدم متد ها در کلاسهای والد و فرزند چطوری هست ؟ 
منظور وقتیه که یه متد رو در هر دو کلاس تعریف کنیم ( الان به ذهنم رسید تست نکردم خودم :دی )

----------


## mtchabok

> سپاس بی کران از همه دوستان مخصوصا *hidensoft*  عزیز ..
> به قول یکی از دوستان تشکر خالی کافی نبود 
> درود درود درود 
> در ضمن تقدم متد ها در کلاسهای والد و فرزند چطوری هست ؟ 
> منظور وقتیه که یه متد رو در هر دو کلاس تعریف کنیم ( الان به ذهنم رسید تست نکردم خودم :دی )


 سلام
حق تقدمی ( واژه حق تقدم مناسب نیست ) وجود نداره بلکه متد فرزند جایگزین متد والد در کلاس فرزند میشه . البته در خود کلاس فرزند توسط کلمه کلیدی parent به متدها و پروپرتیهای والد دسترسی داریم .

----------


## tux-world

سلام. مباحث خوبی مطرح شده چند تا سوال داشتم
۱- تفاوت این دو کد تو چیه؟

public static function say_hi()
static public function say_hi()

۲- منظور از عملگر =& چیه؟
۳- تو مثالی که مطرح شده بود تابع validate صدا نزده شده . چطوری فراخانی شده پس؟


    function ValidateEmail ($email){
        $this->email=$email;
        Validator::Validator();
    }
    function validate() {
        $pattern=
    "/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)+/";
    }

----------


## maede_h

سلام خدمت دوستان عزیز
بد ندیدم در این تاپیک سایت http://net.tutsplus.com رو بهتون معرفی کنم که فوق العاده آموزشهای خوبی برای شی گرایی (و البته سایر موارد) داره
اگه توی این سایت یه سرچ بزنید: oop خیلی آموزش های خوب و مفیدی پیدا می کنید و حتی یک سریش هم ویدیویی هست که مرحله به مرحله بهتون می گه باید چیکار کنید و چه فایلی بسازید.
من خیلی استفاده بردم از این سایت. البته این هم بگم که تمام ویدیوهاش رایکان نیست و یه بخشی از اونها پولی می شه.

----------


## Ali0Boy

باسلام
خیلی ممنون از آموزش بسیار مفید و آموزندتون.

من یک نظری داشتم، بهتر نیست، یه فایل pdf هر چندگاهی از قسمت ها آموزشی این تاپیک و بعد از بحث ها در مورد هرکدام از مطالب و جمع بندی پایانی آن، در قسمت اول تاپیک یا حالا هر جایی از اون قرار بدهید تا دوستان یا افراد مبتدی-ای مانند من، در بین این همه بحث و جدل سر گیجه نگیرند  :کف کرده!: 

البته اساتید زبون درازی من رو ببخشید  :خجالت:

----------


## moji-php

سلام.آقا دمت گرم همین oop رو ادامه بده به صورت حرفه ای و لطفا چندتا مثال جامع و کاربردی هم بنویسید.ممنون

----------


## csvbcscp

کتاب معمای شی گرا در C#‎ اسم کتابیه که اخیراً توسط معلم خوشنام *خانم زهرا بیات* نوشته شده،در این کتاب سعی شده با مثال پیش بره ، و به صورت خلاصه و روان به آموزش مفاهیم شی گرا در سی شارپ پرداخته
من فکر میکنم برای کسانی که دنبال یک راه حل ساده و سریع برای یادگیری OOP در سی شارپ هستند کتاب خوبی میتونه باشه.

----------


## MRmoon

> کتاب معمای شی گرا در C#‎ اسم کتابیه که اخیراً توسط معلم خوشنام *خانم زهرا بیات* نوشته شده،در این کتاب سعی شده با مثال پیش بره ، و به صورت خلاصه و روان به آموزش مفاهیم شی گرا در سی شارپ پرداخته
> من فکر میکنم برای کسانی که دنبال یک راه حل ساده و سریع برای یادگیری OOP در سی شارپ هستند کتاب خوبی میتونه باشه.


دوست عزيز اينجا بخش PHP بود بهتر بود اين كتابرو در بخش C شارپ معرفي ميكردي

----------


## csvbcscp

> دوست عزيز اينجا بخش PHP بود بهتر بود اين كتابرو در بخش C شارپ معرفي ميكردي


بله حق با شماست ،من  oop رو تو سایت جستجو کردم و به این تاپیک برخوردم و با این که این کتاب در مورد شی گرایی در C#‎ است، اما بخاطر اینکه شی گرایی یک مفهوم کلی است، فکر کردم بهتره این کتاب جدید رو به دوستان معرفی کنم

----------


## parsboy

باسلام وتشکر از دوست خوبم hidensoft
مطالب بسیارعالی و ساده هستند خواهشا ادامه بدید این بحثو ممنون.
موفق باشید.

----------


## parsboy

باسلام دوستان هرکس آموزش مفیدی در این موضوع داره واسه بچه ها بزاره ممنون
موفق باشید.

----------


## moji-php

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

----------


## ali865

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

----------


## olampiad

سلام
به این کد یه نگا بندازدید

function printTheRightSound($obj)
{
    if ($obj instanceof Cat)
    {
        $obj->miau();
    }
    else if ($obj instanceof Dog)
    {
        $obj->wuff();
    }
    else
    {
        print "Error: Passed wrong kind of object";
    }
    print "\n";
}


اینجا منظور از کلمه instanceof  چیست؟
چه نقشی تو کد ایفا می کنه؟ 
بی نهایت ممنون

----------


## css-man

یه مثال برای تابع __destruct()   میزنید که من بیشتر متوجه بشم؟

بیشتر چه جاهایی استفاده میشه؟

----------


## MMSHFE

بطور خلاصه و بخوام بگم، این تابع نقطه مقابل construct__ هست. همونطور که هر کاری میخواین موقع ایجاد یک شئ جدید انجام بشه، توی تابع construct__ مینویسید، هر کاری هم میخواین موقع ازبین رفتن شئ انجام بشه، توی destruct__ بنویسید.

----------


## MMSHFE

> سلام
> به این کد یه نگا بندازدید...


instanceof اگه شئ سمت چپش از نوع کلاس سمت راستش باشه، نتیجه true برمیگردونه. مواردی که true تولید میکنه:
1- شئ سمت چپ از کلاس سمت راست تولید شده باشه
2- شئ سمت چپ از یکی از کلاسهای فرزند کلاس سمت راست تولید شده باشه

----------


## Yashar1989

سلام
من تو کد زیر جای یوزر هر چی میزارم پیغام connected رو دریافت میکنم
مشکل از چیه؟
<?php
    class DatabaseQuery
    {
         
        function ConnectToDB($server,$user,$pass)
        {
				if(mysql_connect($server, $user, $pass))
					echo 'Connected' . '<hr />';
						else
					echo 'Not Connected ' . mysql_error() . '<hr />';
        }
    }
     
    $my_var = new DatabaseQuery();
    $my_var->ConnectToDB('localhost','root','');
?>

----------


## sadegh1362

سلام
 مقداری که بر می گرده رو با تابع var_dump چک کنید ببینید شاید یه آرایه ی خالی برمی گردونه  یا یه مقداری بر میگردون همیشه . اونوقت درستش کنید
یا میتونید شرط if رو به این صورت بنویسید   
!empty(mysql_connect($server, $user, $pass))

----------


## sherlock0111

حل شد............

----------


## rahahost

با سلام خدمت همه ی دوستان .

یه سوالی داشتم در همین مورد :

دلیل اینکه میاد یک کلاس رو والد کلاس دیگه قرار میدن چیه ؟
اگه هدف استفاده کرده از متدهای کلاس والد باشه ، مکه نمیشه یک کلاس رو درون کلاس دیگه استفاده کرد ؟

و  مورد دیگه ایکه فرض کنید ما یک فایل کانفیگ داریم که اطلاعات دیتابیس  درونش هست ، حالا میخوام یک کلاس داشته باشم برای دیتابیس و اجرا کردن یک  کوئری با PDO که بیاد دستور زیر رو انجام بده :
SELECT * FROM user

و  درون حلقه قرار بده و تمام یوزرهامو نمایش بده ( با روش معمول میتونم این  کارو انجام بدم اما چون شی گرایی ملاک هست و PDO هم خودش شی گرا نوشته شده ،  کمی گیج شدم که چطور میشه این کارو انجام داد !؟


ممنون میشم راهنماییم کنید .

در ضمن ، خیلی خوب میشد اگر یک تاپیک برای پرسش و پاسخ این موضوع جالب ساخته میشد تا اینهمه سوال اینجا مطرح نمیشد .

از استارتر هم خیلی خیلی ممنونم ، اطلاعات خوبی بدست آوردم .

----------


## m.alinejad

برای آموزش *OOP* در *PHP* می تونید از کتاب *PHP Object-Oriented Solutions* استفاده کنید.
*http://ebook-dl.com/item/php_object_oriented_solutions_david_powers*

----------

