博客列表 >PHP学习总结(13)类、接口类、抽象类——2019年10月9号20:00分

PHP学习总结(13)类、接口类、抽象类——2019年10月9号20:00分

虎子爸爸
虎子爸爸原创
2019年10月11日 15:45:59599浏览

class-d.png

实例

<?php
namespace User;
//一个正常类,可以被实例化,可以继承
class User{
    // 公共属性
    public $name;
    public $salary;
    // 受保护的属性
    protected $sex;
    // 私有化
    private $work;
    // 静态属性,静态可以public也可以protected
    public static $age;
    public static $height;
    /*
     *先定义一个静态属性——连接对象
     *这里定义个静态属性,并且还把的值定义为null,就是方便后面好赋值,好调用
    */

    protected static $pdo = null;
    // 类常量
    const CATEGORY = "这是一个类常量";
    // 构造方法
    /*
    1、定义一个构造方法(初始化方法,一个类也就一个构造方法)
    2、构造方法不能是私有的,受保护的,只能是公共的public
    */

    public function __construct($name,$salary){
        $this->name = $name;
        $this->salary = $salary;//当前类对象的常规属性
        self::$age = 30;//读取当前类的静态属性
        echo self::$age;
    }
    //定义一个静态方法work
    public static function work($name,$height){
        /*
        *首先静态方法里面不能用这个$this,因为静态方法是属于类成员,不是对象
        *静态方法里面只能用self
        不然就会出现这个错误:Fatal error: Using $this when not in object context in H:\phpstudy_pro\WWW\html.io\1008\class_a.php on line 24
        */
        //return $this->name;//这样写会出现上面的错误
        self::$height = $height;   
        return self::$height;
    }
    public function info($content){
        echo "这是常规类方法".$content;

    }
    //定义4个魔术重载方法
    // 当读取User类里面不可访问属性的值时,__get()被自动触发;
    public function __get($name){
        if($name ==='boss'){
            return ($this->name ==='admin') ? $this->$name : '权限不够';
        }
        return $this->$name;
    }
    // 当设置User类里面不可访问属性的值时,__set()被自动触发
    public function __set($name,$value){
        if($name ==='boss'){
            return ($this->name ==='admin') ? $this->$name : '权限不够';
        }
        return $this->$name;
    }
    //当对User类里面不可访问属性进行isset() 或empty()判断时,__isset()被自动触发
    public function __isset($name){
        return isset($this->$name);
    }
    
    public function __unset($name){
        unset($this->$name);
    }
    // 
    public function __call($name,$arguments){
        echo $name."方法不存在,触发了__call()方法";
    }
    public static function __callStatic($name,$arguments){
        echo $name."静态方法不存在,触发了__callStatic()方法";
    }

}
// 常规类操作---先实例化
$user = new User('xiaomao',20);
echo "<br>";
echo "常规方法--->";
// 获取对象的方法
$user->info('这是内容');
echo "<br>";
// 获取类的静态属性
echo "静态属性--->".User::$age;
echo "<br>";
echo "静态方法--->".User::work('name','333303');

// 用abstract定义一个抽象类,不能直接被实例化,可以继承
abstract class Phone{
    // 定义一个受保护属性
    protected $name;
    // 定义一个构造方法    
    public function __construct($name){
        $this->name = $name;

    }
    // 定义一个获取器,把当前的名字返回过期
    public function getName(){
        return $this->name;
    }
    // 定义一个抽象方法---设置名字(签名)
    abstract public function setName($value);

}

class MyPhone extends Phone{
    // 先写个构造方法,构造方法不能继承
    public function __construct($name){
        parent::__construct($name);
    }
    // 还必须先实现所继承抽象类中的抽象方法
    public function setName($value){
        $this->name = $value;
    }
}
// 操作MyPhone类
$phone = new MyPhone('xiaomao');
echo "<br>用户名--->".$phone->getName()."<br>";
$phone->setName('Kat');
echo "他的昵称是--->".$phone->getName()."<br>";
//假如直接实例化Phone类,$newPhone = new Phone();报错---
// Fatal error(致命错误): Uncaught Error(未定义错误): Cannot(不能) instantiate(实例化) abstract(抽象) class(类) User\Phone(User空间里面的Phone类)
//
// 定义一个接口类
interface qqLogin{
    //定义方法,必须要实现的
    public function setName($name);
    public function setPass($password);
}
//实现接口
class Mylogin implements qqLogin{
    //定义两个属性
    public $name;
    public $password;
    //先实现接口中的方法
    public function setName($name){
        $this->name = $name;
    }
    //继续实现接口中的方法
    public function setPass($password){
        $this->password = $password;
    }
    //可以弄一个自己的方法
    public function login(){
        return "你的登录账户:".$this->name."<br>你的登录密码为:".$this->password;
    }
}
//继续实现接口
class Myreg implements qqLogin{
    //还是要定义两个属性
    public $name;
    public $pass;
    //继续实现接口中的方法
    public function setName($name){
        $this->name = $name;
    }
    public function setPass($password){
        $this->pass = $password;
    }
    public function reg(){
        return "你的注册账户:".$this->name."<br>你的注册密码为:".$this->pass;
    }
}
//开始调用类Mylogin
$login = new Mylogin();
$login->setName('李大仙');
$login->setPass('123456');
echo $login->login();
//开始调用类Myreg
$reg = new Myreg();
$reg->setName('黄四娘');
$reg->setPass('654321');
echo "<br>";
echo $reg->reg();



?>

运行实例 »

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

总结:接口类一般都是别人类,不然哪会那么多条件!

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