首页 > 其他分享 >接口(抽象类)与后期静态绑定学习

接口(抽象类)与后期静态绑定学习

时间:2024-07-10 23:52:11浏览次数:16  
标签:function 绑定 接口 echo static Test new 抽象类 class

<?php
// 抽象类abstract声明抽象类 不能被实例化
// 抽象类经常用于描述一些事物所具有的特征和行为,但是没有具体的实现
// 抽象类:设计与实现的分离  抽象类可以为子类提供一些公共的接口以作为子类重写的模板来使用


abstract class Person
{
    protected $name;
    protected $country;

    public function __construct($name='',$country='喵星')
    {
        $this->name = $name;
        $this->country = $country;
    }

    // 抽象方法
    abstract function say();
    abstract function eat();

    // 普通方法
    public function run()
    {
        echo '两条腿走路<br>';
    }

}

// abstract class Chinese extends Person{

   
//     // 子类按照自己的需求去实现抽象方法,如果抽象方法未全部实现 那么该类依然是一个抽象类
//     public function say()
//     {
//         echo "$this->name 是{$this->country}人,他说的是{$this->country}话。<br>";
//     }
// }


 class Chinese extends Person{

   
    // 子类按照自己的需求去实现抽象方法,如果抽象方法未全部实现 那么该类依然是一个抽象类
    public function say()
    {
        echo "$this->name 是{$this->country}人,他说的是{$this->country}话。<br>";
    }

    public function eat()
    {
        echo "{$this->name} 用筷子吃饭。<br>";
    }
}
$Chinese = new Chinese("柯基大人",'中国'); 
$Chinese->say();
$Chinese->run();
$Chinese->eat();

echo '<hr>';
class American extends Person{

    public function say()
    {
        echo "$this->name 是{$this->country}人,他说的是{$this->country}话。<br>";
    }

    public function eat()
    {
        echo "{$this->name} 用刀叉吃饭。<br>";
    }
}

$a = new American ('MIKE','美国');
$a->say();
$a->run();
$a->eat();


?>

  

<?php
// 接口 interface 接口是定义 类的实现  trait结构 解决oop高耦合
interface Idemo
{
    // 接口中只允许声明两类成员 1.接口常量 2.公共的抽象方法
    const APP_NAME = 'hidemi小铺';

    public static function getInfo(...$info);
    public static function cal($one,$two);
}

interface Idemo2
{
   
}

// 接口的实现 implements
class Work implements Idemo
{
    static function getInfo(...$info)
    {
        return print_r($info,true);
    }


    static function cal($one,$two)
    {
        return $one * $two;
    }
}

ECHO Work::APP_NAME;
ECHO Idemo::APP_NAME;

echo work::getInfo('古力娜扎','28',172,'新疆');
echo work::cal(58,69);


// 先继承再实现
// 工作类exterface2 抽象类(普通类)implements interface1,interface2,...


echo'<hr>';
// oop封装 继承 多态
// 多态实现了动态绑定的功能
// PHP中多态指的是方法的重写



// 为计算机(主程序)扩展功能 接口是定义
interface USB
{
    function run();
}

// 为计算机扩展功能 扩展了一个额USB 键盘 实现USE接口 
class Ukey implements USB
{
    function run()
    {
      return '运行USB键盘设备<br>'; 
    }
}

class Umemo implements USB
{
    function run()
    {
      return '运行USB储存盘设备<br>'; 
    }
}

class Umouse implements USB
{
    function run()
    {
      return '运行USB鼠标设备<br>'; 
    }
}


// 主程序计算机
class Computer
// 计算机类中的一个方法 要可以应用任意一种USB设备
{function useUSB($usb)//参数是一个对象
    {
        return $usb->run();
    }
}

$c = new Computer;
echo $c->useUSB(new Umouse());//为计算机主程序插入use鼠标并运行
echo $c->useUSB(new Ukey());//为计算机主程序插入use鼠标并运行
echo $c->useUSB(new Umemo());//为计算机主程序插入use鼠标并运行
?>

  

<?php
// 后期静态绑定 static
class Test
{
    public function connect():string
    {
        return "父类Test中的方法".__METHOD__.'<br>';
    }

    public function show():string
    {
        return $this->connrct();
    }
}
class Pro extends Test{
    public function connect():string
    {
        return "子类Test中的方法".__METHOD__.'<br>';
    }
}

// 在传统继承上下文中 $this可以动态的和调用对象进行绑定
echo (new Test)->connect();
echo (new pro)->connect();

echo (new Test)->show();//父类Test中的方法Test::connect
echo (new pro)->show();//子类Test中的方法Test::connect

class Father
{
    protected static $_instance = null;

    static public function getInstance()
    {
        //单例模式 保证实例化只发生一次
        // self始终和当前类进行绑定
        // 在静态的继承上下文中,self不能动态的识别它的调用者
          

        if(self::$_instance === null)
        {
            self::$_instance === new self();//返回的实例是变不变的 无论谁去调用 返回的是同一个类的实例
        }
        return self::$_instance;
    }
}

class Son1 extends Father
{
    protected static $_instance = null;
}

class Son2 extends Father
{
    protected static $_instance = null;
}
var_dump(Father::getInstance());
var_dump(Son1::getInstance());
var_dump(Son2::getInstance());

// 使用self实例化得到的结果依然是Father类的同一个对象
?>

  

<?php
// 后期静态绑定 static
class Test
{
    public function connect():string
    {
        return "父类Test中的方法".__METHOD__.'<br>';
    }

    public function show():string
    {
        return $this->connrct();
    }
}
class Pro extends Test{
    public function connect():string
    {
        return "子类Test中的方法".__METHOD__.'<br>';
    }
}

// 在传统继承上下文中 $this可以动态的和调用对象进行绑定
echo (new Test)->connect();
echo (new pro)->connect();

echo (new Test)->show();//父类Test中的方法Test::connect
echo (new pro)->show();//子类Test中的方法Test::connect

class Father
{
    protected static $_instance = null;

    static public function getInstance()
    {
        //单例模式 保证实例化只发生一次
    
          
        // 后期静态绑定开始
        if(static::$_instance === null)
        {
            static::$_instance === new static;//new static 生成的实例 是由调用对象决定的
        }
        return static::$_instance;
    }
}

class Son1 extends Father
{
    protected static $_instance = null;
}

class Son2 extends Father
{
    protected static $_instance = null;
}
var_dump(Father::getInstance());
var_dump(Son1::getInstance());
var_dump(Son2::getInstance());

// 使用self实例化得到的结果依然是Father类的同一个对象
?>

  

<?php
// 单例模式连接数据库

interface iDbBase
{
    // 数据库操作 curd
    static function insert($db,$data);
    static function select($db,$where=[]);
    static function delete($db,$where=[]);
    static function update($db,$data,$where=[]);

    static function insert($db,$username,$password);
}

abstract class aDb implements iDbBase
{
    // 创建类的唯一实例 pdo对象
    private static $_instance;

    // private私有的 阻止此类在外部进行实例化
    private function __construct()
    {
   
    }
    // private私有的 阻止此类在外部进行克隆
    private function __clone
    {

    }

    static function doConnect($db,$username,$password)
    {
        // 得到pdo连接对象 存储在 $_instance
        if(is_null(self::$_instance))
        {
            self::$_instance = new PDO($dsn,$username,$password);
        }

        return self::$_instance;

    }


}

// 工作类
class Dd extends aDd{
    // 数据库操作 curd
    ststic function insert($db,$data){

    }

    static function select($db,$where=['gender'=>1,'id'=>20201]){
        // select filed.. form tableName where gender=1 and id>1
        // select filed.. form tableName where gender=1
        $str = '';
        foreach($where as $k=>$v)
        {
            if(is_array($where))
            {
                if(count($where) > 1)
                {
                    $str .=$k . '=' . $v . 'and';
                }else{
                    $str .=$k . '=' .$v;
                }
            }
        }
        if(count($where) > 1)
        {
            // 去掉where中的最后一个and
            $str = substr($str,0,strlen($str)-4);
            // echo $str;
        }
          // echo $str;

        return $db->query("SELECT `uname`, 'tel' FROM `iuser` WHERE $str ")->fetchAll(PDO::FETCH_ASSOC);
    }

    static function delete($db,$where=[]){

    }

    static function update($db,$data,$where=[]){

    }

   
}

// 客户端代码
$dsn = 'mysql:host=39.105.79.62;dbname=news';
$db = Db::doConnect($dsn,'miujue','zhoujielun521');
var_dump($db);
print_r(Db::select($db));

?>

  

标签:function,绑定,接口,echo,static,Test,new,抽象类,class
From: https://www.cnblogs.com/QWD7986/p/18295217

相关文章

  • 业务开发时,接口不能对外暴露怎么办?
    在业务开发的时候,经常会遇到某一个接口不能对外暴露,只能内网服务间调用的实际需求。面对这样的情况,我们该如何实现呢?今天,我们就来理一理这个问题,从几个可行的方案中,挑选一个来实现。1.内外网接口微服务隔离将对外暴露的接口和对内暴露的接口分别放到两个微服务上,一个服务里所有......
  • Ceph块存储系统RDB接口
    目录1.创建Ceph块存储系统RBD接口1.1创建一个名为rbd-xy101的专门用于RBD的存储池1.2创建镜像1.3 查看镜像1.4 修改镜像大小1.5 删除镜像1.6 临时删除镜像2.Linux客户端使用2.1在管理节点创建并授权一个用户可访问指定的RBD存储池2.2 修改RBD镜像......
  • 利用Selenium和PhantomJS绕过接口加密的技术探索与实践
    selenium+phantomjs绕过接口加密我们为什么需要selenium之前我们讲解了Ajax的分析方法,利用Ajax接口我们可以非常方便地完成数据的爬取。只要我们能找到Ajax接口的规律,就可以通过某些参数构造出对应的的请求,数据自然就能被轻松爬取到。但是,在很多情况下,Ajax请求的接口通......
  • 前端如何取消接口调用
    ......
  • 智能小程序 Ray 开发门锁 API ——日志 API 接口汇总
    查询最近一条日志记录getLatestLog引入@ray-js/ray^1.5.0以上版本可使用import{getLatestLog}from'@ray-js/ray'参数LatestLogParams属性类型必填说明devIdstring是设备ID返回LatestLogResponse结构包含日志记录的各种详细信息。函数定义示例/***查询......
  • api文字识别智能录入、身份证识别、接口识别​
    OCR技术和由此带来的文字识别自动化程度不断增加,不少人预计该技术将对相当一部分的行业、工作产生影响,其中有一部分是颠覆性的。比如文字录入的工作,现在不少企业为自己的系统、产品集成了OCR技术核心,不仅能够减少人工录入的压力,正确率及录入速度等都得到了大幅的提升。可......
  • 实现了 ApplicationContextAware 接口的bean可以接收到 ApplicationContext 的引用
    `ApplicationContext`和`ApplicationContextAware`是Spring框架中的两个不同的概念,它们在Spring应用中扮演着不同的角色:1.**ApplicationContext**:  -`ApplicationContext`是Spring框架中的一个接口,它扩展了`BeanFactory`接口,提供了更多高级功能,如事件发布机制、......
  • C++发票识别接口轻松管理财务、发票识别sdk、增值税发票识别
    “营”“增”两种税是主流的流转税种,是两个独立而不能交叉的税种。也就是说交增值税的话就不交营业税,而交了营业税就不需要交增值税。而且,两者在征收的对象、征税范围、计税的依据、税目、税率以及征收管理等都有所不同,增值税在一些方面与营业税相比具有不少优势。营业税......
  • 【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【前缀和/固定滑窗】2
    有LeetCode算法/华为OD考试扣扣交流群可加948025485可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路贪心思想......
  • C#将文件以byte[]形式传给python的sanic接口
    C#如何将文件以byte[]形式传给python的sanic接口?C#调用的部分你可以按照以下步骤进行:1)读取文件,将文件转换成byte[];2)定义类,将byte[]内容转成json格式传输;3)使用post请求将content传输到接口,返回结果;C#调用部分代码:/*将文件转换成byte[]格式*/protectedstaticbyte[]GetFileD......