Blogger Information
Blog 45
fans 2
comment 1
visits 26361
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
2018 5.2 17:00 面向对象get 与 set
哈的博客
Original
804 people have browsed it

总结:

1.类魔术方法:__get(),__set()实现属性查询器和设置器

实例

<?php
/*
 * 1.类魔术方法:__get(),__set()实现属性查询器和设置器
 * 2.__get($name): 外部通过对象获取对象私有属性或不存在的属性时自动触发
 * 3.__set($name,$value):外部设置私有属性或不存在属性值的时候自动触发
 * 4.魔术方法可以适用于所有存在或不存在的类属性,不需要再为每个属性创建对应的访问接口
 */


class Demo
{
// 声明属性
private $name;
private $sex;
private $age;
private $stature;
private $data=[]
}

//构造方法
public function__construct($name='',$sex='',$age=0,array $stature[])
{
	$this->name=$name;
	$this->sex=$sex;
	$this->age=$age;
	$this->stature=$stature;
}
//魔术方法:查询器
public function__get($name)
{
	// return $this->$name;
	// 加入检测,访问不存在的属性是给出提示信息
	$msg='null';
	if (isset($this->$name)) {
		$msg=$this->$name;
	} else if (isset($this->$data[$name])) {
		$msg=$this->$data[$name];
	}else{
		$msg='非法请求';
	}
	return $msg;
}

//魔术方法:设置器
public function__set($name,$value)
{
	//完善设置器,实现对不存在的属性的创建
	//如果访问的问题已存在的属性,直接输出
	if (isset($this->$name)) {
		$this->$name=$value;//输出属性
	} else{
		//如果属性不存在,创建他并保存到类属性¥data数组中
		$this->data[$name]=$value;
	}
}

<?php

/* 
 * 魔术方法:_get()和__set()
 */

require './class/GirlFriend3.php';

$girlfriend3 = new GirlFriend3('如花妹妹',20,[120,130,150]);

//测试魔术方法__get()
echo '姓名: ',$girlfriend3->name,'<br>';
echo '年龄: ',$girlfriend3->age, '<br>';
echo '三维: ', print_r($girlfriend3->stature,true), '<br>';
//获取一个不存在的属性
echo '爱好:', $girlfriend3->hobby, '<br>';

echo '<hr>';

//测试魔术方法: __set()
$girlfriend3->name = '奶茶妹妹';
$girlfriend3->age = 28;
$girlfriend3->stature = [85,85,88];
echo '姓名: ',$girlfriend3->name,'<br>'; 
echo '年龄: ',$girlfriend3->age, '<br>';
echo '三维: ', print_r($girlfriend3->stature,true), '<br>';
//给一个不存在的属性赋值,类中并无hobby字段
$girlfriend3->hobby = '购物';
//非常诡异的事情发生了,居然可以给一个不存在的字段,赋值,并且还能顺利的获取到,仿佛这个字段真实存在一样
echo '爱好:', $girlfriend3->hobby, '<br>';
//真实的情况是: 给一个不存在的对象属性赋值,的确会自动添加一个新属性到类中,这个特性听上去似乎不太好,但有时却很有用
//因为我们可以事先创建一个类属性,专门用来收集用户自定义所数据,增加类的功能


//使用类属性设置器__set()再创建一个新属性
$girlfriend3->email = 'milk_tea@php.cn';

//直接查看用户自定义的类属性$data数组的内容,此时会输出二个自定义数据
echo '用户自定义属性<pre>'.print_r($girlfriend3->data,true).'</pre>';

运行实例 »

点击 "运行实例" 按钮查看在线实例

实例

<?php
/*
 * 1.类魔术方法:__get(),__set()实现属性查询器和设置器
 * 2.__get($name): 外部通过对象获取对象私有属性或不存在的属性时自动触发
 * 3.__set($name,$value):外部设置私有属性或不存在属性值的时候自动触发
 * 4.魔术方法可以适用于所有存在或不存在的类属性,不需要再为每个属性创建对应的访问接口
 */


class Demo
{
// 声明属性
private $name;
private $sex;
private $age;
private $stature;
private $data=[]
}

//构造方法
public function__construct($name='',$sex='',$age=0,array $stature[])
{
	$this->name=$name;
	$this->sex=$sex;
	$this->age=$age;
	$this->stature=$stature;
}
//魔术方法:查询器
public function__get($name)
{
	// return $this->$name;
	// 加入检测,访问不存在的属性是给出提示信息
	$msg='null';
	if (isset($this->$name)) {
		$msg=$this->$name;
	} else if (isset($this->$data[$name])) {
		$msg=$this->$data[$name];
	}else{
		$msg='非法请求';
	}
	return $msg;
}

//魔术方法:设置器
public function__set($name,$value)
{
	//完善设置器,实现对不存在的属性的创建
	//如果访问的问题已存在的属性,直接输出
	if (isset($this->$name)) {
		$this->$name=$value;//输出属性
	} else{
		//如果属性不存在,创建他并保存到类属性¥data数组中
		$this->data[$name]=$value;
	}
}

<?php

/* 
 * 魔术方法:_get()和__set()
 */

require './class/GirlFriend3.php';

$girlfriend3 = new GirlFriend3('如花妹妹',20,[120,130,150]);

//测试魔术方法__get()
echo '姓名: ',$girlfriend3->name,'<br>';
echo '年龄: ',$girlfriend3->age, '<br>';
echo '三维: ', print_r($girlfriend3->stature,true), '<br>';
//获取一个不存在的属性
echo '爱好:', $girlfriend3->hobby, '<br>';

echo '<hr>';

//测试魔术方法: __set()
$girlfriend3->name = '奶茶妹妹';
$girlfriend3->age = 28;
$girlfriend3->stature = [85,85,88];
echo '姓名: ',$girlfriend3->name,'<br>'; 
echo '年龄: ',$girlfriend3->age, '<br>';
echo '三维: ', print_r($girlfriend3->stature,true), '<br>';
//给一个不存在的属性赋值,类中并无hobby字段
$girlfriend3->hobby = '购物';
//非常诡异的事情发生了,居然可以给一个不存在的字段,赋值,并且还能顺利的获取到,仿佛这个字段真实存在一样
echo '爱好:', $girlfriend3->hobby, '<br>';
//真实的情况是: 给一个不存在的对象属性赋值,的确会自动添加一个新属性到类中,这个特性听上去似乎不太好,但有时却很有用
//因为我们可以事先创建一个类属性,专门用来收集用户自定义所数据,增加类的功能


//使用类属性设置器__set()再创建一个新属性
$girlfriend3->email = 'milk_tea@php.cn';

//直接查看用户自定义的类属性$data数组的内容,此时会输出二个自定义数据
echo '用户自定义属性<pre>'.print_r($girlfriend3->data,true).'</pre>';

运行实例 »

点击 "运行实例" 按钮查看在线实例

2.__get($name): 外部通过对象获取对象私有属性或不存在的属性时自动触发

3.__set($name,$value):外部设置私有属性或不存在属性值的时候自动触发

 4.魔术方法可以适用于所有存在或不存在的类属性,不需要再为每个属性创建对应的访问接口



Correction status:Uncorrected

Teacher's comments:
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