php魔术方法汇总之__set(),__get(),__isset (),__unset()

先看看函数地定义

public void __set ( string $name , mixed $value )
public mixed __get ( string $name )
public bool __isset ( string $name )
public void __unset ( string $name )
先上例子:
<?php

class demo{
    function __construct() {
        echo "demo类被实例化了<br/>";
    }

    function __destruct(){

        echo '<br/>demo类被销毁了';

    }
    function __set($name,$value){
        echo '__set设置的变量是'.$name.'值是'.$value.'<br/>';
    }
    function __get($name){
        echo '__get想取得的变量是'.$name.'<br/>';
    }
    function __isset($name){
        echo 'isset被调用,变量名是'.$name.'<br/>';
    }
    function __unset($name){
        echo 'unset被调用,变量名是'.$name.'<br/>';
    }

}

    $demo=new demo();
    $demo->aaa;//调用不存在的属性
    $demo->mmmm='mmmm';//给不存在的属性赋值
    isset($demo->aaa);
    empty($demo->bbbb);
    unset($demo->asdfsd);

各种方法调用的条件如下:
在给不可访问属性赋值时,__set() 会被调用。

读取不可访问属性的值时,__get() 会被调用。

当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

当对不可访问属性调用 unset() 时,__unset() 会被调用。

参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。

属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。

注意:此处说明的不可访问并不是不存在,还有当属性被声明为private时外部无法访问时

    在除 isset() 外的其它语言结构中无法使用重载的属性,这意味着当对一个重载的属性使用 empty() 时,重载魔术方法将不会被调用。
    
    为避开此限制,必须将重载属性赋值到本地变量再使用 empty()。

例如     使用 __get(),__set(),__isset() 和 __unset() 进行属性重载

<?php
class PropertyTest {
     
/**  被重载的数据保存在此  */
    
private $data = array();

 
     
/**  重载不能被用在已经定义的属性  */
    
public $declared 1;

     
/**  只有从类外部访问这个属性时,重载才会发生 */
    
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 via __get(): ' $name .
            
' in ' $trace[0]['file'] .
            
' on line ' $trace[0]['line'],
            
E_USER_NOTICE);
        return 
null;
    }

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

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

    
/**  非魔术方法  */
    
public function getHidden() 
    {
        return 
$this->hidden;
    }
}


echo 
"<pre>\n";

$obj = new PropertyTest;

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

var_dump(isset($obj->a));
unset(
$obj->a);
var_dump(isset($obj->a));
echo 
"\n";

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

echo 
"Let's experiment with the private property named 'hidden':\n";
echo 
"Privates are visible inside the class, so __get() not used...\n";
echo 
$obj->getHidden() . "\n";
echo 
"Privates not visible outside of class, so __get() is used...\n";
echo 
$obj->hidden "\n";
?>
   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值