Blogger Information
Blog 27
fans 1
comment 0
visits 22501
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
属性重载,方法重载的使用-2019年10月8日
思杰的博客
Original
709 people have browsed it
  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


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