Blogger Information
Blog 18
fans 0
comment 0
visits 13352
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
属性重载魔术方法使用及回调函数的使用及方法重载的原理--2019-10-8
无聊了的博客
Original
675 people have browsed it

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

实例

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/10/8
 * Time: 23:17
 */

/*
 *10月8日作业
1. 实例演示四个属性重载的魔术方法的使用方式
2. 实例演示call_user_func_array()回调执行函数/对象/类的方法的流程与方式
3. 实例演示方法重载的实现原理与参数获取方式
4. 实例演示数据库链接调用的实现原理与过程(静态方法重载__callStatic实现)
 */

class Test
{
    private $name = 'test';

    function __get($name)
    {
        return $this->$name;
    }

    function __set($name, $value)
    {
        // TODO: Implement __set() method.
        return $this->$name = $value;
    }

    function __isset($name)
    {
        // TODO: Implement __isset() method.
        return isset($this->$name);
    }

    function __unset($name)
    {
        // TODO: Implement __unset() method.
        unset($this->$name);
    }
}

$obj = new Test();
echo $obj->name;
echo '<hr>';
$obj->name = '设置新值';
echo $obj->name;
echo '<hr>';
echo isset($obj->name) ? '存在' : '不存在';
echo '<hr>';
unset($obj->name);
echo @preg_match("/Undefined property/i",$obj->name) ? '存在' : "被注销";

运行实例 »

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

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

实例

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/10/8
 * Time: 23:50
 */
namespace _1008;

function sum($a,$b){
    return "{$a} + {$b} = " . ($a + $b);
}
echo "<p style='color: red'>1、回调执行函数的方式</p>";
echo call_user_func_array('\_1008\sum',[13,15]);

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

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

$obj = new Test();
echo "<p style='color: red'>2、回调执行对象\类的方法的方式</p>";
echo '(1)$obj 的方式<br>';
echo call_user_func_array([$obj,'sum'],[11,33]);
echo '<br>';
echo '(2)new 类的方式<br>';
echo call_user_func_array([new Test(),'sum'],[11,33]);
echo '<br>';
echo '(3)static 静态方法直接Test::class,类调用的方式<br>';
echo call_user_func_array([Test::class,'sumStatic'],[22,33]);

运行实例 »

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

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

实例

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/10/9
 * Time: 0:14
 */
class Test
{
    function __call($name, $arguments)
    {
        // TODO: Implement __call() method.
        return '方法为:'. $name . '<br>' . '参数为:<pre>' . print_r($arguments,true);
    }

    static function __callStatic($name, $arguments)
    {
        // TODO: Implement __callStatic() method.
        return '静态方法为:'. $name . '<br>' . '参数为:<pre>' . print_r($arguments,true);
    }
}

$obj = new Test();
echo $obj->getInfo(1,2,3);
echo '<br>';
echo Test::getInfo1(4,5,6);

运行实例 »

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

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

实例

<?php
// namespace _query;
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;
        return $this;
    }

    public function limit($limit = ''){
        $this->limit = empty($limit) ? '' : ' LIMIT ' .$limit;
        return $this;
    }

    public function select(){
        $smtp = $this->pdo->prepare("select " . $this->field . " from " . $this->table . $this->where . $this->limit);
        $smtp->execute();
        // die($smtp->debugDumpParams());
        return $smtp->fetchAll(\PDO::FETCH_ASSOC);
    }
}


class Db
{
    public static $pdo = null;
    public static function connect(){
        self::$pdo = new \PDO("mysql:host=127.0.0.1;dbname=test",'root','000000');
    }
    public static function __callStatic($name,$args){
        self::connect();
        $query = new Query(self::$pdo);
        return call_user_func_array([$query,$name],$args);
    }
}
$staffs =  Db::table('testinfo')
        ->field('id,name')
        ->where('id>22')
        ->limit(31)
        ->select();

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

运行实例 »

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


总结:

1、属性重载魔术方法__get\__set\__isset\__unset; 分别实现对不存在或不能访问的属性读取、赋值、判断是否存在、注销等操作

2、call_user_func_array() 该函数有2个参数,第一个为函数字符串,第二个为参数数组。在类中第一个参数也为数组模式传值,第一个为当前对象或者类,第二个为函数字符串

3、__call、__callStatic 分别实现对不存在、无法调用的方法、静态方法调用。分别存在2个参数,第一个均为调用方法,第二个为参数数组

4、数据库链式调用,分别在定义的方法直接返回当前对象利用对象继续调用定义的方法。

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