Blogger Information
Blog 37
fans 0
comment 1
visits 29679
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
类常量,属性重载,方法重载,数据库连接及静态方法重载实现-2019-10-10
H先生
Original
832 people have browsed it

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

    __get($name):当获取未定义可不见属性时触发  读操作


QQ截图20191010141218.png




实例

<?php

namespace _10008;

class Demo3
{

    private $name;
    private $salary;
    protected $secret = '其实都一样';

    // 构造方法
    public function __construct($name ,$salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }

    // 属性重载的方法
    public function __get($name)
    {
        return $this->$name;
    }

}

$obj = new Demo3('毛老师',123);

echo $obj->name,'<br>';

?>

运行实例 »

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



  __set($name, $value):当给未定义可不见属性赋值时触发  写操作



111.png






实例

<?php

namespace _10008;

class Demo3
{

    private $name;
    private $salary;
    protected $secret = '其实都一样';

    // 构造方法
    public function __construct($name ,$salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }

    // 属性重载的方法
    // __get($name):当获取未定义可不见属性时触发  读操作
    // $name 是属性名
    public function __get($name)
    {
        return $this->$name;
    }

    // __set($name, $value):当给未定义可不见属性赋值时触发 写操作
    public function __set($name, $value)
    {
        $this->$name = $value;
    }


}

$obj = new Demo3('毛老师',123);

echo $obj->name,'<br>';

$obj->salary = '565';
echo $obj->salary;
echo '<hr>';


?>

运行实例 »

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



    __isset($name): 当检测未定义可不见属性时触发

QQ截图20191010143701.png




实例

<?php

namespace _10008;

class Demo3
{

    private $name;
    private $salary;
    protected $secret = '其实都一样';

    // 构造方法
    public function __construct($name ,$salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }

    // 属性重载的方法
    // __get($name):当获取未定义可不见属性时触发  读操作
    // $name 是属性名
    public function __get($name)
    {
        return $this->$name;
    }

    // __set($name, $value):当给未定义可不见属性赋值时触发 写操作
    public function __set($name, $value)
    {
        $this->$name = $value;
    }
    // __isset($name): 当检测未定义可不见属性时
    public function __isset($name)
    {
        return isset($this->$name);
    }
   


}

$obj = new Demo3('毛老师',123);

echo $obj->name,'<br>';

$obj->salary = '565';
echo $obj->salary;
echo '<hr>';

echo isset($obj->salary) ? '存在' : '没有';

?>

运行实例 »

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


    __unset($name): 当注销未定义可不见属性时触发


2223.png






实例

<?php

namespace _10008;

class Demo3
{

    private $name;
    private $salary;
    protected $secret = '其实都一样';

    // 构造方法
    public function __construct($name ,$salary)
    {
        $this->name = $name;
        $this->salary = $salary;
    }

    // 属性重载的方法
    // __get($name):当获取未定义可不见属性时触发  读操作
    // $name 是属性名
    public function __get($name)
    {
        return $this->$name;
    }

    // __set($name, $value):当给未定义可不见属性赋值时触发 写操作
    public function __set($name, $value)
    {
        $this->$name = $value;
    }
    // __isset($name): 当检测未定义可不见属性时
    public function __isset($name)
    {
        return isset($this->$name);
    }
    //__unset($name): 当注销未定义可不见属性时触发
    public function __unset($name)
    {
        unset($this->$name);
    }


}

$obj = new Demo3('毛老师',123);

echo $obj->name,'<br>';

$obj->salary = '565';
echo $obj->salary;
echo '<hr>';

echo isset($obj->salary) ? '存在' : '没有';
unset($obj->salary);
echo $obj->salary;


?>

运行实例 »

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




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


1.png





实例

<?php

namespace _1008;

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

// 正常函数调用
echo '正常函数调用: '.sum(20, 40);
echo '<hr>';

// 对象方式调用
class Test1
{
    public function sum($a,$b)
    {
//        return "$a + $b = " . ($a + $b);
        return $a . ' + ' . $b .' = ' . ($a + $b);
    }
}

// 对象方式静态调用
class Test2
{
    public static function sum($a,$b)
    {
//        return "$a + $b = " . ($a + $b);
        return $a . ' + ' . $b .' = ' . ($a + $b);
    }
}

//echo call_user_func('\_1008\sum',20,60);
// 以回调的方式执行该函数
echo '回调的方式执行该函数:'.call_user_func(__namespace__.'\sum',20,60);
echo '<hr>';
// 回调方式数组
echo '回调的方式执行该数组:'. call_user_func_array(__NAMESPACE__.'\sum',[8,99]);

echo '<hr>';
$obj = new Test1();
echo '回调的方式执行该对象:'. call_user_func_array([$obj, 'sum'],[20,53]);
echo '<hr>';
// ::class  ,返回一个带有命名空间的类名称
//echo '<hr>',Test1::class;
echo '回调的方式执行该类:'. call_user_func_array([Test2::class, 'sum'], [15,22]);



?>

运行实例 »

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



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




1.png






实例

<?php

class Demo4
{
    // __call(): 访问不存在/不可见对象方法时触发,有两个参数,第一个是方法名,第二个方法的参数
    public function __call($name, $args)
    {
        return '方法是:'. $name . '<br>参数列表:<pre>'.print_r($args,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 Demo4::getInfo2('html','css','js');


?>

运行实例 »

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



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





1.png






实例

<?php
namespace _1008;

// 查询数据库类
class Query
{
    // 1. 连接对象
    public $pao = null;

    // 2. 表名
    public $table;

    // 3. 字段 * 查询所有字段
    public $field = '*';

    // 4. 条件
    public $where;

    // 5. 数量
    public $limit;


    // 6.连接数据库,用构造方法
    public function __construct($pdo)
    {
        // 注:实例化时自动连接上数据库
        $this->pdo = $pdo;

    }
    // 7. 设置数据表名称
    public function table($tableName)
    {
        $this->table = $tableName;
        //注:返回当前实例,用来链式调用后面的其他方法
        return $this;
    }
    // 8. 设置数据库字段
    public function field($fields = '*')
    {
        $this->field = empty($fields) ? '*' : $fields;
        return $this;
    }
    // 9. 设置查询条件
    public function where($where = '')
    {
        $this->where = empty($where) ? $where : ' WHERE '.$where;
        return $this;
    }
    // 10. 设置显示数量
    public function limit($limit)
    {
        $this->limit = empty($limit) ? $limit : ' LIMIT '. $limit;
        return $this;
    }
    // 11. 生成sql语句
    public function select()
    {

       // SELECT * FROM table WHERE **** LIMIT n
        // 注:拼装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

<?php
namespace _1008;

require 'Query.php';
class DB
{
    // Q 1.1 链接对象
    protected static  $pdo = null;


    // 数据库的链接方法
    public static function connection()
    {
       self::$pdo = new \PDO('mysql:host=127.0.0.1;dbname=php','root' ,'root');
    }

    public static function __callStatic($name, $arguments)
    {
        // 连接 数据库
        self::connection();
        // 实例化查询类 ,连接对象作为参数
        $query = new Query(self::$pdo);
        return call_user_func_array([$query,$name],[$arguments[0]]);

    }
}


$staffs = DB::table(' staff')
    ->field(' staff_id,name,position,mobile')
    ->where('staff_id > 5')
    ->select();
foreach ($staffs as $staff){
    print_r($staff);echo '<br>';
}




?>

运行实例 »

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




















































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