Blogger Information
Blog 40
fans 0
comment 0
visits 37603
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP学习总结(13)类、接口类、抽象类——2019年10月9号20:00分
虎子爸爸
Original
603 people have browsed it

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();



?>

运行实例 »

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

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

Correction status:qualified

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