Blogger Information
Blog 36
fans 0
comment 0
visits 28503
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类的进阶知识了解与简单应用——2018年9月5日
Jackson
Original
696 people have browsed it
  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.面向对象的编程理解

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

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