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

hidensoft

Member
پولی مورفیسم واقعا سخته و پردازش هاي مخ آدم رو به بالاترين سطح مي رسونه (بهت حق مي دم)

ببينيد با دستور
PHP:
if ($obj instanceof Animal)
چك مي كنيد كه آيا obj$ عضو يا همان كلاس Animal هست يا نه ؟
مي دونم كه متوجه نشدي .. خط به خط توضيح مي دم .. دقت كن .

كلاس Animal
PHP:
class Animal { 
    function makeSound() 
    { 
        print "Error: This method should be re-implemented in the children"; 
    } 
}
كلاس cat فرزند Animal
PHP:
class Cat extends Animal { 
    function makeSound() 
    { 
        print "miau"; 
    } 
}
كلاس dog فرزند Animal
PHP:
class Dog extends Animal { 
    function makeSound() 
    { 
        print "wuff"; 
    } 
}
تابع printTheRightSound (اعلام خروجي)
PHP:
function printTheRightSound($obj) 
{ 
    if ($obj instanceof Animal)  
    { 
        $obj->makeSound(); 
    }  
    else  
    { 
        print "Error: Passed wrong kind of object"; 
    } 
    print "\n"; 
}
كد اصلي يا بدنه
PHP:
printTheRightSound(new Cat()); 
printTheRightSound(new Dog());
برنامه از قسمت بدنه يا اصلي اجرا مي شه . اين دستور رو اجرا مي كنيم.
PHP:
printTheRightSound(new Cat());
خط اول تابع printTheRightSound اجرا مي شه :
PHP:
if ($obj instanceof Animal)
آيا obj$ فرزند يا خود كلاس Animal هست ؟ جواب : بله
خط بعد :
PHP:
$obj->makeSound();
چون ما شي Cat رو ارجا داديم .. مي ره سراغ تابع MakeSound در كلاس Cat :
PHP:
class Cat extends Animal { 
    function makeSound() 
    { 
        print "miau"; 
    } 
}
رشته miau در خروجي چاپ مي شه .
همين كار ها براي Dog هم انجام مي شه .. اميد وارم كه جوابتون رو گرفته باشيد.
 

justpersian

Member
الان کلا گرفتم چی شد ...
خیلی ممنون .
یک سوال دیگه ، تمپلت انجینی که گذاشتید در واقع یک نوع smarty ساده هست ؟
امیدوارم مشغله های کاری تان زود تر تمام بشه و از آموزش هاتون فیض ببریم :wink:
موفق باشید
 

hidensoft

Member
یک سوال دیگه ، تمپلت انجینی که گذاشتید در واقع یک نوع smarty ساده هست ؟
ُSmarty يك Template Engine هست .. اوني هم كه من گذاشتم يك Template Engine ديگه . Smarty پيشرفتست و اوني كه من گذاشتم پيش نرفته !
امیدوارم مشغله های کاری تان زود تر تمام بشه و از آموزش هاتون فیض ببریم
از اين دعا ها نكنيد تورو خدا .. اون وقت من بيكار مي شم .. :)

شما هم همينطور
 

justpersian

Member
یک سوالی برای من پیش اومد !
این کد رو ببینید :
PHP:
<?php
  $c = 'php class';
    class Myclass
    {
        function printphp()
        {
            echo 'php';
        }
    }
    
    $my_var = new Myclass();
    $my_var->printphp();
?>
ما تو خارج از کلاس یه متغیر تعریف کردیم !
اونو چه طوری بیاریم تو فانکشن یا کلاس ؟
واسه آوردن تو فانکشن نمیشه از همون global استفاده کرد ؟
 

hidensoft

Member
تا اونجا که من می دونم شما نمی تونید بصورت مستقیم توسط کلاس به متغیر های خارج کلاس دسترسی داشته باشید .. شاید اگر گلوبال باشه بتونید .. امتحان کنید
 

hidensoft

Member
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', '[email protected]', 'http://www.localfilipino.com', 'Advertising'),
(2, 'Liberty Realty', '2451 S. Buffalo Drive, Suite 145, Las Vegas, NV 89117', '(702) 248-8899', '[email protected]', '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', '[email protected]', 'http://www.frsphilippines.com', 'Freight, Cargo');
Output

output.jpg
 
آخرین ویرایش:

vizz666

Member
ایولا دمت گرم خیلی دنبال چنین چیزی گشتم در ضمن خیلی دقیق سرچ میکنه (;


موفق باشی رفیق
 

zoghal

Active Member
جناب هيدن سافت. واقعا ممنون از آموزشتون.
منتها يه در خواست داشتم.
امكانش هست با روش oop يك سيستم ارسال / ويرايش / حذف خبر ساده آموزش بديد تا بهتر با ساختار و كارايي اين روش آشنا بشيم.
من يك مقدار مشكل سر تجزيه و تحليلش دارم
ممنون از شما
 

sabasoft

Member
با سلام و درود
از شما براي مطالب مفيدتون ، تشکر مي کنم.

دوستان يک سوال داشتم:

براي اينکه محتويات بين دو مجموعه کاراکتر خاص رو به دست بياريم بايد چيکار کنيم؟

مثلا:

<!--start-->
<p>
test
</p>
<!--end-->

که درخواست ما از اين کد ، <p>test</p> هست.
باز هم تشکر مي کنم
 

hidensoft

Member
امکانش هست ، با رگولار باید اون فرمتت رو کنترل کنی بعدش بیای و بکشی بیرون متن رو ، ولی این سوال مربوط به این قسمت نمی شه .
 

sabasoft

Member
دستت درد نکنه
خوب من یک تاپیک زدم با همین موضوع سوال خودم ، اگر محبت کنید و تواناییش رو دارید ، من رو راهنمایی کنید ؛ خوشحال می شم و براتون دعا می کنم
 

www.nero.ir

Member
سلام دوست عزیز ممنون بابت آموزش هایی که تا الان نوشتی توی یکی از پست ها نوشته بودی که می خوای در باره Mvc هم توضیحاتی بدی اگه میشه یک آموزش هم درباره این موضوع بزار واقعا ممنونت میشم.
 

J4vad

Member
ابتدا تشکر از hidensoft عزیز به دلیل آموزش های جالبشون . امید است این کار رو با قدرت بیشتر ادامه دهند تا دوستان استفاده کنند ! بنده هم حتما در حد توان کمک خواهم نمود ! البته اگر آموزش های شما رو خراب نکنیم ! :wink:

sabasoft دوست من با تابع Explode می توانید یک رشته خاص را در یک خط بررسی کنید .

موفق باشید.
 

hidensoft

Member
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 آشنایی پیدا کنید.

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

yakoza

Well-Known Member
با تشکر از محمد عزیز

یه اصطلاح دیگه که به این نوع برنامه نویسی میگن برنامه نویسی سه لایه یا همون 3tire
که تشکیل شده از

data acsses Layer یا همون لایه کار با دیتابیس

business logic layer یا همون لایه ای که لایه یوزر رو به دیتابیس وصل میکنه
user Interface layer یا همون لایه ای که به کاربر نشون داده میشه که شامل html-css-javascript

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

قربانت ناصر
 

hidensoft

Member
سلام دوستان .
امروز نوبت ساختن یک 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']==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:
<?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;
    }
}
?>
 

پیوست ها

  • 12 کیلوبایت بازدیدها: 71
آخرین ویرایش:

جدیدترین ارسال ها

بالا