صفحه 1 از 5 123 ... آخرآخر
نمایش نتایج 1 تا 40 از 165

نام تاپیک: آموزش برنامه نویسی OOP

  1. #1

    آموزش برنامه نویسی OOP

    سلام
    از عنوان انتخاب شده معلوم هست که در مورد چی هست ولی من واسه اون دسته از کسانی که به تازگی وارد برنامه نویسی شند توضیح می دم :
    برنامه نویسی شی گرا (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::

    می پردازیم ..

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



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

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


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

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

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

    __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 کلاس مادر رو صدا زدیم .
    فکر نمی کنم مطلبی مونده باشه ..

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

  4. #4

    پولی مورفیسم (برنامه نویسی سطح بالا)

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

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

    پولی مورفیسم

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

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


    /*
    خروجی :

    miau
    wuff
    */


    جالب بود نه ؟

    عملکرد برنامه :

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

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

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

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

    /*
    خروجی :

    miau
    wuff
    */

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

  5. #5
    مزایای این نوع برنامه نویسی چه چیزی هست؟
    این لینک رو مطالعه بفرمایید .. اگر مفهموم نبود بگید براتون توضیح می دم

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

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

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

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

  7. #7

    Lightbulb ساخت یک موترو تمپلت با Oop

    سلام
    دوستانی که بحث رو دنبال کردند دیگه حالا آمدگی پروژه های خیلی بزرگ تر رو دارند.
    با یک تمپلت انجین کار رو شروع می کنیم.
    زنگ تفریح
    این موتور تمپلت خیلی سادست پس زیاد خوشحال نشید و فردا برید یه smrty برا خودتون بسازید و پس فردا هم یک PHP جدید
    ابتدا به کد مربوط به فایل کلاس اصلی نگاه کنید.
    <?php
    class template
    {
    var $tpl_vars;

    function template()
    {
    $this->tpl_vars = array();
    }

    function assign($var_array)
    {

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

    function parse($tpl_file)
    {

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

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

    function display($tpl_file)
    {
    echo $this->parse($tpl_file);
    }
    }
    ?>

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

    <?php

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

    ?>


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

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

    <body>

    <p>{content}</p>

    </body>
    </html>


    عملکرد کلاس

    3 تا تابع اصلی داره این کلاس
    function assign($var_array)

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

    function parse($tpl_file)

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

    function display($tpl_file)

    این تابع هم وظیفه نمایش اطلاعات رو به عهده داره.

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

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

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

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

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

    class.search.php

    <?php

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

    <?php

    require_once 'class.search.php';

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

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

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

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

    ?>
    form.php

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

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

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

    Output

    output.jpg

  10. #10
    . آواتار oxygenws
    تاریخ عضویت
    دی 1382
    محل زندگی
    تهران/مشهد
    پست
    6,333
    به نظرت این پست آخر به OOP ربطی داره؟؟؟؟؟؟؟
    ایمیل من
    سایت من

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

    Direct PGP key: http://tinyurl.com/66q5cy
    PGP key server: keyserver.ubuntu.com
    PGP name to search: omidmottaghi

  11. #11
    کاربر دائمی آواتار zamanphp
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    اصفهان
    پست
    123
    محمد عزیز
    بهتره این بحث های تکراری رو بزاری کنار و درباره الگوهای طراحی مطلب بزاری تا ملت حال کنند
    نظیر :
    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

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

  13. #13

    نقل قول: آموزش برنامه نویسی OOP

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

  14. #14

    نقل قول: آموزش برنامه نویسی OOP

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

  15. #15
    کاربر دائمی آواتار majoran
    تاریخ عضویت
    آبان 1385
    محل زندگی
    شیراز
    پست
    339

    نقل قول: آموزش برنامه نویسی OOP

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

  16. #16

    نقل قول: آموزش برنامه نویسی OOP

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

  17. #17

    نقل قول: آموزش برنامه نویسی OOP

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

  18. #18

    نقل قول: آموزش برنامه نویسی OOP

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

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

  19. #19

    نقل قول: آموزش برنامه نویسی OOP

    سلام دوستان .
    امروز نوبت ساختن یک 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;
    }
    }
    ?>
    فایل های ضمیمه فایل های ضمیمه
    • نوع فایل: zip mvc.zip‏ (12.0 کیلوبایت, 525 دیدار)

  20. #20
    کاربر دائمی آواتار tabib_m
    تاریخ عضویت
    تیر 1384
    محل زندگی
    ایران - قم
    پست
    1,268

    نقل قول: آموزش برنامه نویسی OOP

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

    ProductView::ProductView($model); 

    میشه توضیح بدی که این خط چه کاری میکنه؟
    باز هم ممنون

    موفق باشید.

  21. #21

    نقل قول: آموزش برنامه نویسی OOP

    ProductView::ProductView($model); 

    یا
    parent::ProductView($model); 

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


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

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

  22. #22
    کاربر دائمی آواتار musiox
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    پشت کامپیوتر
    پست
    269

    نقل قول: آموزش برنامه نویسی OOP


    ProductView::ProductView($model);

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

  23. #23
    مدیر بخش آواتار aryaei2000
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    جزیره بی آفتاب
    پست
    633

    نقل قول: آموزش برنامه نویسی OOP

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

  24. #24
    مدیر بخش آواتار aryaei2000
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    جزیره بی آفتاب
    پست
    633

    نقل قول: آموزش برنامه نویسی OOP

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

  25. #25
    مدیر بخش آواتار aryaei2000
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    جزیره بی آفتاب
    پست
    633

    نقل قول: آموزش برنامه نویسی OOP

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

  26. #26
    مدیر بخش آواتار aryaei2000
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    جزیره بی آفتاب
    پست
    633

    نقل قول: آموزش برنامه نویسی OOP

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

  27. #27

    نقل قول: آموزش برنامه نویسی OOP

    بی شک یکی از مشکلات برنامه نویسان 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
    }
    ?>

    فکر نمی کنم نیاز به توضیح خاصی باشه .
    موفق باشید.
    فایل های ضمیمه فایل های ضمیمه

  28. #28

    نقل قول: آموزش برنامه نویسی OOP

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

  29. #29

    نقل قول: آموزش برنامه نویسی OOP

    سلام
    امید وارم که آموزش های قبلی به شما کمک کرده باشه که در برنامه نویسی 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' ");


    ?>


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

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

  30. #30

    نقل قول: آموزش برنامه نویسی OOP

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

  31. #31

    نقل قول: آموزش برنامه نویسی OOP

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

  32. #32

    نقل قول: آموزش برنامه نویسی OOP

    نقل قول نوشته شده توسط hidensoft مشاهده تاپیک
    شما گسترشش بدید . اصلاحش کنید .
    من لزومی برای اصتفاده از از protect , public ندیدم . اگه فکر می کنید لازمه اضافه کنید . ممنون می شم که به دیگر برنامه نویسان هم کمک کنید.
    قربان تو اگر وقت کنم حتما (ولی روی اینکه وقتم باز میشه اصلا حساب باز نکن)
    به خاطر مطالب مفیدت واقعا ممنون. (واقعا خوندنش رو به هر کسی که می خواد شی گرایی رو یاد بگیره توصیه می کنم)

  33. #33

    نقل قول: آموزش برنامه نویسی OOP

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

  34. #34

    نقل قول: آموزش برنامه نویسی OOP

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

    با تشکر


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  35. #35
    کاربر دائمی آواتار musiox
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    پشت کامپیوتر
    پست
    269

    نقل قول: آموزش برنامه نویسی OOP

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

  36. #36

    نقل قول: آموزش برنامه نویسی OOP

    من لزومی برای اصتفاده از از protect , public ندیدم
    اشتباه نکن البته یکی رو جا گزاشتی private

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

  37. #37
    کاربر دائمی آواتار musiox
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    پشت کامپیوتر
    پست
    269

    نقل قول: آموزش برنامه نویسی OOP

    تا امنیت کدت بالاتر بره
    چطور؟میشه بیشتر توضیح بدی؟

  38. #38

    نقل قول: آموزش برنامه نویسی OOP

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

  39. #39

    نقل قول: آموزش برنامه نویسی OOP

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

  40. #40

    نقل قول: آموزش برنامه نویسی OOP

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

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

صفحه 1 از 5 123 ... آخرآخر

قوانین ایجاد تاپیک در تالار

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