Blogger Information
Blog 34
fans 0
comment 0
visits 33677
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
魔术方法 php之 :__get(),__set()
Serendipity-Ling
Original
1013 people have browsed it
<?php
/**
 *魔术方法
 *(1) __get(),__set()
 */
class Car
{
    private $name;
    private $price;
    //构造器
    public function __construct($name,$price)
    {
         $this->name = $name;
         $this->price = $price;
    }

    //如果想在外部访问私有属性,可以创建一个外部访问接口
    public function getName()
    {
        return $this->name;
    }
    public function getPrice()
    {
        return $this->price;
    }
    //创建一个__get()对访问进行自动处理
    public function __get($name)
    {
        //过滤,只有name为Benz的才能访问
        if ($this->name == 'Benz')
        {
           return $this->name;
        }else
        {
            echo '没有权限访问';
        }
    }
    //创建一个__set(),如果在类外部进行属性的赋值操作,会自动调用它
    //__set()有二个参数:属性名与属性值
    public function __set($proName, $Value)
    {
        if ($proName == 'price')
        {
            if ($Value>10000 && $Value<1000000)
            {
                return $this->$proName=$Value;
            }else
            {
                echo '数据非法';
            }
        }
        //对类内的私有属性进行赋值
        return $this->$proName = $Value;
    }
}


//首先用外部访问接口来访问

echo (new Car('bmw','200000'))->getName();
echo '<br>';
echo (new Car('bmw','200000'))->getPrice();
//如果我想直接属性访问呢,见方法二
echo '<hr/>';
$obj1 = new Car('BMW','3000000');
echo $obj1->name;//没有权限访问
echo '<br>';
$obj2 = new Car('Benz','3000000');
echo $obj2->name;//可以访问到
echo '<hr>';
echo '以下是__set演示';
//在外部直接设置私有类的属性
//未添加__set()前
//$obj2->name = 'BMW'; //程序运行到这里出错,我们把他先注释掉,准备采用__set()魔术方法
//echo $obj2->getPrice();
$obj2->name = 'Ben';
$obj2->price='20000';
echo '<hr>';
//因为我没有将price也使用__get()得到,所以使用外部接口方法访问
echo $obj2->getPrice();
echo '<br/>';
echo $obj2->getName();
echo '<br/>';
//这里又没法访问,因为我将私有属性name的值改为Ben了
echo $obj2->name;


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post