介面(抽象類)與後期靜態繫結學習

宋霸霸發表於2024-07-10
<?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));

?>

  

相關文章