该实例完整应用了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与
var与i同属于某个类
序列化后的字符串:O:2:“Me”:1:{s:3:“num”;i:2;}
人