جامعه برنامه نویس

برگشت   جامعه برنامه نویس > مباحث مرتبط با توسعه وب > PHP

اطلاعیه

PHP در این بخش میتوانید درباره مطالب مربوط به PHP بحث و گفتگو کنید.


پاسخ
 
ابزار های تاپیک طریقه نمایش
قدیمی یک شنبه 06 آبان 1386, 23:35 عصر   #1
hidensoft
کاربر دائمی
 
آواتار hidensoft
 
تاریخ عضویت: دی 1385
محل زندگی: استان تهران - شهرستان شهریار
پست: 237
تشکرها: 47
197 بار تشکر شده در 59 پست
ارسال پیام به وسیله AIM به hidensoft ارسال پیام از طریق MSN به hidensoft ارسال پیام از طریق Yahoo به hidensoft
آموزش برنامه نویسی 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:: 
می پردازیم ..

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



موفق و پیروز باشید
فایل های ضمیمه
نوع فایل: zip OOP1.zip‏ (261 بایت, 215 دیدار)
hidensoft آفلاین است   پاسخ با نقل قول
قدیمی دوشنبه 07 آبان 1386, 13:05 عصر   #2
Folaani
کاربر دائمی
 
تاریخ عضویت: مهر 1386
پست: 102
تشکرها: 13
68 بار تشکر شده در 31 پست
ارسال پیام از طریق Yahoo به Folaani
ضمن تشکر از مطلب مفیدتون.
اجازه بدید چند مطلب کوچک هم بنده اضافه کنم.
تعریف کلاس فقط یک الگو هست و وقتی با دستور new به یک متغییری نسبتش میدیم، یک نمونه از روی اون کلاس میسازه و در حافظه ذخیره میشه (درحالیکه تعریف کلاس فقط یک الگو هست که میتونه توی حافظه هم نباشه) و اون متغییر با اون کلاس مرتبط میشه.
البته این مفهوم کلی هست و پیاده سازی میتونه خیلی پیچیده تر باشه بنا به بهینه سازی و غیره. مثلا اینکه هر نمونه از کلاس نیاد و کل ساختار و تعریف و تابعها رو بخواد درخودش حمل کنه و بجاش یک رفرنس به الگو داده بشه درموقع نیاز به اجرای تابع و غیره.
بهرحال این تقریبا بدیهی هست که متغییرهای هر نمونه از کلاس (در اصطلاحات فنی شیء گرایی Instance یا نمونه گفته میشه) هرکدوم باید در مکان جداگانهء خودشون ذخیره شده باشن و غیره (همش و غیره شد!!).
فقط خواستم بگم این تفکر که فکر کنیم اون تعریف کلاس چیزی فراتر از یک الگو هست و متغییرهای تعریف شده از اون کلاس چیزی ندارن جز یک مرجع منفرد، چندان درست بنظر نمیرسه.
این رو مقایسه کنید با مفهوم استراکچر که از مدتها قبل از اختراع شیء گرایی، در بسیاری زبانهای برنامه نویسی وجود داشته. در اونجا هم ما یک تعریف داریم که بخودی خود چیزی موجود و قابل دستیابی نیست (احتمالا در کد کامپایل شدهء اجرایی هم اثری ازش باقی نمیمونه)، بلکه بعنوان الگویی برای ساخت و اختصاص حافظه برای متغییرهایی از اون نوع و دسترسی به محتویات اونها مورد استفاده قرار میگیره.
بنظرم تفاوت عمدهء استراکچر با کلاس این هست که استراکچر فقط محتوی دیتا/متغییر هست و هیچ تابعی (در اشیاء متد گفته میشه) نداره.


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

پی اچ پی ۵ قابلیت شیء گرایی رو بصورت خیلی اساسی تر و اصولیتری پیاده کرده و تعدادی قابلیت پیشرفته و مفید بهش اضافه کرده و همچنین استانداردهاش رو اصولی تر کرده؛ بطور مثال همین توابع __construct و __destruct که مربوط به پی اچ پی ۵ هستن و در پی اچ پی ۴ شناسایی نمیشن، اما حداقل درمورد تابع __construct معادلش در پی اچ پی ۴ هم وجود داره که عبارت از تابعی با نام کلاس محتوی آن تابع هست.
Folaani آفلاین است   پاسخ با نقل قول
5 کاربر از Folaani به خاطر این مطلب مفید تشکر کرده اند:
قدیمی چهارشنبه 09 آبان 1386, 17:50 عصر   #3
hidensoft
کاربر دائمی
 
آواتار hidensoft
 
تاریخ عضویت: دی 1385
محل زندگی: استان تهران - شهرستان شهریار
پست: 237
تشکرها: 47
197 بار تشکر شده در 59 پست
ارسال پیام به وسیله AIM به hidensoft ارسال پیام از طریق MSN به hidensoft ارسال پیام از طریق Yahoo به hidensoft
سلام
امروز می خوایم در این موارد باهم صحبت کنیم

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

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

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

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

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

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

اما ::parent

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

با آرزوی موفقیت برای شما
hidensoft آفلاین است   پاسخ با نقل قول
24 کاربر از hidensoft به خاطر این مطلب مفید تشکر کرده اند:
قدیمی شنبه 03 آذر 1386, 10:09 صبح   #4
hidensoft
کاربر دائمی
 
آواتار hidensoft
 
تاریخ عضویت: دی 1385
محل زندگی: استان تهران - شهرستان شهریار
پست: 237
تشکرها: 47
197 بار تشکر شده در 59 پست
ارسال پیام به وسیله AIM به hidensoft ارسال پیام از طریق MSN به hidensoft ارسال پیام از طریق Yahoo به hidensoft
پولی مورفیسم (برنامه نویسی سطح بالا)

سلام
من نمی دونم چرا به برنامه نویسی 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 هم حل شد .
نیاز به توضیح خاصی نیست (اینجور که فکر می کنم). در صورت اینکه سوالی بود همینجا بپرسید (پیام خصوصی نفرستید ).
hidensoft آفلاین است   پاسخ با نقل قول
19 کاربر از hidensoft به خاطر این مطلب مفید تشکر کرده اند:
قدیمی پنج شنبه 08 آذر 1386, 14:10 عصر   #5
hidensoft
کاربر دائمی
 
آواتار hidensoft
 
تاریخ عضویت: دی 1385
محل زندگی: استان تهران - شهرستان شهریار
پست: 237
تشکرها: 47
197 بار تشکر شده در 59 پست
ارسال پیام به وسیله AIM به hidensoft ارسال پیام از طریق MSN به hidensoft ارسال پیام از طریق Yahoo به hidensoft
نقل قول:
مزایای این نوع برنامه نویسی چه چیزی هست؟
این لینک رو مطالعه بفرمایید .. اگر مفهموم نبود بگید براتون توضیح می دم

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

نقل قول:
و اینکه آیا در این بین واقعا تفاوت بسیاری وجود دارد؟
100%
hidensoft آفلاین است   پاسخ با نقل قول
4 کاربر از hidensoft به خاطر این مطلب مفید تشکر کرده اند:
قدیمی یک شنبه 11 آذر 1386, 20:50 عصر   #6
pooyesh
کاربر تازه وارد
 
تاریخ عضویت: آبان 1383
پست: 67
تشکرها: 1
3 بار تشکر شده در یک پست
نحوه تدریس جالب هست
ساده ، روان و کار آمد
من فکر می کنم دوستانی که دائم درباره مزایا سوال می کنند هنوز یک برنام بزرگ رو ننوشتند یا می شه گفت شاید هنوز متوجه نشدن که در صورتی که برنامه بزرگ بشه و قرار باشه یک نفر دیگه توی انجام کار وارد بشه یا انکه قرار باشه گروهی کد نویسی بشه بدون oo امکان نداره یا اینکه خیلی سخته
البته از ابتدا OO نوشتن سخته به عبارتی باعث می شه فرد یادگیرنده کمی کیج بشه و شاید باعث دلسردی از کد نویسی پیدا بشه اون هم PHP که واقعا ساده و زیباست
بخاطر همین توسعه من به دوستان تازه کار اینه که خودشون رو خیلی درگیر OO نکنن ولی یادشون باشه دیر یا زود باید به این سمت برن و اون زمان ، زمانی که فرد خودش متوجه میشه که داره کار سخت می شه

درضمن آموزش رو ادامه بده
ممنون
__________________
[مغزهای بزرگ در مورد ایده ها صحبت می کنند.
مغزهای متوسط در مورد حوادث صحبت می کنند و مغزهای کوچک در مورد مردم
pooyesh آفلاین است   پاسخ با نقل قول
3 کاربر از pooyesh به خاطر این مطلب مفید تشکر کرده اند:
قدیمی پنج شنبه 15 آذر 1386, 11:47 صبح   #7
hidensoft
کاربر دائمی
 
آواتار hidensoft
 
تاریخ عضویت: دی 1385
محل زندگی: استان تهران - شهرستان شهریار
پست: 237
تشکرها: 47
197 بار تشکر شده در 59 پست
ارسال پیام به وسیله AIM به hidensoft ارسال پیام از طریق MSN به hidensoft ارسال پیام از طریق Yahoo به hidensoft
Lightbulb ساخت یک موترو تمپلت با Oop

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

فکر نمی کنم موضوع مبهمی مونده باشه .. موفق باشید.
hidensoft آفلاین است   پاسخ با نقل قول
13 کاربر از hidensoft به خاطر این مطلب مفید تشکر کرده اند:
قدیمی دوشنبه 26 آذر 1386, 21:05 عصر   #8
hidensoft
کاربر دائمی
 
آواتار hidensoft
 
تاریخ عضویت: دی 1385
محل زندگی: استان تهران - شهرستان شهریار
پست: 237
تشکرها: 47
197 بار تشکر شده در 59 پست
ارسال پیام به وسیله AIM به hidensoft ارسال پیام از طریق MSN به hidensoft ارسال پیام از طریق Yahoo به hidensoft
خوشبختانه دوستان زیادی به استفاده از Oop تشویق شدن و دارن روش کار می کنند .
قدم بعدی ساخت یک وبلاگ هست که در ابتدا هیچ امکاناتی نداره ولی در ادامه می خوایم گسترشش بدیم تا دوستان با مفاهیم Mvc .. طراحی دیتا بیس .. منطق کلی Oop .. بیشتر آشنا بشوند .
موفق باشید
hidensoft آفلاین است   پاسخ با نقل قول
قدیمی یک شنبه 14 بهمن 1386, 10:47 صبح   #9
hidensoft
کاربر دائمی
 
آواتار hidensoft
 
تاریخ عضویت: دی 1385
محل زندگی: استان تهران - شهرستان شهریار
پست: 237
تشکرها: 47
197 بار تشکر شده در 59 پست
ارسال پیام به وسیله AIM به hidensoft ارسال پیام از طریق MSN به hidensoft ارسال پیام از طریق Yahoo به hidensoft
ساخت یک موتور جستو جو گر سریع و کارآمد یکی از دق دقه های یک برنامه نویسه ، من حتی قبل از اینکه یک پروژه رو شروع کنم روس سرچ فکر می کنم . .. امروز یک کلاس بسازیم که به سریع ترین وجه ممکن و به بهترین نحوه به ما جواب مورد نظرمون رو بده ، از همه مهم تر اصولی باشه و قابل ارتقاع و سفارشی باشه ..

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
کد:
<form method=post action=process.php>
<table border=1>
<tr>
    <td>Search by name, category or keywords</td>
    <td><input  name=keyword></td>
</tr>
    <td>&nbsp;</td>
    <td><input type=submit value=Submit></td>
</table>
</form>
sql

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

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

output.jpg
hidensoft آفلاین است   پاسخ با نقل قول
8 کاربر از hidensoft به خاطر این مطلب مفید تشکر کرده اند:
قدیمی یک شنبه 14 بهمن 1386, 19:54 عصر   #10
oxygenws
.
 
آواتار oxygenws
 
تاریخ عضویت: دی 1382
محل زندگی: تهران/مشهد
پست: 6,735
تشکرها: 674
2,349 بار تشکر شده در 748 پست
ارسال پیام از طریق Yahoo به oxygenws
به نظرت این پست آخر به OOP ربطی داره؟؟؟؟؟؟؟
__________________
ایمیل من
سایت من

عضویت در جامعه‌ی اهدای عضو

Direct PGP key: http://tinyurl.com/66q5cy
PGP key server: keyserver.ubuntu.com
PGP name to search: omidmottaghi
oxygenws آفلاین است   پاسخ با نقل قول
2 کاربر از oxygenws به خاطر این مطلب مفید تشکر کرده اند:
پاسخ

بوک مارک کردن این تاپیک


کاربرانی که این تاپیک را مشاهده میکنند: 1 (0 کاربران و 1 مهمان)
 
ابزار های تاپیک
طریقه نمایش

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

BB code روشن است
خندانک ها روشن هستند
[IMG] روشن است
HTML خاموش است

پرش



واحد زمان برحسب ساعت لندن +3.5. ساعت هم اکنون 01:17 صبح است.


Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 1389, Jelsoft Enterprises Ltd.
خدمات میزبانی این سایت تحت پوشش شرکت ایران هاست می باشد.