PHP学习——22 PHP面向对象(对象的封装private与__get,__set,__isset,__unset)

<?php 
// 对象的封装(访问控制),主要时指对象属性的封转,通过private访问控制符
class Stuff
{

	private $name; // 姓名
	private $age;  // 年龄
	private $salary; // 薪水
	// 1.构造方法使用固定的方法名:__construct()
	public function __construct($name,$age,$salary){
		// 构造方法:通常用来初始化对象中的属性
		$this->name = $name;
		$this->age = $age;
		$this->salary = $salary;
	}
	// 2.析构方法:对象销毁时自动调用,没有参数,__destruct()
	public function __destruct(){
		echo '当前变量被销毁了~';
	}

	public function getName(){
		return $this->name;
	}
	public function getAge(){
		return $this->age;
	}
	public function getSalary(){
		return $this->salary;
	}
	public function setName($value){
		$this->name = $value;
	}
	public function setAge($value){
		$this->age = $value;
	}
	public function setSalary($value){
		$this->salary = $value;
	}
}
// 创建一个对象访问类中的属性
$stuffB = new Stuff('Tom',24,5000);
echo '<pre>';
print_r($stuffB);
echo '</pre>';
// Stuff Object
// (
//     [name:Stuff:private] => Tom
//     [age:Stuff:private] => 24
//     [salary:Stuff:private] => 5000
// )
// echo $stuffB->name;
// Cannot access private property Stuff::$name
// 不能访问私有的属性

echo $stuffB->getName().'<br>'; 		// Tom
echo $stuffB->getAge().'<br>';  		// 24
echo $stuffB->getSalary().'<br>'; 	// 5000
echo '<hr>';
$stuffB->setName('Peter');
echo $stuffB->getName().'<br>'; 		// Peter
$stuffB->setAge(20);
echo $stuffB->getAge().'<br>';  		// 20
$stuffB->setSalary(3000);
echo $stuffB->getSalary().'<br>'; 	// 3000
// 以上set和get属性的方法实在繁琐,php提供了两个魔术方法以供快速获取私有属性:__set()和__get()
// __get(属性名):外部访问不存在或私有属性时自动调用
// __set(属性名,属性值):外部给类中不存在或不可见属性赋值时自动调用
// __isset():外部检测某私有属性是否存在时,自动调用
// __unset():在类外部销毁某个私有属性时自动调用它
class Employee
{

	private $name; // 姓名
	private $age;  // 年龄
	private $salary; // 薪水
	// 1.构造方法使用固定的方法名:__construct()
	public function __construct($name,$age,$salary){
		// 构造方法:通常用来初始化对象中的属性
		$this->name = $name;
		$this->age = $age;
		$this->salary = $salary;
	}
	// 2.析构方法:对象销毁时自动调用,没有参数,__destruct()
	public function __destruct(){
		echo '当前变量被销毁了~';
	}
	public function __get($name){
		return $this->$name;
	}
	public function __set($name,$value){
		if($name=='age') return false;
		$this->$name = $value;
	}
	public function __isset($name){
		return isset($this->$name);
	}
	public function __unset($name){
		unset($this->$name);
	}
}
$employee = new Employee('Tom',24,5000);
$employee->name = 'Peter';
echo $employee->name.'<br>';   // Peter
$employee->age = 22;
echo $employee->age.'<br>';    // 24
$employee->salary = 10000;
echo $employee->salary.'<br>'; // 10000

echo (isset($employee->name)?"存在":"不存在").'<br>';

unset($employee->name);
echo '<pre>';
print_r($employee);
echo '</pre>';
// Employee Object
// (
//     [age:Employee:private] => 24
//     [salary:Employee:private] => 10000
// )
?>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章