博客列表 >属性重载,方法重载的使用-2019年10月8日

属性重载,方法重载的使用-2019年10月8日

思杰的博客
思杰的博客原创
2019年10月11日 01:20:52705浏览
  1. 实例演示四个属性重载的魔术方法的使用方式

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

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

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


课程笔记:

        如果我们在类中,将属性或者方法前面加上static关键字,那么他们就会变成静态啊属性和静态方法。静态属性和方法是属于类的,不属于动态生成的对象,所以我们如果想要调用静态属性或者方法,就直接用类名来调用即可。

        在类中,如果我们想要用当前对象的引用,就用$this代替。如果想要当前类的引用,就用self。

        常量就是固定值,不允许被重新赋值,也不允许被删除。常量前面不需要加$符。常量是没有作用域限制的,可以全局调用。

        同样的,类常量其实就是类当中的常量,定义方法是用const关键词去赋值。跟静态属性一样,类常量也是直接用类名来调用。跟静态属性的区别在于,静态属性可以修改,而类常量不能修改,静态属性不一定要初始化,但是类常量必须初始化。


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

        今天学了四个魔术方法,分别是__get(),__set(),__isset(),__unset()。魔术方法就是不需要用户自定义,通过系统自动调用的。当用户访问没有权限或者不存在的时候,那么就可用重载方法来访问这些属性。

实例

<?php
namespace _1008;

//属性重载

class Demo3{
    private  $name;
    private $salary;
    protected $secret = '其实猪哥和朱老师不是一个人';

    public function __construct($name,$salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }
    //__get()
    public function __get($name)
    {
        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('朱老师',6666);

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

?>

运行实例 »

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

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

1.png

实例

<?php
namespace _1008;

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

echo sum(22, 56);
echo '<br>';

//回调执行函数
echo call_user_func_array(__NAMESPACE__ . '\sum', [55, 69]);
echo '<br>';

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

$obj = new test1();

//回调执行对象
echo call_user_func_array([$obj, 'sum'], [23, 78]);
echo '<br>';
echo call_user_func_array([new Test1(), 'sum'], [221, 78]);

echo '<br>';

class test2
{
public static function sum($a, $b)
{
return "{$a} + {$b} =" . ($a + $b);
}
}
//回调执行类
echo call_user_func_array(__NAMESPACE__ . '\Test2::sum', [53, 64]);
echo '<br>';
echo call_user_func_array([Test2::class, 'sum'], [325, 234]);
?>

运行实例 »

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

2.png

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

用魔术方法__call()可以实现一个普通不存在的方法进行重定向去实现,相当于方法重载。

实例

<?php
namespace _1008;

class Demo5{
    public function __call($name, $arguments)
    {
        return '调用的方法名是:'.$name.'参数列表是'.print_r($arguments,true);
    }

}

$obj = new Demo5();
echo $obj->getInfo(10,20,30);

运行实例 »

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

3.png

实例演示数据库链接调用的实现原理与过程(静态方法重载__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($table){
        $this->table = $table;
        return $this;
    }
    //设置字段
    public function field($field = '*'){
        $this->field = empty($field)?'*':$field;
        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 = 'select '.$this->field.' from '.$this->table.$this->where.$this->limit;

        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }
}

首先我们做一个Query类,在该类中,我们把连接数据库需要的参数和方法都写进去,然后把初始化的函数写进去,当有不同的条件进去的时候,就把相应的类属性进行初始化,并且继续返回该对象,在下面写一个sql语句,把上面的条件进行拼接,并且连接数据库,返回相应的值,这样query类就完成了。


接下来是在实际的客户端中去调用。。

实例

<?php
namespace _1008;

//通过静态方法重载实现数据库链接调用。
require_once 'Query.php';
class DB{
    //连接对象
    protected static $pdo = null;
    //数据库链接
    public static function connection(){
        self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=huangsijie','root','root');
    }

    public static function __callStatic($name, $arguments)
    {
        //连接数据库
        self::connection();

        //实例化查询类
        $query = new Query(self::$pdo);
        return call_user_func_array([$query,$name],$arguments);
    }
}

$staffs = DB::table('staff')->field('staff_id,name,age')->where('staff_id >2')->limit(3)->select();
foreach ($staffs as $staff) {
    print_r($staff);echo '<br>';
}

运行实例 »

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

我们先声明一个DB类,DB类复制连接数据库,然后用静态方法去重载query中的函数,如果当前类中没有相应的方法的话,那么就调用query类中的方法去实现。

至此我们就可以像框架那样用链式调用去写sql语句了。

4.png


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