کلاس‌‌ها و اشیا (PHP 5)
PHP Manual

سربارگذاری

سربارگذاری در PHP امکان "ایجاد" پویای اعضا و متدهاست. این موجودیت‌های پویا با استفاده از متدهای جادویی پردازش می‌گردند و می‌توان از آنها برای ساخت انواع عملیات فراهم نماییم.

متدهای سربارگذاری زمانی فراخوانی می‌گردند که با متدها و اعضای اعلام نشده یا visible در حوزه فعلی ارتباط دارد. باقی این بخش عباراتی مانند "اعضای غیرقابل دسترسی" و "متدهای غیرقابل دسترسی" برای ارجاع به این ترکیب اعلام و نمایش استفاده می‌کنیم.

تمام متدها سربارگذاری شده باید public اعلام شود.

Note:

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

Note:

تفسیر PHP از "سربارگذاری" متفاوت از زبان‌های شی‌گرا است. سربارگذاری بصورت سنتی توانایی استفاده از چندین متد با نام یکسان ولی انواع آرگومان متفاوت است.

Changelog

Version Description
5.1.0 اضافه نمودن __isset() و __unset().
5.3.0 اضافه نمودن __callStatic().

سربارگذاری اعضا

void __set ( string $name , mixed $value )
mixed __get ( string $name )
bool __isset ( string $name )
void __unset ( string $name )

__set() هنگام نوشتن اعضای غیرقابل دسترسی فراخوانی می‌شود.

__get() برای خواندن اطلاعات از اعضای غیرقابل دسترسی است.

__isset() با فراخوانی isset() یا empty() بر اعضای غیرقابل دسترسی فراخوانی می‌گردد.

هنگامی __unset() فراخوانی می‌شود که unset() برای اعضای غیرقابل دسترسی استفاده می‌شود.

آرگومان $name نام عضو مرتبط است.در متد __set() آرگومان $value مقدار عضو $name را معین می‌سازد

سربارگذاری اعضا تنها در متن شی عمل می‌کند. این متدهای جادویی در متن استاتیک فراخوانی نخواهد شد. بنابراین این متدها نمی‌توانند static اعلام شوند.

Note:

مقدار بازگشتی __set() به علت نحوه پردازش عملگر انتصاب در PHP نادیده گرفته خواهد شد. به طور مشابه __get() هنگام استفاده از زنجیره انتصابات مانند زیر فراخوانی نخواهد شد.

 $a = $obj->b = 8; 

Example #1 نمونه سربارگذاری با __get٬ __set٬ __isset و __unset

<?php
class MemberTest {
    
/**  Location for overloaded data.  */
    
private $data = array();

    
/**  Overloading not used on declared members.  */
    
public $declared 1;

    
/**  Overloading not triggered when accessed inside the class.  */
    
private $hidden 2;

    public function 
__set($name$value) {
        echo 
"Setting '$name' to '$value'\n";
        
$this->data[$name] = $value;
    }

    public function 
__get($name) {
        echo 
"Getting '$name'\n";
        if (
array_key_exists($name$this->data)) {
            return 
$this->data[$name];
        }

        
$trace debug_backtrace();
        
trigger_error(
            
'Undefined property: ' $name .
            
' in ' $trace[0]['file'] .
            
' on line ' $trace[0]['line'],
            
E_USER_NOTICE);
        return 
null;
    }

    
/**  As of PHP 5.1.0  */
    
public function __isset($name) {
        echo 
"Is '$name' set?\n";
        return isset(
$this->data[$name]);
    }

    
/**  As of PHP 5.1.0  */
    
public function __unset($name) {
        echo 
"Unsetting '$name'\n";
        unset(
$this->data[$name]);
    }

    
/**  Not a magic method, just here for example.  */
    
public function getHidden() {
        echo 
"'hidden' visible here so __get() not used\n";
        return 
$this->hidden;
    }
}


echo 
"<pre>\n";

$obj = new MemberTest;

$obj->1;
echo 
$obj->"\n";

var_dump(isset($obj->a));
unset(
$obj->a);
var_dump(isset($obj->a));

echo 
$obj->declared "\n";
echo 
$obj->getHidden() . "\n";
echo 
$obj->hidden "\n";
?>

The above example will output:

Setting 'a' to '1'
Getting 'a'
1
Is 'a' set?
bool(true)
Unsetting 'a'
Is 'a' set?
bool(false)
1
'hidden' visible here so __get() not used
2
Getting 'hidden'


Notice:  Undefined property: hidden in <file> on line 64 in <file> on line 28

سربارگذاری متد

mixed __call ( string $name , array $arguments )
mixed __callStatic ( string $name , array $arguments )

__call() هنگام فراخوانی متدهای غیرقابل دسترسی در متن شی وجود می‌آید.

__callStatic() هنگام فراخوانی متدهای غیرقابل دسترسی در متن استاتیک بوجود می‌آيد..

آرگومان $name نام متد فراخوانی شونده است. آرگومان $arguments یک آرایه شماره‌گذاری شده شامل پارامترهای متد $name است.

Example #2 سربارگذاری متدهای نمونه‌گذاری شده __call و ___callStatic

<?php
class MethodTest {
    public function 
__call($name$arguments) {
        
// Note: value of $name is case sensitive.
        
echo "Calling object method '$name' "
             
implode(', '$arguments). "\n";
    }

    
/**  As of PHP 5.3.0  */
    
public static function __callStatic($name$arguments) {
        
// Note: value of $name is case sensitive.
        
echo "Calling static method '$name' "
             
implode(', '$arguments). "\n";
    }
}

$obj = new MethodTest;
$obj->runTest('in object context');

MethodTest::runTest('in static context');  // As of PHP 5.3.0
?>

The above example will output:

Calling object method 'runTest' in object context
Calling static method 'runTest' in static context

کلاس‌‌ها و اشیا (PHP 5)
PHP Manual