IranPHP Forum  

بازگشت   IranPHP Forum > راهنمایی > مهارت در کدنویسی
ثبت نام راهنما فهرست کاربران تقویم جستجو ارسالهاي امروز نشانه گذاري انجمن ها به عنوان خوانده شده

اطلاع رسانی

پاسخ
 
ابزارهای موضوع نحوه نمایش
  #1  
قدیمی 08-25-2009, 08:08 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض آموزش برنامه نویسی oop

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

کد PHP:
<?php
    
class Myclass
    
{
        function 
printphp()
        {
            echo 
'php';
        }
    }
?>
حالا این کد رو اجرا می کنیم . ولی خروجی در صفحه مشاهده نمی کنیم ! چرا ؟
برای اینکه ما باید این شی را در برنامه به یک متغیر نسبت بدهیم . بدین صورت :

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

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

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

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

کد PHP:
<?php
    
class Myclass
    
{
        public 
$myname;
        
        function 
printphp()
        {
            echo 
'php';
        }
    }
    
    
$my_var = new Myclass();
    
$my_var->printphp();
?>
تابع ()printphp رو به نام ()print_my_name تغییر نام می دهیم :

کد PHP:
<?php
    
class Myclass
    
{
        public 
$myname;
        
        function 
print_my_name()
        {
            echo 
'php';
        }
    }
    
    
$my_var = new Myclass();
    
$my_var->print_my_name();
?>
یک تابع جدید با نام ()set_my_name بوجود می آوریم :

کد PHP:
<?php
    
class Myclass
    
{
        public 
$myname;
        
        function 
print_my_name()
        {
            echo 
'php';
        }
        
        function 
set_my_name()
        {
            
        }
    }
    
    
$my_var = new Myclass();
    
$my_var->print_my_name();
?>
خب حالا یه سوال پیش میاد که ما به متغیر هایی که درون کلاس تعریف می کنیم به چه صورت دسترسی پیدا می کنیم ؟
جواب خیلی سادست .. همون طور که نام تابع رو صدا زدیم می تونیم بجای نام تابع نام متغیر رو بنویسیم و به متغیر درون کلاس دسترسی داشته باشیم.

کد PHP:
    $my_var->myname "ALI"// می توانید به متغیر بدهید
    
    
$x $my_var->myname// می توانید مقدار متغیر را درون متغیر دیگری بریزید 
ما تاحالا از بیرون کلاس به متغیر ها و توابع دسترسی داشتیم .. اما راهی برای دسترسی از درون کلاس به اشیاء کلاس هست ؟
بله .. توسط متغیر this$ می توانید به متغیر ها درون یک شی دسترسی داشته باشید و به آنها مقدار بدهید یا مقدار آنها را درون متغیر دیگری قرار دهید یا مقدار آن را مورد مقایسه قرار دهید.
توی یک مثال ساده توسط this$ به متغیر myname$ مقداری می دهیم :

کد PHP:
<?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 را ارجا دادیم.
کد PHP:
function set_my_name()
        {
            
$this->myname 'Ali';        
        } 
حالا تابع ()print_my_name را با کمک this$ طوری تغییر می دهیم که متغیر myname$ را چاپ کند :

کد PHP:
<?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:
<?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 یک تغییر کوچک می دهیم :

کد PHP:
function set_my_name($name)
        {
            
$this->myname $name;        
        } 
فکر می کنم فهمیدید چیکار کردم ! با تغییرات انجام شده تابع ()set_my_name یک آرگمان اجباری از شما میخواهد و مقدار همون آرگمان رو در خروجی چاپ می کنه پس حالا باید دستور اجرا ی تابع ()set_my_name رو تغییر بدهیم تا رشته ای که به عنوان آرگمان می گیرد را چاپ کند.

کد PHP:
$my_var->set_my_name('Ali'); 
این هم اسکریپت نهایی :

کد PHP:
<?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();
?>
فایل پیوست شده هم همین اسکریپت هست .

انشا الله اگر این جلسه مورد استقبال دوستان قرار گرفت در جلسه دوم به بحث در مورد :
کد PHP:
__construct()
__destruct()
self::
parent:: 
می پردازیم ..

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



موفق و پیروز باشید
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
  #2  
قدیمی 08-25-2009, 08:09 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض آموزش برنامه نویسی oop جلسه دوم

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

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

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

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

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

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

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

کد PHP:
<?php
class Myclass {
   function 
__construct($name) {
       print 
$name;
   }
}
$obj = new Myclass('Ali');
?>
و خروجی :
کد PHP:
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:
<?php
class Myclass {
   function 
Myclass($name) {
       print 
$name;
   }
}
$obj = new Myclass('Ali');
?>
باز هم خروجی Ali خواهد بود.
(این قابلیت در php 5 هم support می شود)

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

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

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

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

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

اما :arent

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

کد PHP:
<?php
class {
    function 
example() {
        echo 
" I am parent";
    }
}

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

$b = new B;

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

با آرزوی موفقیت برای شما
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
  #3  
قدیمی 08-25-2009, 08:10 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض پولی مورفیسم (برنامه نویسی سطح بالا)

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

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

پولی مورفیسم

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

کد PHP:
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 به برنامه اضافه می کنیم. به این کد با دقت نگاه کنید :

کد PHP:
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 هم حل شد .
نیاز به توضیح خاصی نیست (اینجور که فکر می کنم). در صورت اینکه سوالی بود همینجا بپرسید (پیام خصوصی نفرستید :wink.
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
  #4  
قدیمی 08-25-2009, 08:11 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض ساخت یک موترو تمپلت با Oop

سلام
دوستانی که بحث رو دنبال کردند دیگه حالا آمدگی پروژه های خیلی بزرگ تر رو دارند.
با یک تمپلت انجین کار رو شروع می کنیم.
زنگ تفریح
این موتور تمپلت خیلی سادست پس زیاد خوشحال نشید و فردا برید یه smrty برا خودتون بسازید و پس فردا هم یک PHP جدید :wink:
ابتدا به کد مربوط به فایل کلاس اصلی نگاه کنید.
کد 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:
<?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

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

<
body>

<
p>{content}</p>

</
body>
</
html
عملکرد کلاس

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

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

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

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

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

فکر نمی کنم موضوع مبهمی مونده باشه .. موفق باشید.
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
  #5  
قدیمی 08-25-2009, 08:16 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض Search Engine

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

class.search.php

کد 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:
<?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

کد HTML:
<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

فایل پیوست 17848
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
  #6  
قدیمی 08-25-2009, 08:20 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض MVC Pattern Step 1

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

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

MVC چیست ؟

Model View Control

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



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

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

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

موفق و پیروز باشید.
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
  #7  
قدیمی 08-25-2009, 08:21 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض MVC Pattern Step 2

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

index.php
کد 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:
<?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']==) {
                
$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!=&& $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:
<?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:
<?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:
<?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;
    }
}
?>
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
  #8  
قدیمی 08-25-2009, 08:22 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض Strategy Pattern یا input Validator

بی شک یکی از مشکلات برنامه نویسان Valid کردن اطلاعات ورودی هست . معمولا هم ما با استفاده از IF ... ELSE کار خودمونو راه می ندازیم. اما بهتره از Strategy Pattern استفاده بشه . بی شک به شما خیلی بیشتر کمک می کنه . برنامه هم خانایی بیشتری پیدا می کنه .
بهتره بریم سر اصل مطلب .

validator.php

کد 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) < ) {
            
$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) < ) {
            
$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:
<?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
}
?>
فکر نمی کنم نیاز به توضیح خاصی باشه .
موفق باشید.
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
  #9  
قدیمی 08-25-2009, 08:26 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض با Propel یک قدم به OOP نزدیک شوید


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

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

شما در Propel دیگه نیازی ندارید که برای ساخت database به phpmyadmin یا هر ابزار دیگه ای وصل بشید.
اطلاعات دیتا بیس بصورت کد XML ذخیره می شن و پروپل خودش دیتابیس رو می سازه
برای مثال
کد HTML:
<database name="bookstore" defaultIdMethod="native">
  <table name="book">
    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
    <column name="title" type="varchar" size="255" required="true" />
  </table>
  <table name="author">
    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
    <column name="first_name" type="varchar" size="128" required="true"/>
    <column name="last_name" type="varchar" size="128" required="true"/>
  </table>
</database>
سپس کافیه تا دستور زیر رو در command prompt اجرا کنید

کد:
> propel-gen /path/to/bookstore
حالا دیتابیس ساخته شده و پروپل از هر تیبل یک شی می سازه به عنوان مثال برای جدول book دو فایل ایجاد می کنه :
کد:
bookstore/Book.php
bookstore/BookPeer.php
فایل اول کلاس book هست که به BookPeer ارجاء داده شده . BookPeer تمام کلاسی هست که پروپل می سازه و Book برای این ایجاد می شه که شما اگر نیازی داشتید که فانکشنی اضافه کنید اینجا اضافه کنید.

حالا نوبت به این می رسه که دستورات Create, Retrieve, Update, Delete رو اجرا کنیم

جدول author رو در نظر بگیرید. برای Create کافیه که
کد PHP:
$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

کد PHP:
$firstBook BookPeer::retrieveByPK(1);
// now $firstBook is a Book object, or NULL if no match was found. 
حالا اگه شما چند Primary Key داشته باشید
کد PHP:
$selectedBooks BookPeer::retrieveByPKs(array(1,2,3,4,5,6,7)); 
برای Update

کد PHP:
// 1) Fetch an object by primary key

$myBook BookPeer::retrieveByPK(1);

// 2) update the values & save() it.

$myBook ->setTitle("War & Peace");
$myBook->save(); 
برای DELETE
کد PHP:
$book BookPeer::retrieveByPK(1);
BookPeer::doDelete($book); 
خب حتما پیش خودتون می گید من چطوری کوئری دلخواه خودمو بزنم ؟ راهشش Criteriaهست.
به عنوان مثال
کد PHP:
$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:
<?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($sqlResultSet::FETCHMODE_NUM);  

$books BookPeer::populateObjects($rs);
همونطور که می بینید تمامی امکانات مورد نیاز برای زدن کوئری در اختیار شما هست.

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

موفق و پیروز باشید
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
  #10  
قدیمی 08-25-2009, 08:27 AM
ralf ralf آنلاین نیست.
Member
 
تاریخ عضویت: Oct 2006
محل سکونت: Iran-Tehran-Shahriar
نوشته ها: 42
ralf به AIM ارسال پیام ralf به Yahoo ارسال پیام
پیش فرض Magic Methods قسمت اول

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

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

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

کلیه متود های جادویی PHP اینها هستن.
کد PHP:
__construct
 __destruct
 __call
 __callStatic
 __get
__set
 __isset
 __unset
 __sleep
 __wakeup
 __toString
 __invoke
 __set_state
 __clone 
در ابتدا خودم construct و destruct رو بطور کامل توضیح دادم. توی تاپیک ها دیدم دوستان زحمت get و set رو هم کشیدن که بازم ازشون تشکر می کنم. حالا شروع می کنم به توضیح دادن یکی این متود های جادویی

toString

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

کد PHP:
<?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
توضیحات خطی
کد PHP:
class TestClass 
کلاسی با نام TestClass شاخته می شه
کد PHP:
  public $foo
متغیر foo$ بصورت public تعریف می شه. ** قبلا دوستان در مورد public و private و ... توضیحات لازم رو دادن.
کد PHP:
  public function __construct($foo) {
        
$this->foo $foo;
    } 
همونطور که گفته شد متود سازنده (construct) بعد از ارجاء متغیر به کلاس به صورت خود کار اجرا می شه و تمامی آرگمانهای این متود رو شما هنگام ساخت باید به کلاس بدید.
متغیر foo$ رو مساوی با مقدار آرگمان foo$ این تابع قرار می ده. سعی کنید هم نام بودن توابع شما رو گول نزنه. توجه کنید که متغیر های داخل توابع اگر که هم نام با متغیر های کلاس باشند به هیج وجه با هم مرتبت نیستند.
کد PHP:
public function __toString() {
        return 
$this->foo;
    } 
اینجا با متود جادویی toString تعریف می کنیم که در صورت که خروجی متنی درخواست بشه محتوای foo$ این کلاس به خروجی بره.
کد PHP:
$class = new TestClass('Hello'); 
شعی class$ به کلاس TestClass ارجاء داده می شه و آرگمان اول هم رشته "Hello" مقدار دهی میشه.
کد PHP:
echo $class
به خط بالا دقت کنید. از شعی class$ در خوست خروجی متنی می شه. در واقع PHP با رسیدن به این دستور تابع toString کلاس رو فراخوانی می کنه.
کد PHP:
echo $class->__toString(); 
در نهایت "Hello" برای خرجی فرستاده می شه و چاپ می شه. البته این توضیح رو هم اضافه می کنم که شما نباید حتما از دستور echo استفاده کنید تا این متود اجرا بشه بلکه می تونید به یک متغیر هم ارجاء بدید. به عنوان مثال
کد PHP:
$myVar =  $class
در واقع هرگاه در خواست خروجی به سورت مستیقیم از شعی ارجاء داده شده بشه این تابع اجرا می شه.

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

موفق باشید.
__________________
یاد دوستان قدیم بخیر .. قبلا با اینکه ایران پی اچ پی جوملا خالی بود اما حال هوایی داشت ..
امیر محمد سعید ، حمید رضا ، لین میس ، وحید ، و خیلیای دیگه ...
وبلاگ من : www.hidensoft.blogspot.ir
ای میل من : hidensoft [! @ !] gmail [! noghte !] com
پاسخ با نقل قول
پاسخ

« موضوع قبلی | موضوع بعدی »
ابزارهای موضوع
نحوه نمایش

مجوز های ارسال و ویرایش
شما نمیتوانید موضوع جدیدی ارسال کنید
شما امکان ارسال پاسخ را ندارید
شما نمیتوانید فایل پیوست در پست خود ضمیمه کنید
شما نمیتوانید پست های خود را ویرایش کنید

BB code هست فعال
شکلک ها فعال است
کد [IMG] فعال است
کد HTML غیر فعال است

انتخاب سریع یک انجمن


اکنون ساعت 09:42 PM برپایه ساعت جهانی (GMT - گرینویچ) می باشد.


Powered by vBulletin Version 3.8.1
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.

Free Persian Language By Persian Forum Ver 3.0