Blogger Information
Blog 77
fans 0
comment 0
visits 55254
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
魔术方法/方法重载/数据库连接调用_1008
Jet的博客
Original
590 people have browsed it

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

Correction status:qualified

Teacher's comments:总结的很好
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post