博客列表 >10月8日作业,实战属性重载,方法重载,回调方法函数!

10月8日作业,实战属性重载,方法重载,回调方法函数!

星空的博客
星空的博客原创
2019年10月13日 17:52:39787浏览

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

1.__get($name)方法:当外部访问一个不存在或者无限性的属性时候自动调用

2.__set($name, $value)方法

3.__isset($name)测试属性存不存在调用;

4.__unset($name);删除一个方法;

下面Demo3类中四个方法同时展示

实例

<?php
namespace _1008;
//对象属性的重载技术
class Demo3
{
private $name;
private  $salary;
protected $secret='我***只有100元';

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

    //属性重载的方法,当外部访问一个不存在或者无限性的属性时候自动调用
    public  function __get($name)
    {
        return $this->$name;
    }
    //写操作方法————set
    public function __set($name, $value)
    {
        if ($name === 'salary') {
            return $this->name === 'admin' ? $this->$name = $value : '无权更新工资';
        }
        return $this->$name = $value;
    }
    //isset测试属性存不存在使用
    public  function __isset($name)
    {
        return isset($this->$name);
    }
    //删除方法__unset()
    public  function __unset($name)
    {
        unset($this->$name);
    }
}
$obj = new Demo3('admin', 6666);

echo $obj->name;

运行实例 »

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

二、echo call_user_func(),echo call_user_func_array();以函数参数的方式,执行一个函数,以回调的方式执行函数。

实例

实例
//创建一个函数
function sum($a,$b)
{
    return"$a+$b=".($a+$b);
}
//使用echo call_user_func()方法
echo call_user_func(__NAMESPACE__.'\sum',130,66);
echo '<hr>';
//使用call_user_func_array()方法
echo call_user_func_array(__NAMESPACE__.'\sum',[500,600]);
echo '<hr>';
运行实例 »
点击 "运行实例" 按钮查看在线实例

实例

//创建一个类
class Test1
{
    function sum($a,$b)
    {
        return"$a+$b=".($a+$b);
    }
}
//实例化 new
$obj=new namespace\Test1();
//使用echo call_user_func()方法
echo call_user_func_array([$obj,'sum'],[800,700]);
echo '<hr>';
////使用call_user_func_array()方法
echo call_user_func_array([new Test1(),'sum'],[80,70]);
echo '<hr>';

运行实例 »

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

实例

//创建一个类,类里有一个静态方法
class Test2
{
    public static function sum($a,$b)
    {
        return"$a+$b=".($a+$b);
    }
}
//使用echo call_user_func()方法
echo call_user_func_array(__NAMESPACE__.'\Test2::sum',[66,88]);

echo '<br>';
//使用call_user_func_array()方法
echo call_user_func_array([Test2::class,'sum'],[96,808]);

运行实例 »

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


三、方法重载,1.__call, 2__callstatic;

实例

//创建一个类,使用__call(),__callstatic(),
class Demo4
{
    // 普通方法,重载 __call
    public function __call($name, $arguments)
    {
        return '方法是:'.$name.'<br>参数列表:<pre>'.print_r($arguments,true);
    }
    //静态方法,重载 __callstatic
    public static function __callStatic($name, $arguments)
    {
        return '方法是:'.$name.'<br>参数列表:<pre>'.print_r($arguments,true);
    }
}
echo '<hr>';
$obj=new Demo4();
echo $obj->getInfo1(10,20,30);

echo '<hr>';

echo Demo4::getInfo2('html','css','js');

运行实例 »

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

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

实例

<?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;
    }
//  设置字段查询方法
    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(){
        //拼接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);

}

}

运行实例 »

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

实例

<?php
namespace _1008;

require 'Query.php';

class DB
{
    protected  static $pdo=null;

    //数据库的链接方法
    public  static function connection()
    {
        //连接 ouyangke 数据库
       self::$pdo= new \PDO('mysql:host=127.0.0.1;dbname=ouyangke','root','root');
    }
    public static function __callStatic($name, $arguments)
    {
        //链接数据库
        self::connection();
        //实例化查询类
        $query=new Query(self::$pdo);
        //调用查询对象$query中的对应方法
       return call_user_func_array([$query,$name],$arguments);
    }
}
$mov=DB::table('movies')
->field('mov_id,name')
->limit(5)
->where('mov_id>2')
->select();
//遍历数据
foreach ($mov as $m){
    print_r($m);
    echo '<br>';
}

运行实例 »

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

最后执行结果:QQ截图20191013173430.png

总结:

        先创建一个类Query.php,创建一个query类,用于数据库的连接查询,设置对象属性;public $pdo=null;public $table;public $field='*';public $where;public $limit;,使用构造方法连接数据库,给对象属性设置方法以便调用,最后生成SQL语句, 加预处理!

     再创建一个demo5.php文档,把'Query.php'连接进来,建立了一个DB类,类里面设置静态方法connection()连接数据库,使用静态重载方法__callStatic,连接数控,在类中实例化Query.php中的query类,调用里面的查询方法。注意关键字'SELECT ' ' WHERE ' ' LIMIT '的前后空格,使用 die($stmt->debugDumpParams());查看生成的sql语句 SELECT mov_id,name FROM movies WHERE mov_id>2 LIMIT 5 在这里,我连接了 ‘ouyangke’数据库,然后查询为movies的数据表,根据查询条件 查询,表里的mov_id,name,按查询方法,我只要mov_id>2的条目,只需查询到的数据要前5条!

 ps:迟来的作业,一步一步理解后把作业交上,希望老师多多谅解,,很多细节没有总结到位。希望老师批语

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