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

justpersian

Member
خوب حالا نوبت متدهاي __set و __get رسيد

با استفاده از متدهاي بالا ميشه به اعضاي كلاس دسترسي داشت و اونها رو خوند و تغيير داد حتي اگر اون عضو كلاس به صورت private تعريف شده باشه كه در حالت عادي نميشه يه همچين كاري كرد و به عضو private يه كلاس خارج از اون كلاس دسترسي پيدا كرد

PHP:
<?php
class test
{
    private $data=array("name"=>"naser","age"=>20);
    
    public function __set($name,$value)
    {
        $this->data[$name]=$value;
    }
    
    public function __get($name)
    {
        if(array_key_exists($name,$this->data))
        {
            return $this->data[$name];
        }
        return false;
    }
}

$test=new test();
echo "my name is ".$test->name." and i'm ".$test->age;
$test->lastname="kholghi";
echo "and my last name is ".$test->lastname;
 
?>
كه خروجيش به ترتيب زيره
کد:
my name is naser and i'm 20and my last name is kholghi
البته كاربردهاي ديگه اي هم داره كه من فقط به يكيش اشاره كردم كه اصل مطلب جا بيوفته

ارادتمند شما
ناصر

با این توابع جادویی میشه به توابع سایر کلاس ها دسترسی پیدا کرد ؟
برای دسترسی هم باید رجیستر بشن دیگه ؟
 

yakoza

Well-Known Member
با این توابع جادویی میشه به توابع سایر کلاس ها دسترسی پیدا کرد ؟

به توابع (متدها) کاری نداره میشه به پروپرتیهای کلاس دسترسی داشت

PHP:
برای دسترسی هم باید رجیستر بشن دیگه ؟
یعنی چی ؟ متوجه نشدم
 

justpersian

Member
من از این روش قبلا تو یکی از کارام استفاده کرده بودم
برای دسترسی به بقیه کلاس ها ، توابع و متغیرهاشون
یه نمونه که الان نوشتم به این صورته :
PHP:
<?php
class base {
    protected $vars = array();
    
    function __set($index, $value){
        $this->vars[$index] = $value;
    }
    
    function __get($index){
        return $this->vars[$index];
    }
}


class test1 {
    private $registry;
    
    function __construct($registry){
        $this->registry = $registry;
    }
    
    function print1(){
        echo 'Test1';
    }
} 


class test2 {
    private $registry;
    
    function __construct($registry){
        $this->registry = $registry;
    }
    
    function print2(){
        echo 'Test2';
    }
}

$base = new base();
$base->test1 = new test1($base);
$base->test2 = new test2($base);
$base->test1->print1();
$base->test2->print2();
?>

البته این خیلی ساده هست
اما وقتی تو MVC بخوایم توسط loader فایل ها رو از view لود کنیم این روش اونجا خیلی به کار میاد و کنترل برنامه رو خیلی بالا می بره
 
آخرین ویرایش:

yakoza

Well-Known Member
اما وقتی تو mvc بخوایم توسط loader فایل ها رو از view لود کنیم این روش اونجا خیلی به کار میاد و کنترل برنامه رو خیلی بالا می بره

دقیقا درسته
اگه بتونم یه آموزش در همین رابطه تو وبلاگم میزارم
 

yakoza

Well-Known Member
اما وقتی تو mvc بخوایم توسط loader فایل ها رو از view لود کنیم این روش اونجا خیلی به کار میاد و کنترل برنامه رو خیلی بالا می بره

دقیقا درسته
اگه بتونم یه آموزش در همین رابطه تو وبلاگم میزارم
 

hidensoft

Member
Magic Methods قسمت اول

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

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

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

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

toString

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

PHP:
<?php

class TestClass
{
    public $foo;

    public function __construct($foo) {
        $this->foo = $foo;
    }

    public function __toString() {
        return $this->foo;
    }
}

$class = new TestClass('Hello');
echo $class;
?>

خروجی
کد:
Hello

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

در نهایت "Hello" برای خرجی فرستاده می شه و چاپ می شه. البته این توضیح رو هم اضافه می کنم که شما نباید حتما از دستور echo استفاده کنید تا این متود اجرا بشه بلکه می تونید به یک متغیر هم ارجاء بدید. به عنوان مثال
PHP:
$myVar =  $class;
در واقع هرگاه در خواست خروجی به سورت مستیقیم از شعی ارجاء داده شده بشه این تابع اجرا می شه.

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

موفق باشید.
 

k2-4u

Well-Known Member
Static در php 5.30

سلام به همه دوستان در php 5.30 که تازه منتشر شده
چند تا امکانات برای method ها و property های Static
اضافه شده (در بهینه سازی بسیار موثر است )

همون طور که میدانید تعریف Static ها به صورت زیر است
PHP:
class ClassName{
	static $StaticProperty='value';
    
    static function StaticMethod(){
    
    }
}

در حالت قبل برای دسترسی به Static ها به صورت زیر عمل می کردیم
PHP:
class ClassName{
	......
    function test(){
    	self::StaticMethod();
        self::StaticProperty;
    }
}

ولی در php 5.30 به صورت زیر است که حتما باید رعایت شود .
PHP:
class ClassName{
	......
    function test(){
    	static::StaticMethod();
        static::StaticProperty;
    }
}
در مثال بالا بجای کلید Self از کلید جدید Static استفاده شده است


یکی دیگر از قابلیت های جدید php 5.30 این است که می توانید
به شکل زیر به یک method/property از نوع static در خارج از کلاس
دسترسی داشته باشید 
PHP:
class ClassName{
	static $Property;

    static function StaticMethod(){
    }
}

ClassName::StaticMethod();
ClassName::Property;
همان طور که می بینید با استفاده از نام کلاس
و اپراتور :: فراخوانی انجام می شود

دوستان این روش ها رو به عنوان جایگزین روش های قبل php برای static ها در نظر بگیرید
یک نکته دیگه که (آقای YPY در مقالات ."نکات اصولی برنامه نویسی.." بهش اشاره کردن "
این است که متد های Static سرعت . بسیار بیشتری دارند
و . اگر در class خود . method ی را تعریف کردید که . با اجزای دیگر کلاس در ارتباط نبود
لازم و ضروری است که به صورت Static تعریف شود

موفق باشید :rose:
 
آخرین ویرایش:

hidensoft

Member
بسیار عالی بود.

من شنیدم توی PHP 5.3 تغییرات زیادی اعمال شده. فکر می کنم جای بحث داره و می شه روش کار کرد. حتی می گن نسخه موجود cakephp روی این ورژن در حال حاضر نصب نمی شه و تغییرات زیادی توی oop داده شده.
 

k2-4u

Well-Known Member
بسیار عالی بود.

من شنیدم توی PHP 5.3 تغییرات زیادی اعمال شده. فکر می کنم جای بحث داره و می شه روش کار کرد. حتی می گن و تغییرات زیادی توی oop داده شده.

آره . خیلی امکانات بهش اضافه شده
اینجا یکم در موردش نوشتم
http://forum.majidonline.com/showthread.php?t=124959

نسخه موجود cakephp روی این ورژن در حال حاضر نصب نمی شه
خیلی از سیستم ها . هماهنگی نداشتن و به خاطر php 5.30
update کردن .
برنامه های هم مثل zend studio
به دلیل اینکه چندین تا syntax و operator مهم( مثل namespace )اضافه شده .
version جدید بیرون دادن . (که دیگه از بحث خارجه )
 

RainDigital

Member

با عضویت در خبرنامه www.phpclasses.com کلاس های خوبی رو برای استفاده یا به عنوان نمونه برای آموزش می‌تونید پیدا کنید.

کلمه static در کلاس ها چه معنی ای داره؟
توی سی شارپ هم دیدم ولی درموردش تحقیق نکردم.
بعضی تابعا باید می‌داشتن بعضی ها نباید بعضی هم بی تفاوت...
من متوجه نشدم

راستی:
کد:
[RIGHT]
ارجاع
متد
آرگومان
مرتبط
شیء
به صورت مستقیم

و...[/RIGHT]
:there:
 

raha2101

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

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



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


دانلود رایگان مقالات علمی با موضوعات کاربردی و جالب در زمینه برنامه نویسی php
 

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

بالا