php || 单例模式

在这里插入图片描述

  • 静态方法和静态属性的调用,(用类名::静态方法或静态属性)
    类:
<?php
        class Mysql{
    
    
                protected $link="";//受保护属性
                protected static $myself = ""; //静态属性$mysql,类没有创建实例时
也可以用

                //__construct构造方法,数据库连接,在new Mysql()后自动运行,可
以传参数,不用调用,返回值return没有作用,不用写,只能是Public
                function __construct($host,$username,$password,$dbname){
    
    
                        $link = mysqli_connect($host,$username,$password,$dbname);
                        if (!$link){
    
    
                                return "连接失败:".mysqli_connect_error();
                        }else{
    
    
                                $this->link = $link;
                                return $link;
                        }
                }

                //getInstance()用来产生一个对象
                public static function getInstance($host,$username,$password,$dbname){
    
      //静态方法
                        if(self::$myself === ""){
    
           //静态属性myself为空,>建一个对象
                                $ob = new self($host,$username,$password,$dbname);      //实例化getInstance()自己
                                self::$myself = $ob;    //调用自己类Mysql的静态>属性$myself,静态属性的调用要用$.
                                return $ob;
                        }else{
    
      //静态属性不为空,直接返回用来以创建的对象
                                return self::$myself;
                        }
                }

                //防止对象被克隆,如果是public __clone,只要有clone(实例对象),>就会自动执行下面大括号的代码
                private function __clone(){
    
        //protected或private,这样执行clone(实例对象)就会报错。
                        echo "已克隆";
                }

                //数据库语句
                function query($sql){
    
    
                        if(preg_match('/^select/i',$sql)){
    
    
                                $result = mysqli_query($this->link,$sql);
                                if($result){
    
    
                                        return mysqli_fetch_all($result,MYSQLI_ASSOC);
                                }else{
    
    
                                        return mysqli_fetch_all($result,MYSQLI_ASSOC);
                                        return false;
                                }

                        }elseif(peeg_match('/^insert/i',$sql)){
    
    
                                $result = mysqli_query($this->link,$sql);
                                $id = mysqli_insert_id($this->link);
                                return $id;
                        }else{
    
    
                                $result = mysqli_query($this->link,$sql);
                                return $result;
                        }
                }
                
                //析构方法,当类对象被销毁时,该析构方法会自动执行,不用调用,只>能是Public
                function __destruct(){
    
    
                        echo "运行结束";
                        return mysqli_close($this->link);
                }
        }
?>

实例对象:

<?php
        require("./fangfa_class.php");

        //实例化参数为getInstance方法的参数,getInstance是静态方法,直接用Mysql::getInstance()调用
        $ob = Mysql::getInstance('localhost','jsj18137','123456','jsj18137');
        $ob1 = Mysql::getInstance('localhost','jsj18137','123456','jsj18137');

        var_dump($ob);
        echo "<hr/>";
        var_dump($ob1);
        echo "<hr/>";
//      $ob2 = clone($ob);    //克隆ob对象
//      var_dump($ob2);

        //当运行到这里,程序关闭后,该类的析构方法会自动调用。用inset($ob),销毁
实例对象时也会自动调用析构方法
?>

图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45703155/article/details/107701420