Blogger Information
Blog 26
fans 1
comment 2
visits 21665
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
10月8日作业,实战属性重载,方法重载,回调方法函数!
星空的博客
Original
788 people have browsed it

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

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:迟来的作业,一步一步理解后把作业交上,希望老师多多谅解,,很多细节没有总结到位。希望老师批语

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