[PHP]类的完整应用实例

该实例完整应用了php中的类

供应用参考

<?php
class ClassA{		//定义类

//关键字可以是public,private,protected,static,final
public $name;
private $num;

//定义一个类常量
const PI=3.14;

function __construct(){	//一个构造方法
	$this->name='defaultName';
	echo 'ClassA构造完毕:'.$this->name.'<br>';
	//$name='defaultName';这是创建了一个局部变量$name,与成员变量$name无关
}

function __destruct(){	//析构方法,可在unset(类实例)或被垃圾回收时自动调用
	echo $this->name.' <b>die</b><br>';
}

//下面这个是一个经过final修饰后,不可重写(覆盖)的方法
public final function add($a,$b,$num){//方法前面可以加访问限制符,也可以不(默认public修饰)
	$this->num=$num;
	return('function add:'.$a+$b+$num);
}

}

final class ClassB extends ClassA{	//ClassB继承了ClassA且ClassB经过final修饰后不可再被继承
	
	function __construct($name){	//这是多态的覆盖,覆盖了父类方法
		parent::__construct();	//调用父类构造:可以没有,仅做parent的使用演示
		//parent可以调用父类中的成员变量,成员方法和常量
		$this->name=$name;
		echo 'ClassB构造完毕:'.$this->name.'<br>';
		echo 'self调用:'.self::PI.'<br>';
		//self可以调用当前类中的静态成员和常量
	}
	
	function classFunction(){
		echo 'get_class($object):'.get_class($this);//获得类
	}
	
	//当访问一个不存在的或者私有属性(权限不够)或方法的时候,能够触发的下列的魔术方法
	//参考:https://www.php.cn/php-weizijiaocheng-295373.html
	
	function __set($name, $value){//设置属性的时候自动触发
		echo "失败的设置($name:$value)<br>";
	}
	
	function __get($name){//获取属性的时候自动触发
		echo "失败的获取($name)<br>";
	}
	
	function __isset($name){//isset和empty时自动触发
		echo "失败的isset或empty($name)<br>";
	}
	
	function __unset($name){//unset时自动触发
		echo "失败的unset($name)<br>";
	}
	
	function __call($name, $arguments){//访问一个非静态方法时自动触发
		echo "失败的非静态方法调用($name)<br>";
		echo '参数'.count($arguments).':<br>';
		foreach($arguments as $value){
			echo $value.'<br>';
		}
	}
	
	static function __callStatic($name, $arguments){//访问一个静态方法时自动触发
		echo "失败的静态方法调用($name)<br>";
		echo '参数'.count($arguments).':<br>';
		foreach($arguments as $value){
			echo $value.'<br>';
		}
	}
	
	//当将类对象序列化的时候,将会触发以下方法
	function __sleep(){
		echo '__sleep:序列化后的对象可以存放到文本文件,数据库等地方<br>';
	}
	
	//当将序列化后的类对象还原的时候,将会触发以下方法
	function __wakeup(){
		echo '__wakeup:将已经序列化的字符串转换回对象<br>';
	}
	
}
$var=new ClassA();		//创建类实例
echo $var->name;
echo '<br>';
echo $var->add(3,4,8);	//调用类方法
echo '<br>';
echo ClassA::PI;		//通过类名输出类常量
echo '<br><br>';

$var=new ClassB('ClassB');//创建继承类的实例
echo $var->name;
echo '<br><br>';
$var->classFunction();
echo '<br><br>';
$var->num=3;	//失败的设置(private修饰的变量只能类内调用和修改)
$var->a;		//失败的获取
empty($var->a);	//失败的empty
isset($var->a);	//失败的isset
unset($var->a);	//失败的unset
$var->a(1,2);	//失败的非静态方法调用
ClassB::a(1,2);	//失败的静态方法调用
echo '<br>';

abstract class People{
	abstract function say();
}

interface Human_eat{
	function eat();
}

interface Human_move{
	function walk();
	function jump();
}

class Me extends People implements Human_eat,Human_move{
	public $num=1;
	function say(){
		$this->num=2;
		echo 'I say something<br>';
	}
	function eat(){
		echo 'I eat<br>';
	}
	function walk(){
		echo 'I walk<br>';
	}
	function jump(){
		echo 'I jump<br>';
	}
	function __clone(){//当类实例被克隆的时候调用该方法
		echo '被克隆!<br>';
	}
	function __toString(){
		return '人<br>';
	}
}

$var = new Me();
$var->say();
$var->eat();
$var->walk();
$var->jump();
echo $var->num;
echo '<br>';
$i = clone $var;	//克隆一个对象
echo $i->num;
echo '<br>';
if($var == $i)
	echo '内容相等<br>';
if($var !== $i)
	echo '地址不相等<br>';
if($var instanceof Me)	//检测当前对象属于哪个类
	echo '$var属于Me类<br>';
if($var instanceof People)
	echo '$var属于People类<br>';
if($var instanceof $i)
	echo '$var与$i同属于某个类<br>';

echo '<br>';
$str=serialize($var);//序列化成字符串
echo '序列化后的字符串:'.$str.'<br>';
$i=unserialize($str);//还原成对象
echo $var;//隐式调用__toString();
?>

对照结果:
ClassA构造完毕:defaultName
defaultName
function add:15
3.14

ClassA构造完毕:defaultName
ClassB构造完毕:ClassB
self调用:3.14
defaultName die
ClassB

get_class($object):ClassB

失败的设置(num:3)
失败的获取(a)
失败的isset或empty(a)
失败的isset或empty(a)
失败的unset(a)
失败的非静态方法调用(a)
参数2:
1
2
失败的静态方法调用(a)
参数2:
1
2

ClassB die
I say something
I eat
I walk
I jump
2
被克隆!
2
内容相等
地址不相等
$var属于Me类
$var属于People类
v a r 与 var与 vari同属于某个类

序列化后的字符串:O:2:“Me”:1:{s:3:“num”;i:2;}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值