博客列表 >0903- 类的实例化与属性重载

0903- 类的实例化与属性重载

3期-Shawn的博客
3期-Shawn的博客原创
2018年09月04日 19:07:38745浏览

编程1: 类声明与类的实例化

0903zuoye1.png

实例

<?php
//类的声明与实例化
//类声明用class;类的实例化用new;类的对象成员访问符用->


//声明类
class Demo1
{

}
//类的实例化
$demo1 = new Demo1();
//给当前对象添加属性
$demo1->name = '王先生';
$demo1->sex = '男';
//给当前对象添加方法
$demo1->hello = function()
{
	return '我是一个自定义的类方法';
};


//使用对象访问符访问对象中的成员(属性和方法)

//访问属性
echo $demo1->name,'<br>','性别:',$demo1->sex,'<br>';
//访问方法
//echo $demo1->hello();错误的调用方式,因为当前对象方法不是一个普通函数,而是一个对象方法
echo call_user_func($demo1->hello);//call_user_func();把第一个参数作为回调函数调用

运行实例 »

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

编程2: 类常量与类属性的重载

0903zuoye2.png

实例

<?php
//类常量与类属性的重载

//1.类常量可以用来创建对象之间的共享数据
//2.对象初始化:用构造方法实现。创建对象之前会自动调用,完成对象的一些初始化工作。
//  例如:对象属性初始化,创建对象时自动调用的方法等,方法名称固定为:__construct()
//3.属性重载:在类的外部访问不存在或者无权限访问属性时,会自动触发此类方法
//  属性重载涉及四个方法:__get();__set();__isset();__unset();

class Demo2
{
	//类常量:所以对象共享,用类名+范围解析符::访问,且默认为公共属性public
	const SITE_NAME = 'PHP中文网';

	//声明私有属性
	private $name;
	private $course;
	private $grade;

	//构造方法
	public function __construct($name,$course,$grade)
	{
		$this->name = $name;
		$this->course = $course;
		$this->grade = $grade;
		//构造方法不仅可以初始化对象属性,还可以调用方法。
		echo $this->show();
	}

	//输出属性内容
	public function show()
	{
		return $this->name.'的《'.$this->course.'》课程成绩是:'.$this->grade.'分';
	}

	//获取属性重载__get
	public function __get($name)
	{
		if ($name == 'grade') 
		{
			return $name.'不允许查看';
		}return $this->$name;
	}

	//更新属性重载__set
	public function __set($name,$value)
	{
		if ($name == 'grade') 
		{
			echo $name.'不允许修改';
		} 
		$this->$name = $value;
	}

	//属性检测的重载__isset
	public function __isset($name)
	{
		if ($name == 'grade')
		{
			return false;
		}return isset($this->$name);
	}

	//销毁属性重载
	public function __unset($name)
	{
		if ($name == 'grade' || $name == 'name') 
		{
			return false;
		}unset($this->$name);
	}

}
//访问类常量:类常量可以被该类的所有对象所共享,所以不属于任何一个对象,应该使用类来访问
echo '站点名称:',Demo2::SITE_NAME,'<br>	';

//实例化Demo2创建对象
$demo2 = new Demo2('王先生','PHP',88);
echo '<br>';
var_dump($demo2);
echo '<br>';

//访问属性,因为属性全部被封装,所以必须通过一个统一的外部接口访问
echo $demo2->show();
echo '<hr>';

//如果想简化以上操作,可以在实例化之前,在构造方法中调用属性访问接口方法
new Demo2('王先生','PHP',88);
echo '<hr>';

//属性操作: 获取,设置,检测,销毁
//获取
echo '姓名:',$demo2->name,'<br>';//访问私有属性,如类中无__get()会出错,如有自动触发
echo '姓名:',$demo2->grade,'<br>';//可以在__get()进行属性访问的权限控制
//设置
$demo2->course = 'Python';
echo '课程:',$demo2->course,'<br>';
$demo2->grade = 65;
echo '<hr>';
//检测.因为grade是私有属性,所以外部检测不到,类中用_isset()方法就可以检测到
echo isset($demo2->name) ? '存在<br>':'<span style="color:red">不存在</span><br>';
echo isset($demo2->grade) ? '存在<br>':'<span style="color:red">不存在</span><br>';
//销毁
echo $demo2->course,'<br>';//销毁前展示
unset($demo2->course);//销毁
echo $demo2->course,'<br>';//销毁后检测

unset($demo2->name); // 重载方法中__unset()设置了不允许销毁grade和name属性
unset($demo2->grade);// 重载方法中__unset()设置了不允许销毁grade和name属性
echo $demo2->name,'<br>';// 所以这里仍可以访问到name属性
echo $demo2->grade,'<br>';// 所以这里仍可以访问到grade属性

运行实例 »

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

编程3: 类的继承与方法重写

0903zuoye3.png

实例

<?php
//类的继承与方法重写
//
//1.类之间的继承,是代码复用的重要手段,之前我们是通过“函数”实现代码复用
//2.继承使用的关键字是:extends
//3.引用父类成员:parent::
//4.子类可以将父类中的公共public和受保护protected成员全部继承


class Demo3
{
	//父类属性
	public $name;
	protected $age;
	private $salary;
	const APP_NAME = '学生管理系统';

	//父类构造器
	public function __construct($name,$age)
	{
		$this->name = $name;
		$this->age = $age;
	}

	/*//属性访问重载,哪个类工作,属性重载就卸载哪个类里。new的哪个类,就是在哪个类工作。
	public function __get($name)
	{
		if(isset($this->$name))
		{
			return $this->$name;
		}return '非法属性';
	}*/
}

class Demo3_1 extends Demo3
{
	//子类自有属性
	private $sex;
	const APP_NAME = '教师管理系统';//类常量可以在子类中重写

	//子类将父类同名方法进行重写(必须对父类的属性重新声明),根据传入参数不同,实现不同的功能,这就是多态性
	public function __construct($name,$age,$sex='male')
	{
		/*//属性声明:方法1
		$this->name = $name;
		$this->age = $age;
		$this->sex = $sex;*/

		//属性声明:方法2:引用父类的构造方法来简化代码
		parent::__construct($name,$age);
		$this->sex = $sex;

	}

	//将父类属性重载方法重写后,顺利读取子类属性
	//所以属性重载方法__get()应该设置在最终工作类中(例如:本类Demo3_1),而不是父类Demo3中
	//此时,将父类Demo3中的__get()删除,代码执行仍然正确
	public function __get($name)
	{
		if(isset($this->$name))
		{
			return $this->$name;
		}return '非法属性';
	}

}

//当前类Demo3_1中即使没有任何成员,一样可以访问父类成员
$Demo3_1 = new Demo3_1('wang',80);

//访问父类中的属性
echo $Demo3_1->name,'<br>';
echo $Demo3_1->age,'<br>';
echo $Demo3_1->salary,'<br>';//父类私有属性子类不可见,访问不到。
echo Demo3::APP_NAME,'<br>';
echo Demo3_1::APP_NAME,'<br>';//访问类常量
//echo Demo3_1->sex;//取不到值,因为父类__get()不能识别子类属性

运行实例 »

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

编程4: 类中静态成员的声明与访问

0903zuoye4.png

实例

<?php
//类中静态成员的声明与访问
//
//1.类中静态成员使用关键字:static 定义。
//2.静态成员包括:静态属性和静态方法。
//3.静态成员是属于类的,我们应该使用类来访问
//4.静态属性必须使用类来访问,而静态方法即可以使用类,也可以用对象访问
//5.静态成员是可以有访问限制的:public,protected,private
//6.静态成员与对象无关,所以内部不允许使用伪变量:$this
//7.访问时,类名后必须使用:范围解析符:双冒号::
//8.在类中引用自身使用关键字:    self::
//
//范围解析符的作用
//1.访问静态成员
//2.访问类常量
//3.继承上文中引用被覆盖成员


class Demo4
{
	public static $pdo = null;
	protected static $db = 
	[
		'type' => 'mysql',
		'host' => 'localhost',
		'dbname' => 'edu',
		'user' => 'root',
		'pass' => 'root',
	];

	public static function connect()
	{
		//等价于mysql:host=localhost;dbname=edu
		$dsn = self::$db['type'].':host='.self::$db['host'].';dbname='.self::$db['dbname'];
		//等价于$pdo = new PDO('mysql:host=127.0.0.1;dbname=edu,'root','root');
		self::$pdo = new PDO($dsn,self::$db['user'],self::$db['pass']);
	}

	public static function select($table,$fields='*',$num=5)
	{
		$stmt = self::$pdo->prepare("SELECT {$fields} FROM {$table} LIMIT {$num}");
		$stmt->execute();
		return $stmt->fetchAll(PDO::FETCH_ASSOC);
	}
}

//连接数据库
Demo4::connect();

//查询数据表
$result = Demo4::select('user','name,email',6);

//显示结果
echo '<pre>',var_export($result);

运行实例 »

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


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议