Blogger Information
Blog 71
fans 1
comment 1
visits 86910
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP之抽象类和对象
小威的博客
Original
771 people have browsed it
  • 抽象类

 * 1.使用关键字: abstract

 * 2.类中只要有一个方法声明为abstract抽象方法,那么这个类就必须声明为抽象类

 * 3.抽象方法只允许有方法声明与参数列表,不允许有方法体;

 * 4.因为抽象方法的不确定性,所以抽象类禁止实例化,仅允许通过继承来实例化;

 * 5.继承抽象类的子类中,必须将抽象类中的所有抽象方法全部实现

 * 6.子类成员的访问限制级别必须等于或小于抽象类的约定,例如抽象类是protected,子类必须是

 * protected 或者 public 不允许是private

 * 7.子类方法参数必须与抽象类方法参数完全一致,但允许增加默认参数


特别注意

 * 1. 尽管抽象类不能实例化,但仍然可以为它创建构造器,但必须声明为final

 * 2. 抽象类理论上说不应该拥有静态成员,部分编辑器会有E_STRICT2048提示,但仍然可以这样做

实例

<?php

abstract class Fruits
{
    //水果名称
    protected $name;
    
    //声明静态属性,因为要用到静态类中
    protected static $name;
    
    
    //抽象方法
    abstract public  function eat();
    
    //静态抽象方法
    abstract static public  function eat();
    
    //尽管不能直接实例化抽象类,但仍然可以有构造方法
    public function __construct()
    {
        return '抽象类构造器,实例化时自动调用<br>';
    }
    
}

//为了教学方便,将抽象类与它的子类全部写在一个类文件中
//实际开发中应该为每一个类创建独立的类文件
class Apple extends Fruits
{
    protected $name = '苹果';
    
    //声明为静态属性
    public static $name = '苹果';
    
    public  function eat()
    {
        return $this->name.'可以直接生吃';
    }
    
    //子类构造方法
    public function __construct()
    {
        echo parent::__construct();
        
    }


    //实现抽象类中的抽象静态方法eat()
   public static function eat()
   {
       return self::$name.'可以直接生吃';
    }
}


$apple = new Apple;
echo $apple->eat();

//此前是抽象静态类,不需要例化,可以用类直接访问

echo Apple::eat();

运行实例 »

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

  • 遍历对象

 * 1.仅能遍历属性,方法不可遍历

 * 2.外部遍历仅能查看公共可见属性

 * 3.如果要查看全部属性,需要在类中创建外部接口方法来实现

 * 4.最终结果以关联数组格式呈现,使用foreach()语句进行遍历

实例

<?php

class Lecture 
{
    public $name = 'Peter Zhu';
    public $gender = '男';
    public $age = 30;
    public $course = 'php,java,python,c';
    
    protected $email = 'peter@php.cn';
    private $salary = 18000;
    private $phone = 15905519988;
    
    public function listPro()
    {
        foreach ($this as $key=>$value){
            echo '['.$key.'] => '.$value.'<br>';
        }
    }
}

//类外只能访问到公共可见属性,不能查看受保护与私有属性
foreach((new Lecture) as $key=>$value){
    echo '['.$key.'] => '.$value.'<br>';
}

echo '<hr>';

echo '<h3>全部属性</h3>';
(new Lecture)->listPro();

//更多遍历对象的方法,可以查阅官方手册:php.net中的SPL函数库

运行实例 »

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

一、对象的序列化

 * 1.php中的任何值都可以序列化为包含字节流表示的字符串来表示

 * 2.序列化对象可以保存到变量或者文件中,方便保存和传送

二、对象的反序列化

实例

<?php

//数值序列化
$num = 500;
echo serialize($num),'<br>';

//字符串序列化
$name = 'peter';
echo serialize($name),'<br>';

//数组序列化
$course = ['php','mysql','thinkphp'];
echo serialize($course),'<br>';

//布尔序列化
$isPass = true;
echo serialize($isPass),'<br>';

//对象序列化:以一个数据库连接类为例
class Db
{
    //连接参数与返回值
    public $db = null;
    public $host;
    private $user;
    private $pass;

    //构造方法
    public function __construct($host='localhost',$user='root',$pass='root')
    {
        //类属性初始化
        $this->host = $host;
        $this->user = $user;
        $this->pass = $pass;
        
        //创建对象时自动连接数据库
        $this->connect();
    }
    
    //连接数据库的方法
    private function connect()
    {
        $this->db = mysqli_connect($this->host,$this->user, $this->pass);
    }
    
    //serialize($obj)序列化的时候,会自动调用__sleep(void)
    //主要用于对象休眠时的一些清理工作,例如指定哪些属性允许进入到休眠对象的属性序列中
    public function __sleep()
    {
        //返回由属性名字符串组成的索引数组,指示序列化时要保存的字段名
        return ['host','user','pass'];
        //对于本案例来说,如果连接参数不变的情况下,只要将$this->db保存到对象序列中即可
//        return ['db'];
    }
    
    //unserialize()反序列化的时候,会自动调用__wakeup(void)
    //主要用于唤醒对象时要做的初始化工作,例如本例中的:自动连接数据库
    public function __wakeup()
    {
        $this->connect();
    }
    
}

$obj = new Db();
/**
 * 对象序列化的特点:
 * 1.只保存对象中的属性,不保存方法
 * 2.只保存类名,不保存对象名
 */
echo serialize($obj);

//为了演示反序列化,我们将序列化的对象保存到一个变量中,当然也可以保存到文件中

$tmp1 = serialize($obj);

echo '<hr>';

//查看序列化后的变量内容,与之前序列化内容是一样的
echo $tmp1;

//现在进行反序列化操作,将保存到变量中的对象取出来
$tmp2 = unserialize($tmp1);

//检测$tmp2是否是一个对象
echo '<hr>';
echo is_object($tmp2) ? '对象' : '不是';

echo '<hr>';

//获取属性,查看数据库连接对象
var_dump($tmp2->db);

//现在考虑这样的一个问题?如果我只想序列化

运行实例 »

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

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
Author's latest blog post