<?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;