博客列表 >属性魔术方法/方法重载/数据库连接调用-2019-10-08作业

属性魔术方法/方法重载/数据库连接调用-2019-10-08作业

零度 的博客
零度 的博客原创
2019年10月11日 11:25:01774浏览

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

实例

<?php

namespace _1008;

// 属性重载
// __get(), __set(), __isset(), __unset()
class Demo3
{
    private $name;
    private $sex;
    protected $email='php.cn@qq.com';

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


    }

    // 属性重载的方法
    // 魔术方法: 不需要或不允许用户调用,由系统来调用
    // __get(): 重载了用户对属性的访问
    // __get()是读操作

    public function __get($name)
    {
        if ($name === 'email') {
            return ($this->name === 'admin') ? '查看到的email是:'.$this->$name :'您好用户:'.$this->name. ',无权查看email';
        }

        return  $this->$name;

    }

// __set()是改操作
    public function __set($name,$value)
    {

        $this->$name=$value;
    }
// __isset()是判断是否类中存在类中成员属性操作
    public function __isset($name)
    {

     return isset($this->$name);
    }
    // __unset()是删除类中成员属性操作
    public function __unset($name)
    {

       unset($this->$name);
    }

}

$obj = new Demo3('admi1n', '女');
//读
echo $obj->email.'<hr>';
//改
$obj->sex = '男';
echo $obj->sex.'<hr>';
//判断
echo isset($obj->name) ? '存在' : '没有';
echo '<hr>';
//删
unset ($obj->name);
echo $obj->name;

运行实例 »

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

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

实例

<?php
namespace _1008;
//函数中调用
function demo1($a,$b){

    return "{$a}+{$b}=".($a+$b);//    双引号才解析值,单引号解析变量

}
echo __NAMESPACE__.'<hr>';
echo call_user_func(__NAMESPACE__ . '\demo1', 11,22).'<br>';
echo call_user_func_array(__NAMESPACE__ . '\demo1', [22,33]).'<hr>';
//类中调用

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

$obj=new demo2();
//对象中的方法以回调方式调用
echo call_user_func_array([$obj,'sum'],[44,55]);
echo '<br />';
//call_user_func_array ( [ 对象名,对象方法 ],[数组形式传值])
echo call_user_func_array([new demo2(),'sum'],[55,66]);
echo '<hr>';
//静态调用
class Demo3
{
    public static function sum($a, $b)
    {
        return "{$a}+{$b}=" . ($a+$b);
    }
}

echo Demo3::class;// ::class,返回一个带有命名空间的类名称
echo '<br />';
echo call_user_func_array( __NAMESPACE__ . '\Demo3::sum',[77,88]);
echo '<br />';

echo call_user_func_array([Demo3::class, 'sum'],[98,99]);
echo '<hr>';

运行实例 »

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

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

实例

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019\10\11 0011
 * Time: 10:22
 */
class Demo1
{
    //__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 Demo1();
echo $obj->getTest('试试','试试就试试','真好玩');
echo '<br />';
echo Demo1::getName('零度','中国','年度最佳男优');

运行实例 »

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

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

代码运行效果图:

1.jpg

实例

<?php
namespace _1008;

include 'Query.php';

class DB
{
    // 连接对象
    protected static $pdo = null;

    // 数据库的连接方法
    public static function connection()
    {
        self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=ceshi','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('cates')
    ->field('cate_id,name,alias')
    ->where('cate_id > 1')
    ->limit(5)
    ->select();

// 遍历
foreach ($staffs as $staff) {
    print_r($staff); echo '<br>';
}

运行实例 »

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

$query中的查询方法代码

实例

<?php


namespace _1008;

// 数据库查询类
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;表示当前的对象Query
        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());  // 查看生成的sql

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

}

运行实例 »

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

总结:

  1. 属性重载的魔术方法比之前写的setname getname方法还有趣 __get可以重复使用查不同的不可见属性,之前写的getname方法只能写一个查一个(脑子有点乱,不知道老师能不能看明白这一句话)还有就是未定义的属性可以在类外直接定义读啊,改啊。

  2. 上个图吧:2.jpg

  3. 方法重载方式:__call($name, $value)非静态类用的, __callStatic($name, $value)静态类专用的 加个__call后面加个静态英文词就行了首字母要大写,作用与属性方法的__get读操作异同

  4. 数据库的暂时写不出还得看用心视频。。。



声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议
say hi2019-10-11 21:12:073楼
有Q或微信吗,请教个问题
say hi2019-10-11 21:10:322楼
不错不错啊
say hi2019-10-11 21:07:591楼
不错不错啊