博客列表 >类的进阶知识了解与简单应用——2018年9月5日

类的进阶知识了解与简单应用——2018年9月5日

Jackson
Jackson原创
2018年09月15日 23:27:55693浏览
  1. 匿名类和匿名对象的实现过程

    匿名对象是没有名称的对象,而匿名类则是没有类名的类,使用于一次性的创建于应用,总是与new配套使用。

    匿名类有三种应用场景:1.匿名类可以有构造方法 2.匿名类可以继承其他类 3.可以在类中嵌套匿名类

    实例

    class Hero
    {
        private $name = '杨过';
        public function story($name){
             return $this->name.'喜欢上了<span style="color:red">'.$name.'</span>';
        }
    }
    //有3中访问方式
    //1.对象
    $hero = new Hero();
    echo $hero->story('小龙女'),'<br>';
    //2.匿名对象
    echo (new Hero())->story('郭襄'),'<br>';
    //3.匿名类
    echo (new class{
        private $name = '郭靖';
        public function story($name){
            return $this->name.'喜欢<span style="color:red">'.$name.'</span>';
        }
    })->story('黄蓉'),'<hr>';
    
    //匿名类的三种应用场景
    //1.匿名类中的可以使用构造方法
    echo (new class('jack'){
        private $name;
        public function __construct($name)
        {
            $this->name = $name;
        }
        public function story($name){
            return $this->name.'喜欢'.$name;
        }
    })->story('rose'),'<hr>';
    
    //2.匿名类中可以继承其他类
    class KongFu
    {
        protected $skill; //招数
        public function __construct($art)
        {
            $this->skill = $art;
        }
        public function show()
        {
            return $this->skill? : '如来神掌';
        }
    }
    
    echo (new class('老顽童','弹指神功') extends KongFu {
        private $name;
          //匿名类中构造方法
        public function __construct($name,$art)
        {
            parent::__construct($art);//调用父类构造器
            $this->name = $name;
        }
        public function story($food)
        {
            return $this->name.'喜欢'.$food;
        }
        public function show()
        {
            return $this->name.'的绝招是:'.$this->skill; // TODO: Change the autogenerated stub
        }
    } )->show(),'<hr>';
    
    //3.可以在类中嵌套匿名类
    class Animal  //宿主类,父类
    {
        public $name = '狗';
        protected $color = '灰色';
        private $type = '哈士奇';
    
        public function demo1()
        {
            return (new class($this->type) extends Animal {
               private $type;
               //用构造方法 初始化传参获取父类私有属性、
                public function __construct($type)
                {
                    $this->type = $type;
                }
                public function show()
                {
                    return '动物名称:'.$this->name.'<br>'.
                            '动物颜色:'.$this->color.'<br>'.
                            '动物品 种:'.$this->type;
                }
                public function demo2()
                {
                    return '我是嵌套匿名类中的方法:'.__METHOD__;
                }
            });
        }
    }
    
    
    echo (new Animal())->demo1()->demo2();
    echo '<hr>';
    echo (new Animal())->demo1()->show();

    运行实例 »

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

  2. trait 类的声明与工作原理

    trait 特性类
     1.php只能单继承,trait 可以多继承,使用use来引入trait类
     2.trait是代码复用机制(函数,类的继承)
     3.trait 类不能实例化
     4.trait 类相当于方法集

    trait 类位于 Person 与 Student之间,比父类优先

    实例

if (!class_exists('Person')){
    class Person
    {
        protected $name;
        public function __construct($name='小明')
        {
            $this->name = $name;
        }

        public function study($course='php')
        {
            return $this->name.'在学校:'.$course;
        }
    }
}

//创建一个trait特性类
trait Course
{
    public $friend = '小安';
    public function study($name='打羽毛球')
    {
        return $this->name.'和'.$this->friend.$name;
    }

}
trait Recreation
{
    public $friends = '小强';
    public function study($name='打篮球')
    {
        return $this->name.'和'.$this->friends.$name;
    }
}

//trait类用use来引入类中,可以引入多个,可以使用trait类中的属性和方法
class student extends Person
{
    use Course, Recreation{
        Course::study insteadof Recreation;//使用Course中的study方法
        Recreation::study as sport;//起别名
    }
}
$student = new student();
// trait 类位于 Person 与 Student之间,比父类优先
echo $student->study(),'<hr>';
echo $student->sport(),'<hr>';
var_dump($student);

运行实例 »

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

3.类的自动加载写法

使用函数spl_autoload_register()可以实现类的自动加载,方便引入大量的类。代码如下:

实例

//自动加载 注册
spl_autoload_register(function ($className){
   require './class/'.$className.'.php';
});

echo Demo1::CLASS_NAME,'<hr>';
echo Demo2::CLASS_NAME;

运行实例 »

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


4.对象的序列化与反序列化

对象的序列化可以把对象的属性转为字符串保存起来,方便数据的保存于传输

而对象的反序列化则是把字符串还原成之前的对象。

序列化只保存类中的属性,不保存方法,只保存类名,不保存对象名

序列化使用函数serialize(),而反序列化则是unserialize()

实例

class Db1
{
    public $db = null;
    public $host;
    public $user;
    public $pass;

    public function __construct($host='localhost',$user='root',$pass='root')
    {
        $this->host = $host;
        $this->user = $user;
        $this->pass = $pass;
        //创建好对象就连接上数据库
        $this->connect();
    }

    public function connect()
    {
        $this->db = new mysqli($this->host,$this->user,$this->pass);
    }

    //序列化自动调用
    public function __sleep()
    {
        return ['host','user','pass']  ;// TODO: Implement __sleep() method.
    }
    public function __wakeup()
    {
        $this->connect();   // TODO: Implement __wakeup() method.
    }
}

$db_con = new Db1();
//对象序列序列化特点
//只保存类中的属性,不保存方法,只保存类名,不保存对象名
$tmp = serialize($db_con);
var_dump($tmp);
var_dump($db_con->db);
var_dump(unserialize($tmp));

运行实例 »

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


5.面向对象的编程理解

个人认为面向对象的编程使得代码更加简洁,有效减少代码的复用,封装的程度更高。代码的可读性和维护性更加好了,更加适合实际的编程开发。而且面向对象的编程更加贴合实际生活,使得开发的逻辑更加明显。

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