PDA

View Full Version : آموزش برنامه نویسی OOP



hidensoft
یک شنبه 06 آبان 1386, 23:05 عصر
سلام
از عنوان انتخاب شده معلوم هست که در مورد چی هست ولی من واسه اون دسته از کسانی که به تازگی وارد برنامه نویسی شند توضیح می دم :
برنامه نویسی شی گرا (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
دوشنبه 07 آبان 1386, 12:35 عصر
ضمن تشکر از مطلب مفیدتون.
اجازه بدید چند مطلب کوچک هم بنده اضافه کنم.
تعریف کلاس فقط یک الگو هست و وقتی با دستور new به یک متغییری نسبتش میدیم، یک نمونه از روی اون کلاس میسازه و در حافظه ذخیره میشه (درحالیکه تعریف کلاس فقط یک الگو هست که میتونه توی حافظه هم نباشه) و اون متغییر با اون کلاس مرتبط میشه.
البته این مفهوم کلی هست و پیاده سازی میتونه خیلی پیچیده تر باشه بنا به بهینه سازی و غیره. مثلا اینکه هر نمونه از کلاس نیاد و کل ساختار و تعریف و تابعها رو بخواد درخودش حمل کنه و بجاش یک رفرنس به الگو داده بشه درموقع نیاز به اجرای تابع و غیره.
بهرحال این تقریبا بدیهی هست که متغییرهای هر نمونه از کلاس (در اصطلاحات فنی شیء گرایی Instance یا نمونه گفته میشه) هرکدوم باید در مکان جداگانهء خودشون ذخیره شده باشن و غیره (همش و غیره شد!!).
فقط خواستم بگم این تفکر که فکر کنیم اون تعریف کلاس چیزی فراتر از یک الگو هست و متغییرهای تعریف شده از اون کلاس چیزی ندارن جز یک مرجع منفرد، چندان درست بنظر نمیرسه.
این رو مقایسه کنید با مفهوم استراکچر که از مدتها قبل از اختراع شیء گرایی، در بسیاری زبانهای برنامه نویسی وجود داشته. در اونجا هم ما یک تعریف داریم که بخودی خود چیزی موجود و قابل دستیابی نیست (احتمالا در کد کامپایل شدهء اجرایی هم اثری ازش باقی نمیمونه)، بلکه بعنوان الگویی برای ساخت و اختصاص حافظه برای متغییرهایی از اون نوع و دسترسی به محتویات اونها مورد استفاده قرار میگیره.
بنظرم تفاوت عمدهء استراکچر با کلاس این هست که استراکچر فقط محتوی دیتا/متغییر هست و هیچ تابعی (در اشیاء متد گفته میشه) نداره.


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

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

hidensoft
چهارشنبه 09 آبان 1386, 17:20 عصر
سلام
امروز می خوایم در این موارد باهم صحبت کنیم


__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
شنبه 03 آذر 1386, 10:39 صبح
سلام
من نمی دونم چرا به برنامه نویسی Oop اصلا احمیت داده نمی شه ! واسه پیدا کردن یک کار معمولی هم حداقل شما باید Oop بلد باشی .. بریم سر اصل مطلب

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

پولی مورفیسم

می شه گفت پیچیده ترین روش برنامه نویسی در مبحث oop بر می گرده به این بخش . با استفاده از این روش می توانید کنترل برنامه را افزایش داده و از تعریف چند آبجکت برای چند کلاس جلوگیری کرد .
این مثال از صفحه 67 و 68 PHP 5 Power Programming (http://www.phptr.com/content/images/013147149X/downloads/013147149X_book.pdf)هست .


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
پنج شنبه 08 آذر 1386, 14:40 عصر
مزایای این نوع برنامه نویسی چه چیزی هست؟
این لینک (http://fa.wikipedia.org/wiki/برنامه‌نویسی_شی‌گرا) رو مطالعه بفرمایید .. اگر مفهموم نبود بگید براتون توضیح می دم


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


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

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

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

hidensoft
پنج شنبه 15 آذر 1386, 12:17 عصر
سلام
دوستانی که بحث رو دنبال کردند دیگه حالا آمدگی پروژه های خیلی بزرگ تر رو دارند.
با یک تمپلت انجین کار رو شروع می کنیم.
زنگ تفریح
این موتور تمپلت خیلی سادست پس زیاد خوشحال نشید و فردا برید یه 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 به اینجا (http://ir2.php.net/manual/en/function.array-merge.php) نگاهی بی اندازید.


function parse($tpl_file)
این تابع کار اصلی رو انجام می ده ، یعنی باید مقدار متغیر ها رو جایگذین کنه .
ابتدا بررسی می کنه که آیا فایلی که آدرس داده شده موجو هست یا خیر. در صورتی که وجود نداشته باشه خطا صادر می شه .
در خط بعد توسط تابع file_get_contents تمامی اطلاعات موجود در فایل مورد نظر بصورت استرینگ به متغیر tpl_content$ داده می شود. در صورت وجود ابهام در مورد عملکرد تابع file_get_contents به اینجا (http://ir2.php.net/manual/en/function.file-get-contents.php) نگاهی بی اندازید.
سپس توسط یک foreach ساده و با کمک تابع str_replace مقدار متغیر ها جایگذین نام متغیر ها می شوند.
در صورت وجود ابهام در مورد عملکرد تابع str_replace به اینجا (http://ir2.php.net/manual/en/function.str-replace.php) نگاهی بی اندازید.
در صورت وجود ابهام در مورد عملکرد foreach به اینجا (http://ir2.php.net/manual/en/control-structures.foreach.php) نگاهی بی اندازید


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

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

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

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

hidensoft
دوشنبه 26 آذر 1386, 21:35 عصر
خوشبختانه دوستان زیادی به استفاده از Oop تشویق شدن و دارن روش کار می کنند .
قدم بعدی ساخت یک وبلاگ هست که در ابتدا هیچ امکاناتی نداره ولی در ادامه می خوایم گسترشش بدیم تا دوستان با مفاهیم Mvc .. طراحی دیتا بیس .. منطق کلی Oop .. بیشتر آشنا بشوند .
موفق باشید

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

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

14312

oxygenws
یک شنبه 14 بهمن 1386, 20:24 عصر
به نظرت این پست آخر به OOP ربطی داره؟؟؟؟؟؟؟

zamanphp
یک شنبه 14 بهمن 1386, 20:43 عصر
محمد عزیز
بهتره این بحث های تکراری رو بزاری کنار و درباره الگوهای طراحی مطلب بزاری تا ملت حال کنند
نظیر :

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
سه شنبه 16 بهمن 1386, 15:34 عصر
سلام به شما دوست عزیز .
سرم خیلی شلوغه نمی رسم بیام درست حسابی روی آموزش کار کنم اما به محض اینکه سرم خلوت بشه حتما این کارو می کنم .. از توجه شما هم بسیار سپاس گذارم.

cs2007
دوشنبه 13 خرداد 1387, 02:36 صبح
سلام.
من فکر میکنم کار خوبی است که از ابتدا به طرف بالا برویم ... همین کاری را که شما دارید انجام میدهید ...

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

majoran
چهارشنبه 19 تیر 1387, 16:14 عصر
خیلی بحث جالبی بود تا حالا به اینجا سر نزده بودم دستتون درد نکنه آقا یک لطف می کنید در رابطه با اینکه چطور با آجاکس این کلاس ها را ترکیب کنیم صحبت بکنید که مثلا با فشار دادن فلان دکمه فلان کلاس اجرا شود و.....
باز هم متشکرم

niaz_85
چهارشنبه 26 تیر 1387, 15:30 عصر
سلام
ببخشید من یه مشکل دلرم.phpeditor رو نصب کردم...ولی وقت اجرا پیغام میده مفسری پیدا نکرده....باید چیکار کنم؟

hidensoft
شنبه 29 تیر 1387, 00:09 صبح
زدن کلید تشکر به تنهایی راضی کننده نبود. از Sociant7 و سایر دوستان کمال تشکر رو دارم
واقعا عالی بود Sociant7

hidensoft
شنبه 29 تیر 1387, 14:48 عصر
سلام . بازم برگشتم که یکی دوتا مقاله توپ در مورد PHP براتون بگذارم. اما این تمام مقاله ها رو در مورد Pattern ها در PHP می نویسم. امید وارم مورد توجه شما دوستان عزیز قرار بگیرد.

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

MVC چیست ؟

Model View Control

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

http://uploadimage.org/images/484dmgpuufwe0ukrg2zm.gif

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

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

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

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

hidensoft
دوشنبه 31 تیر 1387, 01:02 صبح
سلام دوستان .
امروز نوبت ساختن یک 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
دوشنبه 31 تیر 1387, 08:58 صبح
سلام
ممنون بابت مطالب خوب و آموزنده :)


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

موفق باشید.

hidensoft
دوشنبه 31 تیر 1387, 14:41 عصر
ProductView::ProductView($model);
یا

parent::ProductView($model);
یا

$this->ProductView($model);

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

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

musiox
دوشنبه 31 تیر 1387, 19:27 عصر
ProductView::ProductView($model);

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

aryaei2000
یک شنبه 13 مرداد 1387, 15:29 عصر
تاپیک جالبی بود ممنون

aryaei2000
یک شنبه 13 مرداد 1387, 15:30 عصر
این تاپیک عالیه

aryaei2000
یک شنبه 13 مرداد 1387, 15:31 عصر
فوق العاده است
ممنونم

aryaei2000
یک شنبه 13 مرداد 1387, 15:33 عصر
فوق العاده است

hidensoft
یک شنبه 13 مرداد 1387, 19:45 عصر
بی شک یکی از مشکلات برنامه نویسان 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
سه شنبه 15 مرداد 1387, 09:43 صبح
من قبلا نوشتاری در زمینه‌ی ساخت فریم‌ورک MVC با PHP (http://barnamenevis.org/forum/showthread.php?t=112186) نوشته‌ام. شاید به درد کسی خورد.

hidensoft
دوشنبه 04 شهریور 1387, 15:46 عصر
سلام
امید وارم که آموزش های قبلی به شما کمک کرده باشه که در برنامه نویسی 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
دوشنبه 04 شهریور 1387, 22:44 عصر
عزیز دلم چرا از امکانات php5 استفاده نمی کنی و OOP رو به صورت کامل پیاده سازی نکردی (البته استفاده از ابزارها بسیار مناسب بوده) اما نه خبری از protect بود نه public نه ...

hidensoft
سه شنبه 05 شهریور 1387, 14:31 عصر
شما گسترشش بدید . اصلاحش کنید .
من لزومی برای اصتفاده از از protect , public ندیدم . اگه فکر می کنید لازمه اضافه کنید . ممنون می شم که به دیگر برنامه نویسان هم کمک کنید.

vahid4134
سه شنبه 05 شهریور 1387, 14:54 عصر
شما گسترشش بدید . اصلاحش کنید .
من لزومی برای اصتفاده از از protect , public ندیدم . اگه فکر می کنید لازمه اضافه کنید . ممنون می شم که به دیگر برنامه نویسان هم کمک کنید.
قربان تو اگر وقت کنم حتما (ولی روی اینکه وقتم باز میشه اصلا حساب باز نکن:لبخند:)
به خاطر مطالب مفیدت واقعا ممنون. (واقعا خوندنش رو به هر کسی که می خواد شی گرایی رو یاد بگیره توصیه می کنم)

vahid4134
سه شنبه 05 شهریور 1387, 17:34 عصر
وحید تو هیچ وقت عوض نمی شی . نمی دونی شناختی یا نه ! اما روزای خوشی رو برات آرزو می کنم.
:لبخند: (اتفاقا دیدمت حال و هوای شوخی بهم دست داد)
مگه میشه بهترین دوست و عزیزترین دوستم رو یادم بره
عزیز من دیگه توی یاهو نمیام اگر خواستی پیام خصوصی بدم تا .... مخلصتم هستیم
(یادش به خیر)

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

با تشکر

musiox
چهارشنبه 06 شهریور 1387, 08:35 صبح
به نظر من هم بهتره ( الزامی! ) یه کم بروز تر بگی .

naser67
جمعه 08 شهریور 1387, 20:04 عصر
من لزومی برای اصتفاده از از protect , public ندیدم

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

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

musiox
شنبه 09 شهریور 1387, 00:11 صبح
تا امنیت کدت بالاتر بره
چطور؟میشه بیشتر توضیح بدی؟

naser67
شنبه 09 شهریور 1387, 11:03 صبح
خوب وقتی به یک متغیر فقط از همون کلاس بشه دسترسی داشت به نظر شما امنیت بالاتر نمیره اونم پروپرتی مثل user ,pass که برای اتصال به دیتابیس استفاده میشه

vahid4134
جمعه 15 شهریور 1387, 18:28 عصر
خوب وقتی به یک متغیر فقط از همون کلاس بشه دسترسی داشت به نظر شما امنیت بالاتر نمیره اونم پروپرتی مثل user ,pass که برای اتصال به دیتابیس استفاده میشه
البته نمیشه گفت امنیت کد بالاتر میره. چون به هر حال سورس کلاس پدر هم در دسترس هست.
در واقع اینها برای این هستند که وقتی یک نفر می خواد از این کلاس به عنوان object استفاده کنه می دونه که کاری به private و public نداره و کسی هم که می خواد این کلاس رو به عنوان کلاس والد استفاده کنه کاری به private نداره.
اینجوری استفاده از کلاس راحتتر میشه

naser67
چهارشنبه 20 شهریور 1387, 11:50 صبح
خوب معلومه کسی که سورس در اختیارشه همه کار میتونه بکنه ولی فکر کن کسی به سورس دسترسی نداشته باشه اونوقت چی؟

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

vahid4134
چهارشنبه 20 شهریور 1387, 14:07 عصر
خوب معلومه کسی که سورس در اختیارشه همه کار میتونه بکنه ولی فکر کن کسی به سورس دسترسی نداشته باشه اونوقت چی؟

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

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

naser67
چهارشنبه 20 شهریور 1387, 15:25 عصر
به نظر شما فلسفه وجودی private اینه که کسی که داره برنامه رو توسعه میده بدونه با اون متد یا متغیر نباید کاری داشته باشه؟


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

100% مخالفم


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


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

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

musiox
چهارشنبه 20 شهریور 1387, 18:18 عصر
object(myCls)#1 (1) { ["user:private"]=> string(3) "asd" }

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

naser67
چهارشنبه 20 شهریور 1387, 20:32 عصر
یه ارث بری کافیه که من هر چی بخوام داشته باشم

من یه کد ساده میزارم ، شما اون متد 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
چهارشنبه 20 شهریور 1387, 21:23 عصر
من یه کد ساده میزارم ، شما اون متد 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();
اول یکم تحقیق کن بعد بیا پست بزن
دوست عزیز ایشون دانششون بیشتر از این حرفهاست (البته من هم فکر می کردم که میشه ولی تست نکرده بودم اشاره ای نکردم که دوست استاد بنده موضوع رو بیان کردند) شما کد زیر رو امتحان کنید


<?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
چهارشنبه 20 شهریور 1387, 21:34 عصر
دوست عزیز ایشون دانششون بیشتر از این حرفهاست دوست من من تو این قضیه شکی ندارم ، منم نخواستم بگم که من حالیمه فلانی حالیش نیست
داریم دوستانه بحث میکنیم تا سطح دانشمون بره بالا ، شما هم از حرفای من ناراحت نشو

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

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

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

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

tabib_m
پنج شنبه 21 شهریور 1387, 00:32 صبح
اونی که داخل کلاس رو نوشته، خودش خارج کلاس رو نوشته.... پس در استفاده از متغیر در خارج از کلاس، اختیار تام داره... در این مسئله اصلا مبحث امنیت پیش نمیات که بخوات به کد مذکور ربط داشته باشه یا نه!
فقط ایجاد نظم هست.

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

musiox
پنج شنبه 21 شهریور 1387, 01:00 صبح
آقا وحید مارو شرمنده نکنید ما کوچیک همه هستیم .
اول باید به مفاهیم 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 />';
}
}

}

?>

اینم یه دعوای جالب (http://debuggable.com/posts/programming-psychology-ii-private-methods:481ed862-b0d8-4a0e-9247-165c4834cda3)

alimokhlesi
شنبه 23 شهریور 1387, 08:52 صبح
اونی که داخل کلاس رو نوشته، خودش خارج کلاس رو نوشته.... پس در استفاده از متغیر در خارج از کلاس، اختیار تام داره

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



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


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




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

؟

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



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


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



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

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

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

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

naser67
شنبه 23 شهریور 1387, 17:19 عصر
امنیت رو برقرار می کنه ولی نه امنیت مخفی کردن کد. امنیت

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

vahid4134
شنبه 23 شهریور 1387, 19:14 عصر
منم گلوم خشک شد که همینو بگم
پس شد مثل قضیه عنب و انگور و ازوم و غیره:لبخند:

musiox
شنبه 23 شهریور 1387, 21:07 عصر
من که نفهمیدم چرا اینو گفتی .
اگه بحث امنیت نیست پس بحث چیه ؟

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

منم گلوم خشک شد که همینو بگم
شما هم که هر بار یه چیز میگی ...

naser67
یک شنبه 24 شهریور 1387, 09:44 صبح
شما هم که هر بار یه چیز میگی

هر بار چی گفتم

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

alimokhlesi
یک شنبه 24 شهریور 1387, 12:59 عصر
نمی دونم چرا این حرفو می زنی ؟!
آیا OO برای امنیت طراحی شده ؟!

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


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






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

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

musiox
یک شنبه 24 شهریور 1387, 13:37 عصر
هر بار چی گفتم

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

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

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

hidensoft
پنج شنبه 23 آبان 1387, 16:25 عصر
سلام
چند وقتیه خدمت مجال نمی ده در کنار برو بچس باشم

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

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

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

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

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

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


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



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


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

vahid4134
پنج شنبه 23 آبان 1387, 19:55 عصر
سلام
چند وقتیه خدمت مجال نمی ده در کنار برو بچس باشم

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

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

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

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

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

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





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

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

parsajax
سه شنبه 10 دی 1387, 05:25 صبح
اولن سلام به همه دوستان و استادان ارجمند

بعد از خوندن اينهمه پست موندم چي بگم ... مبحث با چي شروع شد وبه كجا كشيده شد!
نظر خودم رو اگه بخوام در رابطه با اين بحث ها بگم بايد متذكر شم كه برنامه نويسي شعي گرا براي پي اچ پي درست نشده كه اينجوري به جون هم افتاديد و يه گروه هي كد ها رو زند ميكنه اونيكي ديزنند ميكنه ... برنامه نويسي شعي گرا يه معقوله جدايي است كه تو اكثر زبانهاي برنامه نويسي سطح بالا استفاده شده و ميتونه توي يه اپليكيشن وب و يا يه وبسايت استفاده شه يا تو يه برنامه ويندوز يا ... دوستان بايد توجه كنند كه اين خاصيت ها به دليل قشنگي و زيبايي در نظر گرفته نشده و علت به وجود اومدن هركدومشون احساس نيازيه كه بهشون شده ... در نظر بگيريد كه تو اپليكيشني يه متغير به عنوان فلگ كه نمايانگر دسترسي مديريت هست كه با ورود اعضاع به 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
یک شنبه 15 دی 1387, 17:31 عصر
با تشکر از دوست عزیز PARSAJAX

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

با تشکر
امیر

hoja06101001
جمعه 25 بهمن 1387, 22:32 عصر
واقعا از همه ممنونم تا اینجا خیلی مفید بود .

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

Abalfazl
چهارشنبه 02 اردیبهشت 1388, 00:22 صبح
مباحثی مثل کپسوله بندی ،سازنده ، شی ، در زبانهای مختلف شبیه به هم هستند


جالبترین و خنده دارترین مقاله شی گرایی!
- مفاهیم پایه شی گرایی:
http://amir87.persiangig.com/document/JAVA%20OOP%20object%20class.pdf

پیاده سازی Polymorphism در PHP :

http://amir87.persiangig.com/document/Polymorphism.pdf

یک مقاله مفید دیگر :

ایجاد یک CMS با استفاده از PHP شی گرا:

http://amir87.persiangig.com/document/1LAST%20EDITON%20PHPOOP%20_CMS.pdf

http://estakhrian.blogfa.com

hidensoft
چهارشنبه 02 اردیبهشت 1388, 15:07 عصر
http://propel.phpdb.org/trac/chrome/site/logo.gif (http://propel.phpdb.org/trac/)

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

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
چهارشنبه 16 اردیبهشت 1388, 11:28 صبح
سلام ، ممنون که رو این تاپیک وقت گذاشتید، یه سوال داشتم. می خواستم ببینم میشه داخل یک اسکریپت پی اچ پی به متغیر های سراسری خارج از کلاس از داخل کلاس دسترسی داشت؟

zoghal
پنج شنبه 17 اردیبهشت 1388, 10:30 صبح
اگر متغییر خارج از کلاس به صورت global تعریف شده باشه، تو کلاس و در متد ها هم میتونید این متغییر رو استفاده کنید.
ولی کلا بی معنی هست این کار

hidensoft
سه شنبه 22 اردیبهشت 1388, 18:40 عصر
از دوست عزیزم zoghal (http://barnamenevis.org/forum/member.php?u=6777) تشکر می کنم که به این تاپیک پاسخ دادند.
لطفا سوال هایی که مربوط به مسائلی غیر از شی گرایی هست رو در انجمن بپرسید ، سریع تر پاسخ داده می شه.

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

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

tanha2007
دوشنبه 28 اردیبهشت 1388, 21:36 عصر
سلام دوستان،
میشه لطف نموده این کلاس جستجو را انعطاف پذیر درست نمایند، یعنی بشه برای چند جدول کار نماید و هم چنان فیلد قسمت رابطه ...

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


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

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

14312

Mo_hasan1366
شنبه 16 خرداد 1388, 07:21 صبح
خيلي ممنون از مطالب مفيد كه گذاشتيد
اگر ميشه ادامش بديد

omid_safari
شنبه 13 تیر 1388, 20:55 عصر
سلام دوستان
من براي ايجاد كلاسهاي تودرتو مشكل دارم.
بدون استفاده از وراثت و غيره... فقط ميخوام يك كلاس a تعريف كنم و در كلاس b يك يا چند تا شيي a داشته باشم.
ممنون

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

امیـرحسین
چهارشنبه 07 مرداد 1388, 02:31 صبح
سلام دوستان
من براي ايجاد كلاسهاي تودرتو مشكل دارم.
بدون استفاده از وراثت و غيره... فقط ميخوام يك كلاس a تعريف كنم و در كلاس b يك يا چند تا شيي a داشته باشم.
ممنون
فکر کنم باید از implements استفاده کنید (البته فقط در PHP5)

class b implements a {
....
}

hidensoft
پنج شنبه 29 مرداد 1388, 21:38 عصر
سلام دوستان.
مدتی هست که من در حال خدمت هستم و متاسفانه از بحث برنامه نویسی به شدت دور شدم و اطلاعاتم از همون چیزی که دوسال پیش بود فقط کمی بیشتر شده.
از تمامی دوستانی که در این مدت به پیشرفت آموزش کمک کردن ممونم .

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

راستیتش چند رو زی هست که در حال نوشتن 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
جمعه 13 شهریور 1388, 14:46 عصر
ممنون از همتون

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

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

mahyar13652000
یک شنبه 22 آذر 1388, 09:18 صبح
منم از محمد عزیز تشکر می کنم که این همه برای این کار وقت گذاشته :قلب:

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

hidensoft
دوشنبه 23 آذر 1388, 18:44 عصر
invoke__


متود جادویی invoke زمانی فراخوانی می شه که شما از یک کلاس مانند یک تابع استفاده کنید.
به عنوان مثال :

<?php
class CallableClass {
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
خیلی سادست فقط اگه دوستان در مورد is_callable (http://ir.php.net/manual/en/function.is-callable.php) مشکل دارند باید بگم این تابع چک می کنه که آیا این پارامتر ارجا داده شده قابل فراخوانی هست یا نه . برای اطلاعات بیشتر متونید به منوال مراجعه کنید.


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

major_,agic_majid
یک شنبه 11 بهمن 1388, 14:38 عصر
دست همتون درد نکنه خیلی خوب بود

famarini
شنبه 08 اسفند 1388, 02:11 صبح
سلام
لطفا مباحث را ادامه دهيد
با تشكر از همه دوستان

sonixax
پنج شنبه 13 اسفند 1388, 00:21 صبح
این Parent:: دقیقا چه میکند ؟ کلاسی که Function توش هست رو بر میگردونه ؟

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

class myclass extends yourclass
{}

hidensoft
جمعه 27 فروردین 1389, 16:02 عصر
class myclass extends yourclass
{}

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

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

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

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

Cyletech
پنج شنبه 04 فروردین 1390, 17:09 عصر
سلام
ببخشید من هنوز روش های استفاده ی صحیح از این نوع برنامه نویسی رو خوب یاد نگرفتم اما علاقه ی زیادی دارم یاد بگیرم. یعنی الان یک هفته ای هست که 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
پنج شنبه 04 فروردین 1390, 18:37 عصر
ممنون اما من نمیخوام از دستور Extends استفاده کنم
در استفاده از توابع میشه داخل یک تابع از تابعی دیگه استفاده کرد. من میخوام داخل متد یک کلاس متدی از کلاس دیگر رو استفاده کنم اما نمیخوام روابط والد و فرزندی بین این دو کلاس وجود داشته باشه. چنین قابلیتی وجود داره؟

Metal Gear Solid
جمعه 05 فروردین 1390, 13:44 عصر
این چه ربطی به شی گرایی داشت ؟!!

MMSHFE
یک شنبه 14 فروردین 1390, 16:57 عصر
ممنون اما من نمیخوام از دستور Extends استفاده کنم
در استفاده از توابع میشه داخل یک تابع از تابعی دیگه استفاده کرد. من میخوام داخل متد یک کلاس متدی از کلاس دیگر رو استفاده کنم اما نمیخوام روابط والد و فرزندی بین این دو کلاس وجود داشته باشه. چنین قابلیتی وجود داره؟
با سلام، مشروط بر اينكه اون متد به صورت static تعريف شده باشه، ميتونيد فراخوانيش كنيد، حتي اگه از extends استفاده نكنيد. فقط به جاي ::parent بايد از ::classname استفاده كنيد و به جاي classname نام اون كلاس رو قرار بدين.
موفق باشيد.

MMSHFE
یک شنبه 14 فروردین 1390, 16:58 عصر
با سلام مجدد، ضمن تشكر از همه دوستان فعال در اين بحث، به زودي يك آموزش جامع درمورد شئ گرايي در PHP آماده ميكنم و كم كم در همين بحث قرار ميدم.
موفق باشيد.

mtchabok
دوشنبه 15 فروردین 1390, 12:15 عصر
در ابتدا از 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
چهارشنبه 17 فروردین 1390, 11:43 صبح
با سلام خدمت دوستان
من oop رو بلد نیستم و با خوندن این تاپیک تازه یه چیزایی دستگیرم شده
یه چند تا سوال داشتم میخواستم بدونم کاربرد اینها چیه ؟

var , public , private , protect , ...
به عنوان مثال :


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

...

Cyletech
چهارشنبه 17 فروردین 1390, 14:50 عصر
با سلام خدمت دوستان
من oop رو بلد نیستم و با خوندن این تاپیک تازه یه چیزایی دستگیرم شده
یه چند تا سوال داشتم میخواستم بدونم کاربرد اینها چیه ؟

var , public , private , protect , ...
به عنوان مثال :


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

...


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

MMSHFE
چهارشنبه 17 فروردین 1390, 15:06 عصر
با سلام، دوست گرامي از 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
شنبه 14 خرداد 1390, 15:16 عصر
از 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
چهارشنبه 25 خرداد 1390, 12:33 عصر
با سلام، بنده توضیحاتی رو از یک کتاب در آورده ام راجع به متد ایستا (استاتیک ) که در اینجا برای دوستان قرار میدهم : (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
جمعه 07 مرداد 1390, 21:47 عصر
یه سوال:

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

MMSHFE
شنبه 08 مرداد 1390, 10:03 صبح
یه سوال:

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


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

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

armsoftpc
سه شنبه 11 مرداد 1390, 18:20 عصر
با سلام

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

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

hpsarvari
دوشنبه 07 شهریور 1390, 01:43 صبح
دوست خوبم من به شما کتاب راهنمای جامع PHP انتشارات نشر علوم رو پیشنهاد میکنم که به خوبی دو فصل را به شی گرایی اختصاص داده ...

armsoftpc
دوشنبه 07 شهریور 1390, 19:24 عصر
دوست خوبم من به شما کتاب راهنمای جامع PHP انتشارات نشر علوم رو پیشنهاد میکنم که به خوبی دو فصل را به شی گرایی اختصاص داده ...
به نام خدا
با عرض سلام
با تشکر از پاسختون
اما منظور من این نبود ، من خودم آموزش های تئوری زیاد دیده ام و خونده ام! منظور من پروژه های عملی و حرفه ای است.:قلب:
کسی پروژه ای داره بذاره ما هم استفاده کنیم.
با تشکر از همه ی دوستان.

armsoftpc
دوشنبه 14 شهریور 1390, 18:22 عصر
به نام خدا
با سلام
کسی کتاب نداشت معرفی کنه! (فارسی و جدید)

...!M.J!...
پنج شنبه 14 مهر 1390, 10:47 صبح
سلام دوست عزیزم شی گرایی وقتی خودش رو نشون میده که پروژه عظیم باشه نه تو این مثال هایی که واسه یاد گیری دوستان زحمتشو کشیدن
میخوای عملی ببینی برو vBulletin و جوملا رو دانلود کن و کرهاشو بررسی کن اینم یه مثال عملی:لبخند:

armsoftpc
چهارشنبه 20 مهر 1390, 22:42 عصر
به نام خدا
با سلام

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

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

armsoftpc
شنبه 23 مهر 1390, 20:57 عصر
به نام خدا
با سلام
مرسی ، اما خوبه قبل از این که انتشار بدید یه تغییراتی تو کد بدید ، منظور این که هم نسخه اصلی رو بزارید و هم نسخه خودتون رو چون کد ها پر از اشکاله!
بازم دستتون درد نکنه، بازم ادامه بدید.

aghasoroush
پنج شنبه 26 آبان 1390, 04:34 صبح
با سلام
اینم یه کلاس ساده کاری از بنده ی حقیر
امید وارم خوشتون بیاد
http://www.phpclasses.org/package/7144-PHP-Display-links-with-CSS-based-tooltips.html

armsoftpc
دوشنبه 30 آبان 1390, 17:37 عصر
به نام خدا
با سلام
با تشکر از دوستان ولی کلاستون کاربرد زیادی نداره و تقریبا ضعیف است ، خوب است کد کلاس را مستقمیا نگذارید و فقط از آن ها بهره گرفته و کدی بنابر سلیقه خودتان منتشر کنید.
چون اگر بنا به قرار دادن لینک ها مستقیم از سایت یا آپلودشده در برنامه نویس باشد، دیگر نیازی به این کار نیست یه سر به سایت هایی مانند راکس و phpclass می زنیم که کداش خیلی بهتر و جامع تر و زیاد تره.
به نظر من اگر کد ها رو خودتون بنویسید خیلی بهتره.
من هم یک کد که مربوط به موضاعات سایت است برای شما قرار دادم ، البته اصل کد مال خودم نیست و فقط ویرایشش کردم ، اما کد خوب و مفیدی است.:چشمک::تشویق:
78196
موفق باشید.

ravand
دوشنبه 30 آبان 1390, 19:11 عصر
بهتره در مورد ساخت سيستم مديريت محتوا با شي گرايي يه كم بحث كنيم اصلا ببينيم چجوري كار ميكنه. اين لينك يه آموزش خوب در موردش داره و خيلي هم ساده است.
ساخت ساده ترين سيستم مديريت محتوا با شي گرايي (http://css-tricks.com/1907-php-for-beginners-building-your-first-simple-cms/)

saina2006
شنبه 12 آذر 1390, 05:20 صبح
بهتره در مورد design pattern ها و نحوه استفادشون یه آموزش راه بیفته چون خیلی از برنامه نویسها باهاش آشنایی ندارن یا ازش استفاده نمیکنن

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

javadbayani
یک شنبه 20 آذر 1390, 15:54 عصر
با سلام حضور دوستان بنده هم با saina2006 موافقم ، لطفا در مورد الگوهای طراحی بحث بشه تا در این مورد هم مطالبی رو یاد بگیریم!!!!
ممنون .
همیشه شاد باشید

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

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


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

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

MMSHFE
سه شنبه 02 اسفند 1390, 22:58 عصر
بخاطر یک $ که اشتباهاً قبل از count توی توابع نوشته شده. کد صحیح اینه. شرمنده سریع تایپ کرده بودم:


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

موفق باشید.

hometgah1
چهارشنبه 03 اسفند 1390, 16:07 عصر
بخاطر یک $ که اشتباهاً قبل از 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
چهارشنبه 03 اسفند 1390, 23:14 عصر
این نمونه کد هست مشکل اصلی کد هم این بود که 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
پنج شنبه 04 اسفند 1390, 10:24 صبح
شرمنده حقیقتش اون موقعی که مثال رو گذاشته بودم، از #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
دوشنبه 14 فروردین 1391, 23:48 عصر
سلام
من داشتم مطالب رو از اول یاد می گرفتم که وقتی اقای hidensoft به قسمت اموزش یه موتور جستجوگر و mvc رسیدند اصلا هیچ توضیحی ندادند و من هم که تازه کارم خیلی برام سخت بود درک این دو درس تا قبلش همه اموزشهاشو خط به خط توضیح میداد البته اموزشها ماله سال 86 فک کنم باشه و نمیدونم که خود اقای hidensoft اصلا دیگه تو این انجمن هست یا نه
و از اساتید محترم تقاضا دارم که این دو درسو برام تشریح کنید (صفحات 1 و 2 اموزش ساخت موتور جستجوگر و mvc )

hidensoft
چهارشنبه 24 آبان 1391, 15:28 عصر
قسمت موتور جستوجو فقط یک نمونست می تونید از این قسمت فعلا رد بشید ادامه بدید. در مورد MVC سوالی اگر دارید بپرسید در خدمتم.

armsoftpc
شنبه 27 آبان 1391, 14:37 عصر
به نام خدا
با سلام و خیر مقدم به جناب hidensoft (http://barnamenevis.org/member.php?33033-hidensoft)

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

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

rezaonline.net
یک شنبه 28 آبان 1391, 02:38 صبح
در تکمیل حرفهاتون
الان 99 درصد فریم ورک ها معماری MVC رو رعایت میکنن همچنین سیستم های مدیریت محتوا دارن به این سمت میرم .
جوملا رو نگاه کنید ورژن فعلی

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

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

armsoftpc
پنج شنبه 02 آذر 1391, 18:07 عصر
سلام
با تشکر از دوستان
الان خود شما کدوم فریم ورک رو پیشنهاد می کنید و همچنین از کدوم فریم ورک استفاده می کنید؟

armsoftpc
پنج شنبه 02 آذر 1391, 18:23 عصر
جوملا رو نگاه کنید ورژن فعلی
جوملا که بدرد نمی خوره!

tux-world
پنج شنبه 02 آذر 1391, 18:34 عصر
استاد armsoftpc (http://barnamenevis.org/member.php?170720-armsoftpc)
میشه بفرمایید چرا جوملا به درد نمیخوره. این حرفتون فکر نمیکنید خیلی خیلی مضحکه. جوملا الان پلتفرم هستش میدونین یعنی چی؟

rezaonline.net
پنج شنبه 02 آذر 1391, 20:05 عصر
هر وقت جوملا تونست اطلاعات FTP رو توی فایل کانفیگ نذاره میشه اسمش رو سیستم مدیریت محتوا گذاشت .

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

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

موفق باشید

tux-world
جمعه 03 آذر 1391, 10:02 صبح
مامبو بیس؟ احسنت. فکر کنم نسخه 1.3 رو دارید میگید نه؟ جوملا از صفر کد نویسی شد بعد این نسخه . خوب شما که خبر ه هستید چرا خودتون تنظیمش نمیکنید؟ امنیت همیشه به سیستم بر نمیگرده به شرایطش هم بستگی داره. شما همینطور نصب میکنید و میشینید؟

hidensoft
دوشنبه 06 آذر 1391, 23:05 عصر
میشه بفرمایید چرا جوملا به درد نمیخوره. این حرفتون فکر نمیکنید خیلی خیلی مضحکه. جوملا الان پلتفرم هستش میدونین یعنی چی؟
اگر دوستانه از من بپرسند جوملا به درد می خوره می گم نه به درد نمی خوره. اکثر پروژه هایی که من پیاده سازی می کنم اینقدر کاستوم هستند که اگر بخووام با جوملا پیادشون کنم بادی خیلی وقت بزارم و فریم ورک جوملا بیشتر دست و پا گیرم هست تا عصای دست. اما اگر بنا باشه یه سایت مدیریت محتوا بسازم شخصا ترجیح می دم بجای WP از جوملا استفاده کنم چون حداقل یه MVC داره. من فکر می کنم منظور شما از پلتفرم همون فریم ورک هست چون پلتفرم بودن یه کد یه مقدار بی معنیه.


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

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


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

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

rezaonline.net
سه شنبه 07 آذر 1391, 21:20 عصر
مامبو بیس؟ احسنت. فکر کنم نسخه 1.3 رو دارید میگید نه؟ جوملا از صفر کد نویسی شد بعد این نسخه . خوب شما که خبر ه هستید چرا خودتون تنظیمش نمیکنید؟ امنیت همیشه به سیستم بر نمیگرده به شرایطش هم بستگی داره. شما همینطور نصب میکنید و میشینید؟
http://www.elxis.org/eblog/evolution/elxis40-vs-joomla254.html

parsboy
شنبه 09 دی 1391, 14:53 عصر
سلام دوستان من میخوام یه برنامه ای بنوسیم که 2 نفر بتونند باهم تصویری و صوتی در ارتباط باشند کسی مطلب یا فیلم مفید در رابطه با این موضوع داره؟!!!

hidensoft
شنبه 09 دی 1391, 15:44 عصر
فکر نمی کنم ربطی به این موضوع داشته باشه.

engmmrj
شنبه 09 دی 1391, 15:56 عصر
سلام دوستان من میخوام یه برنامه ای بنوسیم که 2 نفر بتونند باهم تصویری و صوتی در ارتباط باشند کسی مطلب یا فیلم مفید در رابطه با این موضوع داره؟!!!
دوست عزیز سوال شما ربطی به موضوع این تاپیک نداره

parsboy
شنبه 09 دی 1391, 16:55 عصر
فکر نمی کنم ربطی به این موضوع داشته باشه.

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

engmmrj
شنبه 09 دی 1391, 20:22 عصر
میدونم من در تالار هم مطرح کردم اما جوابی نگرفتم گفتم شاید دوستان کمک کنند!!!
شما مگه به php و js مسلط هستید که همچین سوالی میکنید:متفکر:

parsboy
شنبه 09 دی 1391, 20:26 عصر
اونش به خودم مربوطه عزیزم فکرنکنم به شما مربوط باشه:لبخندساده:

engmmrj
یک شنبه 10 دی 1391, 09:22 صبح
آقای hidensoft خیلی ممنون بابت تاپیک خوبتون
خیلی قشنگ هم یاد گرفتم
فقط در بحث وارثت و.. نگفتین به چه دردی میخره و چه کاری هایی میشه انجام داد
اگه میشه یه مثال بزنید

engmmrj
یک شنبه 10 دی 1391, 09:23 صبح
اونش به خودم مربوطه عزیزم فکرنکنم به شما مربوط باشه:لبخندساده:
اگه مربوط نمیشه پس چرا پست زدید؟:قهقهه:

lordofphp
یک شنبه 10 دی 1391, 09:41 صبح
سلام
دوستان لطفا با هم دیگه دعوا نکنین
ببینید سوال برای هر فردی پیش میاد چه مسلط باشه چه نباشه
بهتره دوستان با همدیگه باشیم تا دشمن باشیم این دوستی خیلی بهتره
ان شاء الله که این دوستی حفظ میشه
یاعلی

hidensoft
یک شنبه 10 دی 1391, 15:47 عصر
قای 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
یک شنبه 10 دی 1391, 16:26 عصر
ممنون از مثال خوبتون

engmmrj
دوشنبه 11 دی 1391, 00:38 صبح
باتوجه به مثالتون من این کد رو نوشتم.که هیچی نشون نمیده


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
دوشنبه 11 دی 1391, 15:16 عصر
باتوجه به مثالتون من این کد رو نوشتم.که هیچی نشون نمیده
ببینید وراثت در صورتی اتفاق میوفته که توابع دارای یک نام یک سان نباشند. (در مورد صدا کردن توابع) شما وقتی می گی

$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
سه شنبه 19 دی 1391, 13:01 عصر
ببخشید من یه سوال داشتم درباره ی public ، protected و private.
من می خوام نوع متغیر $class->error; را جوری بزارم که زمان استفاده بشه خوندش اما نشه تغیرش داد بنظر شما باید چکار کنم؟

MMSHFE
سه شنبه 19 دی 1391, 19:46 عصر
نوعش رو private بگذارین و بعد یک متد public بنویسید که مقدارش رو return میکنه و متدی برای مقداردهی بهش ننویسید. اینطوری فقط با کمک متدی که نوشتین، میشه خوندش و نمیشه تغییرش داد. موفق باشید.

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

mtchabok
دوشنبه 02 بهمن 1391, 03:28 صبح
سپاس بی کران از همه دوستان مخصوصا hidensoft عزیز ..
به قول یکی از دوستان تشکر خالی کافی نبود
درود درود درود
در ضمن تقدم متد ها در کلاسهای والد و فرزند چطوری هست ؟
منظور وقتیه که یه متد رو در هر دو کلاس تعریف کنیم ( الان به ذهنم رسید تست نکردم خودم :دی )
سلام
حق تقدمی ( واژه حق تقدم مناسب نیست ) وجود نداره بلکه متد فرزند جایگزین متد والد در کلاس فرزند میشه . البته در خود کلاس فرزند توسط کلمه کلیدی parent به متدها و پروپرتیهای والد دسترسی داریم .

tux-world
دوشنبه 21 اسفند 1391, 07:45 صبح
سلام. مباحث خوبی مطرح شده چند تا سوال داشتم
۱- تفاوت این دو کد تو چیه؟


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
دوشنبه 21 اسفند 1391, 13:04 عصر
سلام خدمت دوستان عزیز
بد ندیدم در این تاپیک سایت http://net.tutsplus.com رو بهتون معرفی کنم که فوق العاده آموزشهای خوبی برای شی گرایی (و البته سایر موارد) داره
اگه توی این سایت یه سرچ بزنید: oop خیلی آموزش های خوب و مفیدی پیدا می کنید و حتی یک سریش هم ویدیویی هست که مرحله به مرحله بهتون می گه باید چیکار کنید و چه فایلی بسازید.
من خیلی استفاده بردم از این سایت. البته این هم بگم که تمام ویدیوهاش رایکان نیست و یه بخشی از اونها پولی می شه.

Ali0Boy
دوشنبه 12 فروردین 1392, 23:50 عصر
باسلام
خیلی ممنون از آموزش بسیار مفید و آموزندتون.

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

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

moji-php
جمعه 20 اردیبهشت 1392, 23:16 عصر
سلام.آقا دمت گرم همین oop رو ادامه بده به صورت حرفه ای و لطفا چندتا مثال جامع و کاربردی هم بنویسید.ممنون

csvbcscp
جمعه 17 خرداد 1392, 16:03 عصر
کتاب معمای شی گرا در c# (http://veyq.ir/book/id/14004/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%85%D8%B9%D9%85%D8%A7%DB%8C-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-#C#comments) اسم کتابیه که اخیراً توسط معلم خوشنام خانم زهرا بیات نوشته شده،در این کتاب سعی شده با مثال پیش بره ، و به صورت خلاصه و روان به آموزش مفاهیم شی گرا در سی شارپ (http://veyq.ir/book/id/14004/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%85%D8%B9%D9%85%D8%A7%DB%8C-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-#C#comments) پرداخته
من فکر میکنم برای کسانی که دنبال یک راه حل ساده و سریع برای یادگیری OOP در سی شارپ (http://veyq.ir/book/id/14004/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%85%D8%B9%D9%85%D8%A7%DB%8C-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-#C#comments) هستند کتاب خوبی میتونه باشه.

MRmoon
جمعه 17 خرداد 1392, 16:41 عصر
کتاب معمای شی گرا در c# (http://veyq.ir/book/id/14004/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%85%D8%B9%D9%85%D8%A7%DB%8C-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-#C#comments) اسم کتابیه که اخیراً توسط معلم خوشنام خانم زهرا بیات نوشته شده،در این کتاب سعی شده با مثال پیش بره ، و به صورت خلاصه و روان به آموزش مفاهیم شی گرا در سی شارپ (http://veyq.ir/book/id/14004/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%85%D8%B9%D9%85%D8%A7%DB%8C-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-#C#comments) پرداخته
من فکر میکنم برای کسانی که دنبال یک راه حل ساده و سریع برای یادگیری OOP در سی شارپ (http://veyq.ir/book/id/14004/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%85%D8%B9%D9%85%D8%A7%DB%8C-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-#C#comments) هستند کتاب خوبی میتونه باشه.

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

csvbcscp
جمعه 17 خرداد 1392, 18:26 عصر
دوست عزيز اينجا بخش PHP بود بهتر بود اين كتابرو در بخش C شارپ معرفي ميكردي

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

parsboy
دوشنبه 10 تیر 1392, 19:58 عصر
باسلام وتشکر از دوست خوبم hidensoft
مطالب بسیارعالی و ساده هستند خواهشا ادامه بدید این بحثو ممنون.
موفق باشید.

parsboy
سه شنبه 11 تیر 1392, 15:56 عصر
باسلام دوستان هرکس آموزش مفیدی در این موضوع داره واسه بچه ها بزاره ممنون
موفق باشید.

moji-php
جمعه 11 مرداد 1392, 05:14 صبح
سلام
دوستان بی زحمت مثال های کاربردی بزنید و اگه ممکن هس یه پروژه کوچک انجام بدین
ممنون از همتون که برای یادگیریه دیگران تلاش می کنید

ali865
دوشنبه 28 مرداد 1392, 23:43 عصر
سلام
من یسری مطالب در مورد وراثت میخوام مثلا نحوه فراخوانی متدها ی استاتیک و خوصوصیات استاتیک کلاس پدر در کلاس فرزند ممنون میشم راهنماییم کنید

olampiad
پنج شنبه 30 آبان 1392, 14:00 عصر
سلام
به این کد یه نگا بندازدید


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
یک شنبه 06 بهمن 1392, 20:42 عصر
یه مثال برای تابع __destruct() میزنید که من بیشتر متوجه بشم؟

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

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

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

Yashar1989
دوشنبه 07 بهمن 1392, 12:54 عصر
سلام
من تو کد زیر جای یوزر هر چی میزارم پیغام 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
دوشنبه 14 بهمن 1392, 14:53 عصر
سلام
مقداری که بر می گرده رو با تابع var_dump چک کنید ببینید شاید یه آرایه ی خالی برمی گردونه یا یه مقداری بر میگردون همیشه . اونوقت درستش کنید
یا میتونید شرط if رو به این صورت بنویسید

!empty(mysql_connect($server, $user, $pass))

sherlock0111
یک شنبه 03 فروردین 1393, 22:39 عصر
حل شد............

rahahost
شنبه 31 خرداد 1393, 09:32 صبح
با سلام خدمت همه ی دوستان .

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

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

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

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


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

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

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

m.alinejad
سه شنبه 31 تیر 1393, 09:25 صبح
برای آموزش OOP در PHP می تونید از کتاب PHP Object-Oriented Solutions استفاده کنید.
http://ebook-dl.com/item/php_object_oriented_solutions_david_powers (http://ebook-dl.com/item/php_object_oriented_solutions_david_powers/)