lnlidawei

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

PHP 类和接口

 

 

一、类和接口 

 

<?php 

// php_version = 7.4.1

interface information 
{
    // __say(): print class name
    public function __say():void;
    
    // __msg(): print attributes and method of class
    public function __msg():void;
}
    
class back implements information
{
    private $back_name;
    private $back_age;
        
    // interface function
    public function __say():void
    {
        echo PHP_EOL;
        echo "this_class_name = " . __CLASS__ .PHP_EOL;
    }
    
    // interface function
    public function __msg():void
    {
        echo PHP_EOL;
        echo "this_class_name = " . __METHOD__ .PHP_EOL;
        echo __CLASS__ . ".FUNCTIONS = " . "6, say, msg, display, set, get_name, get_age ." .PHP_EOL;

        echo "this_class_name = " . __METHOD__ .PHP_EOL;
        echo __CLASS__ . ".ATTRIBUTES = " . "2, name, age." .PHP_EOL;
    }
    
    public function set($name, $age)
    {
        $this -> back_name = $name;
        $this -> back_age = $age;
    }
    
    public function get_name()
    {
        return $this -> back_name;
    }
    public function get_age()
    {
        return $this -> back_age;
    }
    
    public function display()
    {
        echo PHP_EOL;
        echo "name = " . $this -> back_name ;
        echo " ,   age = " . $this -> back_age .PHP_EOL;
    }
    
    public function say()
    {
        $this -> __say();
    }
    
    public function msg()
    {
        $this -> __msg();
    }
    
}
    

// instances of back
$tmp = new back();
$tmp -> say();
$tmp -> msg();

// test set() display() 
$tmp -> set("laohu", 3);
$tmp -> display();

// test get_name() and get_age()
$temp_name = $tmp -> get_name();
echo "temp_name = " . $temp_name .PHP_EOL;
$temp_age = $tmp -> get_age();
echo "temp_age = " . $temp_age .PHP_EOL;
    

?> 

 

 

 

输出结果:

// 输出结果


this_class_name = back

this_class_name = back::__msg
back.FUNCTIONS = 6, __say, __msg, display, set, get_name, get_age .
this_class_name = back::__msg
back.ATTRIBUTES = 2, name, age.

name = laohu ,   age = 3
temp_name = laohu
temp_age = 3
 

 

 

 

二、trait :功能是函数代码重用

 

<?php 

// php_version = 7.4.1

// trait 功能“函数”复用
trait hello
{
    public function say_hello()
    {
        echo PHP_EOL;
        echo "hello ,  ";
    }
}

trait world
{
    public function say_world()
    {
        echo "world !" .PHP_EOL;
    }
}

// 只需引用 trait 定义的代码块,“实例”可以直接调用它的函数
class laohu
{
    // 引用trait定义的代码块
    use hello, world;    
}


// 建立 laohu对象
$tmp = new laohu();

// 调用“trait”定义的代码块的方法
$tmp -> say_hello();
$tmp -> say_world();

?> 

 

输出结果:

// 输出结果:

hello ,  world !

 

 

 

三、实例的序列化

 

<?php 

// php_version = 7.4.1


// trait 功能“函数”复用
trait hello
{
    public function say_hello()
    {
        echo PHP_EOL;
        echo "hello ,  ";
    }
}

trait world
{
    public function say_world()
    {
        echo "world !" .PHP_EOL;
    }
}


// 只需引用 trait 定义的代码块,“实例”可以直接调用trait定义的代码块的函数
class laohu
{
    protected $name = "your name";
    protected $age = "3";
    
    // 引用trait定义的代码块
    use hello, world;
    
    public function msg()
    {
        echo PHP_EOL;
        echo "name = " .$this -> name;
        echo " ,   age = " .$this -> age .PHP_EOL;
    }
}


// 建立 laohu对象
$tmp = new laohu();

// 序列化“实例 $tmp”
$sa = serialize($tmp);
echo $sa . PHP_EOL;

// 保存序列化“$sa ”内容
file_put_contents('save', $sa);


// 获取序列化“$sa ”的内容
$unseq = file_get_contents('save');

// 反序列化“实例 $tmp”
$unsa = unserialize($unseq);
$unsa -> say_hello();
$unsa -> msg();

?> 

 

输出结果:

// 输出结果

O:5:"laohu":2:{s:7:"*name";s:9:"your name";s:6:"*age";s:1:"3";}

hello ,  
name = your name ,   age = 3

 

 

 

四、协变和逆变

 

       1、协变:子类的方法的返回值类型更具体,较于父类的返回值类型;

  2、逆变:子类的函数可接受的参数类型更广泛,较于父类的可接受的参数类型;

 

 

 

五、

posted on 2021-12-08 02:04  lnlidawei  阅读(245)  评论(0编辑  收藏  举报