博客列表 >魔术方法/方法重载/数据库连接调用_1008

魔术方法/方法重载/数据库连接调用_1008

Jet的博客
Jet的博客原创
2019年10月10日 16:08:19605浏览

1 实例演示四个属性重载的魔术方法的使用方式

实例

<?php
// 实例演示四个属性重载的魔术方法的使用方式
// __get(),__set(),__isset(),__unset()

class Demo1
{
    private $name;
    private $salary;
    protected $secret = '猪哥和朱老师不能说的秘密';

    public function __construct($name,$salary)
    {
        $this->name     = $name;
        $this->salary   = $salary;
    }

    //属性重载方法
    //__get():重载了用户对属性的方法,读操作;
    public function __get($name){
        //访问secret属性
        if($name === 'secret'){
            //如果name是admin,返回secret,如果不是返回无权查看
            return ($this->name === 'admin' ) ? $this->$name : '无权查看';
        }
        return $this->$name;
    }

    //__set($name,$value):写操作
    public function __set($name,$value)
    {
        //重写工资
        if($name === 'salary')
        {
            return ($this->name === 'admin' ) ? $this->$name = $value : '没权限加工资哦' ;
        }
        return $this->$name = $value;
    }

    //__isset($name):检测是否存在这个属性(受保护、私有)
    public function __isset($name)
    {
        return isset($this->$name);
    }

    //__unset($name):销毁受保护、私有属性
    public function __unset($name)
    {
        unset($this->$name);
    }

}

$obj = new Demo1('猪哥',66666);
echo $obj->secret;
echo '<br />';
$obj->salary = 99999;
echo '工资:' . $obj->salary;

echo '<hr>';
echo isset($obj->salary) ? '存在' : '不存在' ;

echo '<hr>';
unset($obj->secret);
echo isset($obj->secret) ? '存在' : '不存在' ;


?>

运行实例 »

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





2 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式

实例

<?php
namespace _1008;

// call_user_func          回调
// call_user_func_array    数组回调

function sum($a,$b)
{
    return "{$a}+{$b}=" . ($a+$b);
}

echo call_user_func(__NAMESPACE__ . '\sum', 11,22);
echo '<br />';
echo call_user_func_array(__NAMESPACE__ . '\sum', [22,33]);
echo '<hr>';


// 类中调用

class Demo1
{
    public function sum($a, $b)
    {
        return "{$a}+{$b}=" . ($a+$b);
    }
}

$obj=new Demo1();
//对象中的方法以回调方式调用
echo call_user_func_array([$obj,'sum'],[33,44]);
echo '<br />';
//call_user_func_array ( [ 对象,方法 ],[数组])
echo call_user_func_array([new Demo1(),'sum'],[44,44]);
echo '<hr>';



//静态调用
class Demo2
{
    public static function sum($a, $b)
    {
        return "{$a}+{$b}=" . ($a+$b);
    }
}

echo call_user_func_array( __NAMESPACE__ . '\Demo2::sum',[25,55]);
echo '<br />';
// ::class,返回一个带有命名空间的类名称
echo call_user_func_array([Demo2::class, 'sum'],[99,22]);
echo '<hr>';

运行实例 »

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




3 实例演示方法重载的实现原理与参数获取方式

05.jpg

实例

<?php

class Demo3
{
    //__call():访问一个不存在或无权限访问的方法,会自动调用
    public function __call($name,$args)
    {
        return '方法是:' . $name . '<br />参数列表:<pre>' . print_r($args,true);
    } 

    //__callStatic():访问一个不存在或无权限访问的静态方法,会自动调用
    public static function __callStatic($name,$args)
    {
        return '方法是:' . $name . '<br />参数列表:<pre>' . print_r($args,true);
    }     
}
$obj = new Demo3();
echo $obj->getInfo1(1,2,3);
echo '<br />';
echo Demo3::getInfo2('html','css','js');

运行实例 »

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




4 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)

运行结果截图:

07.jpg

Demo3.php文件

实例

<?php
require 'query.php';

class DB
{
    //设置对象
    protected static $pdo = null;

    //数据库的链接方法
    public static function connection()
    {
        self::$pdo = new PDO('mysql:host=localhost;dbname=staff','root','root');
    }

    public static function __callStatic($name, $arguments)
    {
        //连接数据库
        self::connection();
        //实例化查询类,将连接对象作为参数
        $query = new Query(self::$pdo);
        //调用查询对象$query中的对应的方法
        return call_user_func_array([$query,$name],$arguments);
    }
}

$staffs = DB::table('staff')
    ->field('staff_id,name,position,mobile')
    ->where('staff_id>2')
    ->limit(5)
    ->select();
//遍历
foreach($staffs as $staff){
    print_r($staff); echo '<br />';
}


?>

运行实例 »

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


query.php文件

实例

<?php
//数据库查询类
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;
    }

    //生成SQL语句
    public function select()
    {
        // select * FROM table WHERE *** LIMIT n;
        //拼装SQL语句
        $sql = 'SELECT '
            . $this->field  //字段列表
            . ' FROM '
            . $this->table  //数据表名
            . $this->where  //查询条件
            . $this->limit; //显示数量
        
        //预处理
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        // die($stmt->debugDumpParams());

        return $stmt->fetchALL(PDO::FETCH_ASSOC);
    }
}




?>

运行实例 »

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


小结:

1、四个魔术方法重载使用:可对受保护和私有属性进行操作

    __get():只读取操作

    __set():只重写操作

    __isset():判断是否存在某属性

    __unset():销毁属性

2、call_user_func_array():数组回调,( [对象,方法] , [数组] )

3、方法重载方式:

    __call($name, $value)

    __callStatic($name, $value)

4、数据库链接调用

    4.1 首先写数据库链接文件,编写链式查询代码;

    4.2 引入数据库链接文件,编写DB操作类,用call_user_func_array()函数调用查询对象$query中的对应方法;

    4.3 组合查询语句,遍历出结果;

    4.4 注意编写细节,每个变量和SQL语句不要出错,多写多理解。


其中以下截图不注意的结果,引以为戒:06.jpg

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