PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > 演示属性重载的魔术方法,回调执行函数,对象,类,方法重载和数据库链接调用的原理和过程 补1008作业

演示属性重载的魔术方法,回调执行函数,对象,类,方法重载和数据库链接调用的原理和过程 补1008作业

月迎下弦的博客
月迎下弦的博客 原创
2019年10月15日 14:37:05 1170浏览

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>';
}

运行实例 »

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


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议