博主信息
月迎下弦的博客
博文
20
粉絲
1
評論
2
訪問量
1636
積分:0
P豆:40
博文分類
HTML+CSS8篇
PHP真正的操作9篇
JavaScript2篇

演示屬性重載的魔術方法,回調執行函數,對象,類,方法重載和數據庫鏈接調用的原理和過程 補1008作業

2019年10月15日 14:37:05閱讀數:282博客 / 月迎下弦的博客 / PHP真正的操作

1.實例演示四個屬性重載的魔術方法的使用方式


s11.jpg


實例

<?php 
namespace _1014;
class Task1
{
    private $name;
    protected $Class;
    private $studentID;
    private $message;
    public function __construct($name,$Class,$studentID)
    {
         $this->name=$name;
         $this->Class=$Class;
      $this->studentID=$studentID;
    }
    // 屬性重載的方法
    // '__***'   魔術方法:不需要或不允許用戶調用,有系統來調用
    // __get():重載了用戶對屬性的訪問
    // __get()屬于讀操作
    public function __get($name)
    {
       if ($name/**當前屬性 */==='name'||$name==='Class'||$name==='studentID' ) {
           return ($this->name/**值 */==='Mr趙'||$this->name==='admin') ? $this->$name : '無權查看' ;
       }
       return $this->$name; //返回的是當前的屬性($name)
    }
        //__set(新值的屬性名$name,值$value)  屬于寫操作
    public function __set($name,$value)
    {
        if ($name==='Class') {
  
            return $this->name==='admin1' ? $this->$name=$value : $this->message='無權更改';

        }
        return $this-> $name=$value;//等價于$this->salary=99999  
    }
    public function __isset($name)     //__isset($name) 讀操作
    {
        return isset($this->$name);
    }
    public function __unset($name)
    {
        unset($this->$name);
    }
}
$obj = new Task1('Mr趙','三年二班','000001');
$obj1= new Task1('Miss趙','三年二班','000002');
$obj2= new Task1('admin','教師','1');
echo $obj->name.'-'.$obj->Class.'-'.$obj->studentID;
echo '<hr>';
echo $obj1->Class;
echo '<hr>';
$obj2->Class='校長';
echo $obj2->message;
echo '<br>';
echo $obj2->name.'-'.$obj2->Class.'-'.$obj2->studentID;
echo '<hr>';
echo isset($obj1->Class) ? '存在' : '不存在';
echo '<hr>';
unset ($obj1->name);
echo '<br>';
echo $obj1->name;

運行實例 ?

點擊 "運行實例" 按鈕查看在線實例



2. 實例演示call_user_func_array()回調執行函數/對象/類的方法的流程與方式  


call_fun_arrary.jpg


實例

<?php 
namespace _1014;
function sum($a,$b)
{
    return "{$a}+{$b}=" . ($a+$b);
}
echo     call_user_func_array (__NAMESPACE__ . '\sum' ,[10,11]);
echo    '<hr>';
//在類中
// call_user_func_array([對象,方法],[***,***])
class Task2_1
{
    public  function sum($a,$b)
    {
        return "{$a}+{$b}=" . ($a+$b);
    }
}
$obj = new /**namespace/ (可省略)*/Task2_1();
echo     \call_user_func_array([$obj,'sum'],[21,12]);
echo    '<hr>';
//靜態調用方法
class Task2_2
{
    public static function sum($a,$b)
    {
        return "{$a}+{$b}=" . ($a+$b);
    }
}
// ::class :返回一個帶有命名空間的類名稱
echo    \call_user_func_array([Task2_2::class,'sum'],[34,13]);

運行實例 ?

點擊 "運行實例" 按鈕查看在線實例




3. 實例演示方法重載的實現原理與參數獲取方式


方法重載.jpg


實例

<?php 
namespace _1014;
class Task3
{
        // __call():訪問一個不存在或無權限訪問的方法的時候會自動調用
    public function __call($name,$args)
    {
        return '方法是: '. $name. ', 參數列表: <pre>'. print_r($args, true);
    }
     // __callStatic():訪問一個不存在或無權限訪問的靜態方法的時候會自動調用
     public static function __callStatic($name,$args)
     {
        return '方法是: '. $name. ', 參數列表: <pre>'. print_r($args, true);
     }
}
echo (new Task3())->get(11,22,33);
echo    Task3:: staticGet(111,222,333);

運行實例 ?

點擊 "運行實例" 按鈕查看在線實例




4. 實例演示數據庫鏈接調用的實現原理與過程(靜態方法重載__callStatic實現)    


Query.jpg


實例

<?php 
namespace _1015;
class Query
{
    public $pdo = null ;  //連接對象
    public $table; //表名
    public $field = '*'; //字段
    public $where; //條件
    public $limit; //數量
    public function __construct($pdo)  // 構造方法
    {
       $this->pdo = $pdo; //實例化時自動連接數據庫
    }
    public function table($tableName)    // 設置數據表名稱
    {
        $this->table = $tableName; 
        return $this; //返回當前類實例, 用來鏈式調用后面的其它方法
    }
    public function field($fields = '*')// 設置數據表字段
    {
        $this->field = empty($fields) ? '*' : $fields;
        return $this;
    }
    public function where($where='')// 設置查詢條件
    {
        $this->where = empty($where) ? $where : ' WHERE ' . $where;
        return $this;
    }
    public function limit($limit)  // 設置顯示數量
    {
      $this->limit = empty($limit) ? $limit : ' LIMIT ' . $limit;
      return $this;
     }
     public function select()  // 生成SQL語句
     {
         $sql='SELECT ' // 拼裝SQL
                    .$this->field  // 字段列表
                    .' FROM '
                    .$this->table  //數據表
                    .$this->where //條件
                    .$this->limit; //顯示數量
           $stmt= $this ->pdo->prepare($sql);  // 預處理
                        $stmt->execute();
                        // die($stmt ->debugDumpParams(0)); //查看生成的sql
                        return $stmt->fetchALL(\PDO::FETCH_ASSOC);
     }
}

運行實例 ?

點擊 "運行實例" 按鈕查看在線實例



DB.jpg


實例

<?php 
namespace _1015;
require  'task4.php';
class DB
{
    protected static $pdo = null; // 連接對象
    public static function connection() // 數據庫的連接方法
    {
        self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=test' , 'root','root' );
    }
    public static function __callStatic($name,$arguments)
    {
        self::connection() ; // 連接數據庫
        $query = new Query(self::$pdo);  // 實例化查詢類,將連接對象做為參數
        return \call_user_func_array([$query,$name],$arguments);// 調用查詢對象$query中的對應的方法
    }
}
$task = DB::table ('task')
                ->field('task_id,name,position')
                ->where('task_id >2')
                ->limit(4)
                ->select();
foreach ($task as  $t) {
    \print_r($t);
    echo    '<br>';
}

運行實例 ?

點擊 "運行實例" 按鈕查看在線實例


批改狀態:合格

老師批語:盡管是把課堂代碼幾乎抄了一遍, 但是加上了自己解讀, 非常不錯的

全部評論

文明上網理性發言,請遵守新聞評論服務協議

條評論
暫無評論暫無評論!
  • 第十期線上培訓班 白小姐救世民彩图2019