PHP面向对象 – 封装性 (public private protected三者区别)及魔术方法__set() __get() __isset() __unset()

封装性是面向对象编程中的三大特性之一,封装就是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的内部细节,以达到对成员的访问控制(切记不是拒绝访问)。

public private protected三者区别

PHP5支持如下3种访问修饰符:

public (公有的 默认):在类的内部、被继承的子类、外部都可以访问

private (私有的):仅在类的内部访问,不能在被继承的子类及外部访问

protected (受保护的):在类的内部、被继承的子类可以访问,不能在外部访问

示例

<?php 

class person{
	private $name = 'lisi';
	protected $sex = 'man';
	public $age = 20;
	public function say(){
		echo $this->name.'<br>';
		echo $this->sex.'<br>';
		echo $this->age.'<br>';
	}
}
echo $p->name;	//无法获取
echo $p->sex;	//无法获取
echo $p->age;	//可以获取
$p = new person();
$p->say();	//可以全部获取

class stu extends person{
	public function student(){
		echo $this->name.'<br>';
		echo $this->sex.'<br>';
		echo $this->age.'<br>';
	}
}

$ming = new stu();
$ming->student();	//可以获取sex和age,无法获取name

?>

魔术方法

1. __get()魔术方法:在我们尝试访问一个不存在的、私有的或受保护的属性时会被自动调用。它可以接受一个参数,该参数表示访问属性的名字,并且将该属性的值返回。

该魔术方法通常用在创建一个“只读”(在类外部只能可读,但不能修改)的属性来扩展访问控制。如下面的栗子:

//魔术方法 __get 
class person{
	private $name;
	protected $age;
	public function __construct($name = '',$age = 0){
		$this->name = $name;
		$this->age = $age;
	}
	
	public function __get($msname){
		if(isset($this->$msname)){
			return $this->$msname;
		}else{
			return NULL;
		}
	}
	
}

$p = new person('lisi',30);
echo $p->name.'<br>';	//输出 lisi
echo $p->age.'<br>';	//输出 30

2.__set()魔术方法:在我们尝试修改一个不可访问的属性(私有或受保护的)时会被自动调用。它接受两个参数,一个表示属性的名字,另一个表示属性的值。如下面的栗子:

//魔术方法 __set
class person1{
	private $name;
	protected $age;
	public function __construct($name = '',$age = 0){
		$this->name = $name;
		$this->age = $age;
	}	
	public function __set($name,$value){
		$this->$name = $value;
	}	
	public function say(){
		echo '我叫'.$this->name.',今年'.$this->age.'岁<br>';
	}
	
}
$p1 = new person1('lisi',30);
$p1->name = 'zhangsan';
$p1->age = 20;
$p1->say();	//输出 我叫zhangsan,今年20岁

3.__isset()魔术方法:当对一个不可访问的属性调用isset()或empty()函数时会被自动调用,它接受一个参数,表示属性的名字。如下面的栗子:

//魔术方法 __isset()
class person2{
	public $name;
	private $age;
	protected $sex;
	public function __construct($name='',$age=0,$sex='man'){
		$this->name = $name;
		$this->age = $age;
		$this->sex = $sex;
	}
	public function __isset($content){
		echo '外部无法访问此属性,需要调用__isset<br>';
		return isset($this->$content);
	}
	
}

$p2 = new person2('lisi',20,'man');
echo isset($p2->name).'<br>';	//此属性是public 可以直接检测
echo isset($p2->age).'<br>';	//需要调用__isset检测
echo isset($p2->sex).'<br>';	//需要调用__isset检测

4.__unset()魔术方法:在类的外部使用unset()函数销毁一个不可访问的属性时会被自动调用,它接受一个参数,表示属性的名字。如下面的栗子:

//魔术方法 __unset()
class person3{
	public $name;
	private $age;
	protected $sex;
	public function __construct($name='',$age=0,$sex='man'){
		$this->name = $name;
		$this->age = $age;
		$this->sex = $sex;
	}
	public function __unset($content){
		unset($this->$content);
	}
	public function say(){
		echo $this->name.$this->age.$this->sex.'<br>';
	}
	
}

$p3 = new person3('lisi',25,'man');
$p3->say();	//输出结果 lisi25man
unset($p3->age);	//unset私有属性会自动调用__unset方法
$p3->say();	//	输出结果 lisiman

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇